2010-05-17 3 views
1

J'ai développé une application serveur web Delphi (TWebModule). Il fonctionne comme une DLL ISAPI sur Apache sous Windows. À son tour, l'application effectue des appels https fréquents vers d'autres sites Web à l'aide du composant Indy TIdHTTP. Périodiquement j'obtiens cette erreur lors de l'utilisation de la méthode TIdHTTP.get:Obtention d'une erreur Indy "Impossible de lier la socket L'adresse et le port sont déjà utilisés"

Impossible de lier le socket. 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 sur la méthode reusesocket, qui peut être mis sur les deux objets TIdHttp et TIdSSLLIOHandlerSocketOpenSSL. Va-t-on régler cela sur rsTrue pour résoudre mes problèmes? Je demande parce que je n'ai pas été en mesure de reproduire cette erreur, cela arrive juste périodiquement.

Autres considérations:

  • Je sais que plusieurs instances de TWebModule sont pondus.
  • Est-ce que l'encapsulation de tous les appels à TIdHttp.get dans un TCriticalSection résoudrait le problème?

MISE À JOUR: Après avoir fait plus des recherches sur Internet, je suis tombé sur ceci: link text

Quand je fais une netstat -n moi aussi obtenir un tas d'entrées avec le statut « CLOSE_WAIT ».

Répondre

2

J'ai finalement compris cela. Il s'avère que je ne libérais pas l'objet TIDHttp. Dans mon exemple de prototype, il montre que c'est. 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. Donc, il n'a jamais été appelé.

1

Essayez d'attribuer un numéro de port élevé. Accrocher des ports bas (0.1023) nécessite des droits d'administrateur IIRC.

Oubliez ça, mon mauvais. tidhttp est le client, pas le serveur.

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

Une section cryptographique fonctionnerait, mais sérialiserait efficacement le résultat. Si c'est un problème, utilisez un pool de clients tidhttp.

+0

Vous voulez dire utiliser un port statique sur le composant idhttp? Y at-il une chance qu'une autre fonction se produise sur le serveur qui pourrait provoquer un conflit sur ce port? –

+0

OK - Je vais essayer. Donc, si je comprends bien, les appels simultanés avec le TIdHttp sur le même port ne sont pas autorisés. Il ne peut y avoir qu'un seul appel à la fois. Ce qui me rend perplexe, c'est qu'une fois que cette erreur se produit, elle se poursuit pour tous les appels suivants (même si je suis tout à fait sûr qu'ils ne se produisent pas simultanément avec d'autres appels). C'est comme si une fois il se casse une fois qu'il est cassé pour de bon. –

+0

Question: Dois-je créer ma propre "gestion" pour le pool de clients tidhttp? –

Questions connexes