2012-04-18 20 views
8

Mi aplicación crea una conexión TCP. Esto funciona normalmente. Pero en un servidor de red IP, es decir tiene muchosError de conexión TCP 115 Operación en progreso ¿Cuál es la causa?

  • 174.XXX
  • 54.xxx como esto

Cuando TCP llamar a connect (para no bloquear con tiempo de espera de 60 segundos) a IP 174.X.X.X es siempre exitoso. Pero la conexión TCP al mismo servidor con ip 54.x.x.x está fallando (la mayoría de las veces) con errno 115 operación de medición en curso. Linux

Mi código conenct TCP es la siguiente

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

¿Qué ocurre si se intenta telnet a la ip 54.x.x.x sin necesidad de utilizar su aplicación? ¿El mismo comportamiento? –

+0

no, la aplicación de masilla manual funciona bien – user1340512

+1

'No-bloqueo con un tiempo de espera' es una contradicción en los términos. – EJP

Respuesta

4

Este parece ser el comportamiento de connect():

¿Me lo son la posible razón de errno OS 115

explicar :

Si la conexión no se puede establecer de inmediato y O_NO NBLOCK es configurado para el descriptor de archivo del socket, connect() fallará y configurará errno en [EINPROGRESS], pero la solicitud de conexión no se cancelará en , y la conexión se establecerá de forma asíncrona. Las llamadas posteriores a connect() para el mismo socket, antes de que se establezca la conexión , fallarán y establecerán errno en [EALREADY].

+0

Mi aplicación es SFTP, el usuario crea muchas conexiones al mismo servidor con el mismo puerto 22 – user1340512

14

Sobre la base de su información:

  • Usted está tratando de hacer un connect() a 54.x.x.x
  • El zócalo es non-blocking
  • tiempo de espera de conexión es 60 sec

En primer lugar, si mira en tu /usr/include/asm-generic/errno.h verás lo siguiente:

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

Significa que una operación existente en el zócalo está en progreso. Puesto que, usted ha dicho que está haciendo una llamada connect(), vamos a hacer 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). 

Por lo tanto, la mejor conjetura sería que el TCP 3-way handshake (su connect() llamada a 54.x.x.x dirección IP) está tardando más de lo se espera que complete Como la operación connect() ya está en curso, cualquier operación posterior en el socket está dando como resultado el código de error EINPROGRESS. Como se sugiere en la página de manual, intente utilizar select() o poll() para verificar si su socket está listo para usar (para realizar llamadas read() o write()).

Puede identificar qué impide que su handshake TCP se complete al capturar y analizar el tráfico hacia/desde su propia máquina y 54.x.x.x. La mejor herramienta para ayudarlo con esto se llama WireShark. Buena suerte.

TCP 3 way handshake

+0

He agregado mi Código arriba, ¿puede comprobar si hay algún posible error? el código anterior funciona bien en mi netwrok, puede deberse a un error de red no bloqueante. EINPROGRESS nunca ocurre. – user1340512

+0

@ user1340512: Intente publicar una versión limpia y completa del código para poder realizar una prueba. – gsbabil

+0

Gracias por su respuesta, no puedo publicar todo el código aquí, pero pegué solo el código donde se devuelve el error. El código funciona bien en nuestra red (puede deberse a que en nuestra red no se produce ningún error de bloqueo y siempre es exitoso). Necesito saber si el EINPROGRESS errno set está por encima del código funciona bien o antes de 60 s el código abvoe puede devolver -1 – user1340512

Cuestiones relacionadas