использование winhttp для подключения к многосетевому хосту при плохом первом ip - PullRequest
2 голосов
/ 04 августа 2010

я пытаюсь подтвердить, что описанная здесь функция:

http://msdn.microsoft.com/en-us/library/aa384066(VS.85).aspx

WINHTTP_OPTION_CONNECT_RETRIES Устанавливает или извлекает целое число без знака значение, которое содержит количество раз WinHTTP пытается подключиться к хост. HTTP-сервисы Microsoft Windows (WinHTTP) только попытки один раз за Интернет-протокол (IP) адрес. За Например, если вы пытаетесь подключиться к многосетевой хост с 10 IP адреса и WINHTTP_OPTION_CONNECT_RETRIES установлен до 7, то WinHTTP только пытается подключиться к первым семи IP-адресам. Учитывая тот же набор из 10 IP-адресов, если WINHTTP_OPTION_CONNECT_RETRIES установить 20, WinHTTP пытается каждый из 10 только один раз. Если соединение попытка все еще терпит неудачу после указанное количество попыток, или если истекло время ожидания подключения затем запрос отменяется. значение по умолчанию для WINHTTP_OPTION_CONNECT_RETRIES - пять попытки.

на самом деле работает.

мой код:

int main()
{   
  DWORD dwDownloaded = 0;
  LPSTR pszOutBuffer;
  BOOL  bResults = FALSE;
  HINTERNET  hSession = NULL, 
             hConnect = NULL,
             hRequest = NULL;

  // Use WinHttpOpen to obtain a session handle.
  hSession = WinHttpOpen( L"WinHTTP Example/1.0",  
                          WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                          WINHTTP_NO_PROXY_NAME, 
                          WINHTTP_NO_PROXY_BYPASS, 0 );
    DWORD data;
    DWORD dwSize = sizeof(DWORD);
    if (hSession)
    {


        // Use WinHttpQueryOption to retrieve internet options.
        if (WinHttpQueryOption( hSession, 
                                WINHTTP_OPTION_CONNECT_RETRIES, 
                                &data, &dwSize))
        {
            printf("Connection Retries: %u \n\n",data);
        }
        else
        {
            printf( "Error %u in WinHttpQueryOption.\n", GetLastError());
        }        
    }
    else
    {
        printf("Error %u in WinHttpOpen.\n", GetLastError());
    }

dwSize = 0;

   // Specify an HTTP server.
  if( hSession )
    hConnect = WinHttpConnect( hSession, L"google.com",
                               INTERNET_DEFAULT_HTTP_PORT, 0 );

  // Create an HTTP request handle.
  if( hConnect )
    hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,
                                   NULL, WINHTTP_NO_REFERER, 
                                   NULL, 
                                   NULL );

  // Send a request.
  if( hRequest )
    bResults = WinHttpSendRequest( hRequest,
                                   WINHTTP_NO_ADDITIONAL_HEADERS, 0,
                                   WINHTTP_NO_REQUEST_DATA, 0, 
                                   0, 0 );


  // End the request.
  if( bResults )
    bResults = WinHttpReceiveResponse( hRequest, NULL );

  // Keep checking for data until there is nothing left.
  if( bResults )
  {
    do 
    {
      // Check for available data.
      dwSize = 0;
      if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) )
        printf( "Error %u in WinHttpQueryDataAvailable.\n",
                GetLastError( ) );

      // Allocate space for the buffer.
      pszOutBuffer = new char[dwSize+1];
      if( !pszOutBuffer )
      {
        printf( "Out of memory\n" );
        dwSize=0;
      }
      else
      {
        // Read the data.
        ZeroMemory( pszOutBuffer, dwSize+1 );

        if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, 
                              dwSize, &dwDownloaded ) )
          printf( "Error %u in WinHttpReadData.\n", GetLastError( ) );
        else
          printf( "%s", pszOutBuffer );

        // Free the memory allocated to the buffer.
        delete [] pszOutBuffer;
      }
    } while( dwSize > 0 );
  }


  // Report any errors.
  if( !bResults )
    printf( "Error %d has occurred.\n", GetLastError( ) );

  // Close any open handles.
  if( hRequest ) WinHttpCloseHandle( hRequest );
  if( hConnect ) WinHttpCloseHandle( hConnect );
  if( hSession ) WinHttpCloseHandle( hSession );

    getchar();

 return 0;
}

Один из способов проверить это - поместить его в файл C: \ WINDOWS \ system32 \ drivers \ etc \ hosts:

123.123.123.123 google.com

66.102.7.99 google.com

тип

ping google.com

(это должно провалиться) тогда

ipconfig /displaydns

и вы должны увидеть две записи DNS для google.com.

, как указано выше, значение по умолчанию равно 5, что означает, что он должен попробовать второй IP, но это не так. что мне не хватает?

...