Re[2]: winsock & wininet
От: jones_kz  
Дата: 30.04.04 05:52
Оценка: 2 (1)
Здравствуйте, 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;
  }
  // запрос размера ответа, чтение ответа к


заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.