Здравствуйте, Michael Chelnokov, Вы писали:
MC>А почему она может быть невозможна? ip_addr_2:port_2 есть, какие проблемы?
спасибо за Ваш предыдущий ответ. если не затруднит, просветите пожалуйста неуча еще в паре вопросов.
1. правильно ли я понял, что значения ip_addr_2:port_2 имеют для клиента только информативный характер, без какого либо практического применения. т.е. шлюз сообщает о том, что он установил соединение по такому-то адресу-порту и в дальнейшем соединении клиента по HTTP протоколу эти параметры не пригодятся?
2. основная проблемма для меня заключается в стыковке интерфейсов winsocks и wininet. непонятно какие выходные даные от работы winsocks нужны для инициализации соединения средствами wininet и нужны ли вообще. какой тип соединения выполнять wininet'у после установки socks соединения.
для выполнения соединения по socks5 я применяю следующий код:
char *socks_proxy_ip = "192.168.0.1";
INTERNET_PORT socks_proxy_port = 1080;
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
if( WSAStartup(wVersionRequested, &wsaData) ){
return;
}
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if( INVALID_SOCKET == Socket ){
return;
}
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(socks_proxy_ip);
sin.sin_port = htons(socks_proxy_port);
if( connect(Socket, (SOCKADDR *)&sin, sizeof(sin)) ){
return;
}
// запрос метода аутентификации н
char buff_1[3] = {05, 01, 00}; // socks5, 1 октет, аутентификация не требуется
if( send(Socket, buff_1, 3, 0) == SOCKET_ERROR ){
return;
}
memset(buff_1, 0, 3);
if( recv(Socket, buff_1, 3, 0) == SOCKET_ERROR ){
return;
}
if(buff_1[1]){ // без аутентификации соединится не получилось
return;
}
// запрос метода аутентификации к
// запрос на установку соединения (CONNECT) н
// ip:port 212 154 140 67 80
char buff_2[10] = {05, 01, 00, 01, 0xD4, 0x9A, 0x8C, 0x43, 0x00, 0x50};
if( send(Socket, buff_2, 10, 0) == SOCKET_ERROR ){
return;
}
memset(buff_2, 0, 10);
if( recv(Socket, buff_2, 10, 0) == SOCKET_ERROR ){
return;
}
if(buff_2[1] != 0){ // проверка ответа сервера
return;
}
// запрос на установку соединения (CONNECT) к
int a = (unsigned char)(buff_2[4]);
int b = (unsigned char)(buff_2[5]);
int c = (unsigned char)(buff_2[6]);
int d = (unsigned char)(buff_2[7]);
char ip[17];
memset(ip, 0 , 17);
wsprintf(ip, "%lu.%lu.%lu.%lu", a, b, c, d); // определить IP
WORD p = MAKEWORD( // определить порт
(unsigned char)(buff_2[9]),
(unsigned char)(buff_2[8])
);
// инициализация wininet н
char *lpszAgent = "my_agent";
char proxy_and_port[64];
memset(proxy_and_port, 0, 64);
sprintf(proxy_and_port, "%s:%d", socks_proxy_ip, socks_proxy_port);
HINTERNET theSession = InternetOpen(
TEXT(lpszAgent),
INTERNET_OPEN_TYPE_PROXY,
TEXT(proxy_and_port),
TEXT("<local>"),
0
);
if(!theSession){
return EM_INET_INIT_FAILED;
}
// инициализация wininet к
// открыть HTTP сессию н
HINTERNET theConnection = InternetConnect(
theSession,
TEXT("212.154.140.67"),
INTERNET_DEFAULT_HTTP_PORT,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
NULL
);
if(!theConnection){
return EM_INET_CONNECTION_OPEN_FAILED;
}
// открыть HTTP сессию к
// создать HTTP запрос н
LPCTSTR AcceptTypes[2] = {TEXT("*/*"), NULL};
HINTERNET theRequest = HttpOpenRequest(
theConnection,
TEXT("POST"),
TEXT("page.asp"),
NULL,
NULL,
AcceptTypes,
INTERNET_FLAG_KEEP_CONNECTION,
NULL
);
if(!theRequest){
return EM_INET_REQUEST_OPEN_FAILED;
}
// создать HTTP запрос к
// отправить запрос н
LPTSTR lpszDefaultHeader = TEXT(
"Content-Type: application/x-www-form-urlencoded\r\n"
"Accept-Language:ru\r\n"
"Accept-Encoding:gzip, deflate\r\n"
);
char buf[128]; // дополнительные параметры для page.asp
memset(buf, 0, 128);
sprintf(
buf,
"Name=%s&PWD=%s&DLL=%s&list=%s",
"name",
"pass",
"ON",
"OFF"
);
bool bHttpSendRequest = HttpSendRequest(
theRequest,
lpszDefaultHeader,
-1L,
(LPVOID)buf,
sizeof(buf)
);
if(!bHttpSendRequest){
return EM_INET_REQUEST_SEND_FAILED;
}
// отправить запрос к
// запрос размера ответа, чтение ответа н
DWORD dwContentLen;
DWORD dwBufLen = sizeof(dwContentLen);
if( !http_query_info(&dwContentLen, &dwBufLen) ){
DWORD dwCL = getHttp_query_info_res();
switch(dwCL){
case 0:{
return EM_INET_INTERNAL_SERVER_ERROR;
}
default:{
return dwCL;
}
}
}
char* pData = new char[dwContentLen + 1];
DWORD dwBytesRead;
if( !inet_read_file(pData, dwContentLen, &dwBytesRead) ){
if(pData)
delete pData;
return EM_INET_RESPONSE_FAILED;
}
// запрос размера ответа, чтение ответа к
заранее спасибо.