Non blocage socket de connexion, sélectionnez() retourne toujours 1
J'ai ce segment de code qui est conçu pour se connecter à un serveur à l'aide d'une connexion de socket. Toutefois, si elle ne peut pas se connecter au serveur à l'intérieur d'un certain laps de temps, j'aimerais qu'il arrêter d'essayer. J'ai essayé de le faire avec ce socket non bloquante et sélectionnez la commande de sélection, mais est toujours retourner 1, indiquant que le serveur existe quand rien n'existe à l'adresse que j'ai donner. Des Idées?
SOCKET tcp_client( char *hname, char *sname ) {
fd_set fdset;
struct sockaddr_in peer;
SOCKET s;
FD_ZERO(&fdset);
//FD_SET(STDIN, &fdset);
FD_SET(s, &fdset);
errno=1;
struct timeval tv;
tv.tv_sec = 15;
set_address( hname, sname, &peer, "tcp" );
s = socket( AF_INET, SOCK_STREAM, 0 );
int n = 1;
fcntl(s, F_SETFL, O_NONBLOCK);
if ( !isvalidsock( s ) )
{
printf("Socket Call Failed: %s\n", strerror(errno));
return(0);
}
int x = 0;
int status = connect( s, ( struct sockaddr * )&peer, sizeof( peer ) );
if(status < 0) {
printf("Status: %i\n", status);
}
int retVal = select(s+1, &fdset, NULL, NULL, &tv);
printf("retVal: %i\n", retVal);
if (retVal == 1) {
int so_error;
socklen_t slen = sizeof so_error;
getsockopt(s, SOL_SOCKET, SO_ERROR, &so_error, &slen);
if (so_error == 0) {
printf("work\n");
x =1;
} else {
printf("fail\n");
x = 0;
}
} else {
printf("noSocks\n");
}
if (x ==0 )
{
printf("Connect Failed: %s\n", strerror(errno));
L("libOnexc: Connect to socket failed");
close(s);
return(0);
}
return s;
}
- Veuillez corriger votre mise en retrait. C'est horrible!!!
- Eh bien, je ne vais pas attendre sur plus d'attendre 15 secondes à l'aide de select() pour voir si il est connecté, mais le select est toujours le retour de ses connecté lors de ses pas.
Vous devez vous connecter pour publier un commentaire.
Un problème que je vois, c'est que vous vous en tenez s dans le fdset avant d'avoir créé le socket. Vous devez faire la
après la création de la socket, car s est juste un entier et ne sera donc pas le droit de la valeur jusqu'à ce que après l'appel à la socket().
MODIFIER
Comme ceci:
fcntl(s, F_SETFL, O_NONBLOCK);
est incorrect. Vous remplacer d'autres indicateurs peuvent être définis. Voir aussi Comment puis-je modifier TCP socket non bloquant?Vous avez besoin de vérifier si la prise est prêt pour l'écriture (la deuxième
fd_set *
argument pour sélectionner), de ne pas le lire (le premier).