2012-04-18 9 views
8

La mia applicazione crea una connessione TCP, funziona normalmente. Ma in un server di rete è dire molti IPErrore di connessione TCP 115 Funzionamento in corso Qual è la causa?

  • 174.XXX
  • 54.xxx come questo

Quando TCP chiama connect (non bloccante con timeout di 60 secondi) a IP 174.X.X.X è sempre successo. Ma il TCP si connette allo stesso server con IP 54.x.x.x non funziona (la maggior parte delle volte) con errno 115 operazione measn in corso.

Si può spiegare a me che cosa sono la ragione possibile per errno 115

SO: Linux

mio TCP codice Conenct è come sotto

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

Che cosa succede se si tenta di telnet al IP 54.x.x.x senza usare l'applicazione? Lo stesso comportamento? –

+0

no, l'applicazione di stucco manuale funziona bene – user1340512

+1

'Non bloccare con un timeout' è una contraddizione in termini. – EJP

risposta

4

Questo sembra essere il comportamento di connect() :

Se la connessione non può essere stabilita immediatamente e O_NO NBLOCK è impostato per il descrittore di file per il socket, connect() avrà esito negativo e impostare errno su [EINPROGRESS], ma la richiesta di connessione non sarà interrotta e la connessione deve essere stabilita in modo asincrono. Le chiamate successive a connect() per lo stesso socket, prima che venga stabilita la connessione , falliscono e impostano errno su [EALREADY].

+0

La mia applicazione è SFTP, l'utente crea molte connessioni allo stesso server con la stessa porta 22 – user1340512

14

Sulla base delle informazioni:

  • Si sta tentando di fare un connect()-54.x.x.x
  • La presa è non-blocking
  • Timeout connessione è 60 sec

In primo luogo, se si guarda nel tuo /usr/include/asm-generic/errno.h vedrai quanto segue:

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

Significa che è in corso un'operazione sulla presa. Dal momento che, lei ha detto che si sta facendo una chiamata connect(), consente di fare un 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). 

Quindi, l'ipotesi migliore sarebbe che il TCP 3-way handshake (il vostro connect() chiamata a 54.x.x.x indirizzo IP) sta prendendo più lungo dovrebbe essere completato Poiché l'operazione connect() è già in corso, qualsiasi operazione successiva sul socket si tradurrà nel codice di errore EINPROGRESS. Come suggerito nella pagina man, provare a utilizzare select() o poll() per verificare se il socket è pronto per l'uso (per eseguire chiamate read() o write()).

È possibile stabilire con precisione cosa impedisce il completamento dell'handshake TCP acquisendo e analizzando il traffico da/verso la propria macchina e 54.x.x.x. Lo strumento migliore per aiutarti con questo è chiamato WireShark. In bocca al lupo.

TCP 3 way handshake

+0

Ho aggiunto il mio codice sopra, per favore, controlla che ci siano eventuali errori? il codice sopra funziona bene nel mio netwrok, potrebbe essere a causa della mia rete errore non blocco EINPROGRESS non si verifica mai – user1340512

+0

@ user1340512: Prova a postare la versione pulita e completa del codice in modo che si possa testare. – gsbabil

+0

Grazie per la tua risposta, non posso pubblicare tutto il codice qui, ma ho incollato solo il codice in cui l'errore è di ritorno. Il codice funziona bene nella nostra rete (potrebbe essere perché nella nostra rete l'errore non-block non si verifica mai e conenct sempre successo). Ho bisogno di sapere se EINPROGRESS errno set è sopra il codice funziona bene o prima di 60 s il codice abvoe può restituire -1 – user1340512

Problemi correlati