Meine Anwendung erstellt eine TCP-Verbindung. Dies funktioniert normalerweise. Aber in einem Netzwerkserver hat viele IP sagen
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%Basierend auf Ihren Informationen:
connect()
zu 54.x.x.x
zu erstellen.
non-blocking
60 sec
Zuerst sehen Sie, wenn Sie in Ihr /usr/include/asm-generic/errno.h
schauen, folgendes:
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
:
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.
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.
Tags und Links c networking network-programming tcp errno