3 votes

Obtention de l'erreur Indy "Could not bind socket. L'adresse et le port sont déjà utilisés"

J'ai développé une application de serveur web Delphi (TWebModule). Elle fonctionne comme une DLL ISAPI sur Apache sous Windows. L'application effectue à son tour des appels https fréquents vers d'autres sites web en utilisant le composant Indy TIdHTTP. Périodiquement, j'obtiens cette erreur lorsque j'utilise la méthode TIdHTTP.get :

Impossible de lier le socket. L'adresse et le port sont déjà utilisés

Voici le code :

  IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
  IdHTTP := TIdHTTP.create(nil);

  idhttp.handleredirects := True;
  idhttp.OnRedirect := DoRedirect;
  with IdSSLIOHandlerSocket1 do begin
    SSLOptions.Method := sslvSSLv3;
    SSLOptions.Mode :=  sslmUnassigned;
    SSLOptions.VerifyMode := [];
    SSLOptions.VerifyDepth := 2;
  end;
  with IdHTTP do begin
    IOHandler := IdSSLIOHandlerSocket1;
    ProxyParams.BasicAuthentication := False;
    Request.UserAgent := 'Test Google Analytics Interface';
    Request.ContentType := 'text/html';
    request.connection := 'keep-alive';
    Request.Accept := 'text/html, */*';
  end;
  try
    idhttp.get('http://www.mysite.com......');
  except
    .......
  end;
  IdHTTP.free;
  IdSSLIOHandlerSocket1.free;

J'ai lu à propos de la reusesocket qui peut être définie à la fois sur les objets TIdHttp et TIdSSLLIOHandlerSocketOpenSSL. Le fait de définir cette méthode à rsTrue résoudra-t-il mes problèmes ? Je pose la question parce que je n'ai pas été en mesure de reproduire cette erreur, qui ne se produit que périodiquement.

Autres considérations :

  • Je sais que de multiples instances de TWebModule sont créées.
  • Le fait de placer tous les appels à TIdHttp.get dans une TCriticalSection résoudrait-il le problème ?

UPDATE : Après avoir fait plus de recherches sur Internet, je suis tombé sur ceci : texte du lien

Quand je fais un netstat -n Je reçois également un grand nombre d'entrées avec le statut "CLOSE_WAIT".

3voto

M Schenkel Points 2232

J'ai finalement trouvé la solution. Il s'avère que je ne libérais PAS l'objet TIDHttp. Dans mon exemple de prototype, il est indiqué que c'est le cas. Mais mon code source actuel utilise des objets et le code où l'objet idhttp est libéré est contenu dans un destructeur qui n'est pas correctement marqué avec override. Il n'a donc jamais été appelé.

1voto

Marco van de Voort Points 15378

Essayez d'allouer un numéro de port élevé. La connexion de ports bas (0..1023) nécessite des droits d'administrateur IIRC.

Oublie ça, ma faute. tidhttp est le client, pas le serveur.

Oui, il semble que plusieurs threads essaient d'utiliser le même tidhttp.

Une section crânienne fonctionnerait, mais sérialiserait effectivement le résultat. Si cela pose un problème, utilisez un pool de clients tidhttp.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X