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
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;
}
Sur la base de vos informations:
connect()
à 54.x.x.x
non-blocking
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.
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].