2017-08-07 9 views
1

En mode de diagnostic spécial, je teste une connexion Internet en effectuant une opération HTTP GET sur un serveur connu, attendu en permanence. Bien que cela soit normalement très rapide, cela peut être lent et/ou expirer après 15 secondes ou plus lorsque vous travaillez dans un emplacement distant ou lorsque la carte réseau de l'ordinateur est désactivée.Interruption de l'opération HTTP GET

Est-il possible de configurer le composant Indy pour pouvoir l'interrompre à la demande? Ou peut-être existe-t-il un meilleur moyen d'effectuer une opération de test HTTP GET? Mon code est ci-dessous que je pourrais appeler avec HasInternet(http://master11.teamviewer.com/);

function HasInternet(strTestWebServer: String) : Boolean; 
var 
    idHTTP: TIdHTTP; 
begin 
    // Test an internet connection to the named server 
    Result := False; 
    idHTTP := TIdHTTP.Create(nil); 
    if (idHTTP <> nil) then 
     begin 
     try 
      try 
       // Handle redirects in response from HTTP server. Not required for some servers, 
       // but can confirm a connection to servers that redirect to https. 
       idHTTP.HandleRedirects := True; 

       // Add in the HTTP protocol header (if required) and retrieve the HTTP resource 
       // Note: HTTP_PROTOCOL = 'http://'; 
       if (AnsiPos(HTTP_PROTOCOL, strTestWebServer) > 0) then 
        Result := (idHTTP.Get(strTestWebServer) <> '') 
       else 
        Result := (idHTTP.Get(HTTP_PROTOCOL + strTestWebServer) <> ''); 
      except 
       // HTTP protocol errors are sometimes returned by servers, with the status code 
       // saved in TIdHTTP.ResponseCode. Common responses include: 
       // * 403 Forbidden (request was valid, but server is refusing to respond to it) 
       // * 404 Not Found (requested resource could not be found) 
       // * 405 Method Not Allowed (requested method not supported by that resource) 
       // These errors are counted as "valid connection to the internet possible" 
       on E: EIdHTTPProtocolException do 
        // Status code can be found in "E.ReplyErrorCode" or "idHTTP.ResponseCode" 
        Result := True; 
      else 
       // All other exceptions are counted as definite failures 
       Result := False; 
      end; 
     finally 
      idHTTP.Free(); 
     end; 
     end; 
end; 

Répondre

2

Vous pouvez interrompre une méthode en cours d'exécution TIdHTTP HTTP en appelant Disconnect à partir du contexte d'un fil différent de celui dans lequel la méthode a été exécutée. Avec votre conception, cela signifierait exposer l'objet TIdHTTP utilisé d'une manière ou d'une autre.

Mais pour votre tâche, vous pourriez donner par ex. le InternetCheckConnection fonctionne un essai. Par exemple pour Delphi 7, il pourrait être:

const 
    FLAG_ICC_FORCE_CONNECTION = $00000001; 

function InternetCheckConnectionA(lpszUrl: PAnsiChar; dwFlags: DWORD; dwReserved: DWORD): BOOL; stdcall; 
    external 'wininet.dll' name 'InternetCheckConnectionA'; 

function InternetCanConnect(const URL: AnsiString): Boolean; 
begin 
    Result := Boolean(InternetCheckConnectionA(PAnsiChar(URL), FLAG_ICC_FORCE_CONNECTION, 0)); 
end; 

function InternetNotConnected(const URL: AnsiString): Boolean; 
begin 
    Result := not Boolean(InternetCheckConnectionA(PAnsiChar(URL), 
    FLAG_ICC_FORCE_CONNECTION, 0)) and (GetLastError = ERROR_NOT_CONNECTED); 
end; 
+0

Merci! Je n'ai jamais entendu parler de la fonction Windows 'InternetCheckConnectionA'. Je viens de le tester. Lorsque les adaptateurs réseau ont été désactivés dans le Panneau de configuration, les deux méthodes expirent après 15 secondes ou plus. Mais dans des circonstances normales où l'adaptateur (s) sont actifs, cette méthode est beaucoup plus rapide. – AlainD

+0

Notez que la déconnexion d'un socket entre threads ne fonctionne pas toujours sur toutes les plates-formes. Et 'InternetCheckConnection()' est connu pour signaler des résultats inexacts. À tout le moins, vous pouvez définir les propriétés 'ConnectTimeout' et' ReadTimeout' de 'TIdHTTP', et/ou déclencher une exception dans ses événements' OnWork ... '. –

+0

En outre, l'exécution d'une paire requête/réponse HTTP complète est un peu exagérée lorsque vous êtes uniquement intéressé par la vérification de la connectivité Internet. Vous pouvez simplement utiliser 'TIdTCPClient' à la place et vous connecter à un port de serveur bien connu sans communiquer de données avec lui. –