2012-04-18 9 views
8

Meine Anwendung erstellt eine TCP-Verbindung. Dies funktioniert normalerweise. Aber in einem Netzwerk-Server viele IP sagenTCP Connect-Fehler 115 Vorgang läuft Was ist die Ursache?

  • 174.XXX
  • 54.xxx wie diese

Beim Aufruf TCP Verbindung (nicht mit Timeout von 60 Sekunden zu blockieren) IP hat 174.X.X.X ist immer Erfolg. Aber TCP-Verbindung zu demselben Server mit IP 54.x.x.x ist fehlgeschlagen (die meiste Zeit) mit errno 115 Messung läuft.

Können Sie mir bitte erklären, was die mögliche Ursache für errno OS

115: Linux

Code My TCP conenct wie unten ist

tcp_connect(......) 
{ 

    int iValOpt = 0; 
    int iLength= 0; 

    fcnt((int)(long)SockID,F_SETFL_O_NONBLOCK); 

    ret = connect (sockID,(struct sockaddr*)pstSockAdr,uiSockLen); 

    if (ret < 0) 
    { 

     if (errno == EINPROGRESS) 
     { 
       stTv.tv_sec = 60; 
       stTv.tv_usec = 0; 
       FD_ZERO(&write_fd); 
       FD_SET(sockID,&write_fd); 

       iLength = sizeof(int); 

       if (0 < select (sockID+1) , NULL,&write_fd,NULL,&stTv); 

       { 
         if(0 > getsockopt(sockID,SOL_SOCKET,SO_ERROR,(void*)(&iValOpt),&iLength)) 
         { 
           return -1 
         } 

         if (0 != iValOpt) 
         { 
           return -1; 
         } 


         return success; 
       } 

       else 
       { 
         return -1; 
       } 

     } 
     else 
     { 
       return -1; 
     } 
    } 

    return success; 

} 
+0

Was passiert, wenn Sie versuchen, ohne Ihre Anwendung auf die 54.x.x.x ip telnet? Gleiches Verhalten? –

+0

Nein, Manuelle Spachtel-Anwendung funktioniert gut – user1340512

+1

'Non-Blocking mit einem Timeout' ist ein Widerspruch in Bezug auf. – EJP

Antwort

4

Dies ist das Verhalten von connect() zu sein scheint :

Wenn die Verbindung nicht sofort hergestellt werden kann und O_NO NBLOCK ist für den Dateideskriptor für den Socket festgelegt, connect() soll fehlschlagen und Errno auf [EINPROGRESS] setzen, aber die Verbindungsanforderung darf nicht abgebrochen werden, und die Verbindung soll asynchron hergestellt werden. Nachfolgende Aufrufe von connect() für denselben Socket, bevor die -Verbindung hergestellt wird, müssen fehlschlagen und errno auf [EALREADY] setzen.

+0

Meine Anwendung ist SFTP, Benutzer erstellt viele verbinden mit dem gleichen Server mit dem gleichen Port 22 – user1340512

14

Basierend auf Ihrer Information:

  • Sie versuchen, eine connect()-54.x.x.x
  • Der Sockel zu tun ist, non-blocking
  • Verbindungs-Timeout ist 60 sec

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

#define EINPROGRESS  115  /* Operation now in progress */ 

Es bedeutet, dass ein bestehender Vorgang am Socket ausgeführt wird. Da sagen Sie, Sie connect() Anruf tun, können Sie ein man connect:

 
EINPROGRESS 

The socket is nonblocking and the connection cannot be completed 
immediately. It is possible to select(2) or poll(2) for completion by 
selecting the socket for writing. After select(2) indicates 
writability, use getsockopt(2) to read the SO_ERROR option at level 
SOL_SOCKET to determine whether connect() completed successfully 
(SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual 
error codes listed here, explaining the reason for the failure). 

So ist die beste Vermutung wäre, dass der TCP-3-Wege-Handshake (Ihre connect() Aufruf an 54.x.x.x IP-Adresse) dauert länger als voraussichtlich abgeschlossen. Da die Operation connect() bereits ausgeführt wird, führt jede nachfolgende Operation am Socket zu EINPROGRESS Fehlercode. Wie in der Manpage empfohlen, versuchen Sie select() oder poll() zu verwenden, um zu überprüfen, ob Ihr Socket bereit ist (read() oder write() Aufrufe auszuführen).

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

TCP 3 way handshake

+0

Ich habe meinen Code oben hinzugefügt, können Sie bitte überprüfen, ist mögliche Fehler? der obige Code funktioniert gut in meinem netwrok, kann wegen meines Netzwerkes nicht block Fehler EINPROGRESS nie auftreten – user1340512

+0

@ user1340512: Versuchen Sie, saubere und vollständige Version des Codes, so dass man testen kann. – gsbabil

+0

Danke für deine Antwort, ich kann hier nicht den gesamten Code posten, aber ich habe nur den Code eingefügt, bei dem der Fehler zurückkommt. Der Code funktioniert gut in unserem Netzwerk (kann sein, weil in unserem Netzwerk kein blockierender Fehler passiert und immer Erfolg bedeutet). Ich muss wissen, ob EINPROGRESS errno gesetzt ist über Code funktioniert gut oder vor 60 s kann der abvoe-Code -1 – user1340512