Использование winhttp для подключения к многосетевому хосту при плохом первом ip

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

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, но это не так. что мне не хватает?

0 ответов

Другие вопросы по тегам