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;
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
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 ... '. –
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. –