TCP Connect-Fehler 115 Operation in Progress Was ist die Ursache?

8

Meine Anwendung erstellt eine TCP-Verbindung. Dies funktioniert normalerweise. Aber in einem Netzwerkserver hat viele IP sagen

  • 174.X.X.X
  • 54.x.x.x wie das

Beim Aufruf von TCP connect (Nicht blockierend mit Timeout von 60 Sekunden) zu IP 174.X.X.X ist immer erfolgreich. Aber TCP connect zu demselben Server mit ip 54.x.x.x scheitert (meistens) mit errno 115 Messvorgang läuft.

Kannst du mir bitte erklären, was der mögliche Grund für errno 115 ist

Betriebssystem: Linux

Mein TCP conenct Code ist wie folgt

%Vor%     
user1340512 18.04.2012, 06:39
quelle

2 Antworten

14

Basierend auf Ihren Informationen:

  • Sie versuchen, eine connect() zu 54.x.x.x zu erstellen.
  • Der Socket ist non-blocking
  • Verbindungstimeout ist 60 sec

Zuerst sehen Sie, wenn Sie in Ihr /usr/include/asm-generic/errno.h schauen, folgendes:

%Vor%

Dies bedeutet, dass ein bestehender Vorgang am Socket ausgeführt wird. Da du gesagt hast, dass du einen connect() -Aufruf machst, lass uns ein man connect :

%Vor%

Die beste Schätzung wäre also, dass der TCP-3-Wege-Handshake (Ihr connect() -Aufruf an 54.x.x.x IP-Adresse) länger dauert als erwartet. Da die Operation connect() bereits ausgeführt wird, führt jede nachfolgende Operation für den Socket zu EINPROGRESS error code. Wie in der Manpage vorgeschlagen, versuchen Sie select() oder poll() zu verwenden, um zu überprüfen, ob Ihr Socket bereit ist zu verwenden (um read() oder write() Aufrufe auszuführen).

Sie können genau festlegen, was Ihren TCP-Handshake verhindert, indem Sie den Datenverkehr von / zu Ihrem eigenen Computer und 54.x.x.x erfassen und analysieren. Das beste Werkzeug, um Ihnen dabei zu helfen, heißt WireShark . Viel Glück.

    
gsbabil 18.04.2012 07:23
quelle
4

Dies scheint das Verhalten von connect () zu sein:

  

Wenn die Verbindung nicht sofort hergestellt werden kann und O_NONBLOCK ist   set für den Dateideskriptor für den Socket, sollte connect () fehlschlagen und   Setze errno auf [EINPROGRESS], aber die Verbindungsanfrage darf nicht sein   abgebrochen, und die Verbindung muss asynchron hergestellt werden.   Nachfolgende Aufrufe von connect () für denselben Socket vor dem   Verbindung wird hergestellt, soll fehlschlagen und errno auf [EALREADY] setzen.

    
Anders Lindahl 18.04.2012 06:48
quelle