web-dev-qa-db-fra.com

TCP Erreur de connexion 115 Opération en cours Quelle est la cause?

Mon application crée une connexion TCP, cela fonctionne normalement. Mais dans un serveur réseau, il y a beaucoup d'adresses IP, par exemple

  • 174.X.X.X
  • 54.x.x.x comme ceci

Lors de l'appel de TCP connect (non bloquant avec timeout de 60 secondes) à IP 174.X.X.X est toujours un succès. Mais TCP connectez-vous au même serveur avec ip 54.x.x.x échoue (la plupart du temps) avec errno 115 mesure en cours.

Pouvez-vous s'il vous plaît m'expliquer quelles sont les raisons possibles de l'erreur 115

OS: Linux

Mon TCP code de conenct est comme ci-dessous

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;

}
15
user1340512

Sur la base de vos informations:

  • Vous essayez de faire une connect() à 54.x.x.x
  • La prise est non-blocking
  • Le délai de connexion est de 60 sec

Tout d'abord, si vous regardez dans votre /usr/include/asm-generic/errno.h, Vous verrez ce qui suit:

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

Cela signifie qu'une opération existante sur le socket est en cours. Depuis, vous avez dit que vous faites un appel à connect(), faisons un man connect :

 EINPROGRESS 
 
 La prise n'est pas bloquante et la connexion ne peut pas être établie 
 Immédiatement. Il est possible de sélectionner (2) ou d'interroger (2) pour terminer en sélectionnant 
 Le socket pour l'écriture. Une fois que select (2) indique une écriture en 
, Utilisez getsockopt (2) pour lire l'option SO_ERROR au niveau 
 SOL_SOCKET pour déterminer si connect () s'est terminée avec succès 
 (SO_ERROR est zéro) ou sans succès (SO_ERROR est l'un des codes d'erreur 
 habituels répertoriés ici, expliquant la raison de l'échec). 

Donc, la meilleure supposition serait que TCP Poignée de main à 3 voies (votre connect() appel à 54.x.x.x Adresse IP) prend plus de temps que prévu pour se terminer . Comme l'opération connect() est déjà en cours, toute opération ultérieure sur le socket entraîne le code d'erreur EINPROGRESS. Comme suggéré dans la page de manuel, essayez d'utiliser select() ou poll() pour vérifier si votre socket est prête à être utilisée (pour effectuer des appels read() ou write()).

Vous pouvez identifier ce qui empêche votre TCP prise de contact à terminer en capturant et en analysant le trafic vers/depuis votre propre machine et 54.x.x.x. Le meilleur outil pour vous aider avec cela s'appelle WireShark . Bonne chance.

TCP 3 way handshake

22
gsbabil

Cela semble être le comportement de connect () :

Si la connexion ne peut pas être établie immédiatement et O_NONBLOCK est défini pour le descripteur de fichier pour le socket, connect () doit échouer et définir errno sur [EINPROGRESS], mais la demande de connexion ne doit pas être abandonnée et la connexion doit être établie de manière asynchrone. Les appels suivants à connect () pour la même socket, avant que la connexion ne soit établie, échouent et définissent errno sur [EALREADY].

6
Anders Lindahl