Je souhaite définir le délai d’expiration de la fonction connect mais le message d’erreur suivant s’affiche: “Opération en cours”
Mon code:
if ((he = gethostbyname(authdefhost)) == NULL) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot resolve %s: %s\n", authdefhost, hstrerror(h_errno)); return -1; } sin.sin_family = AF_INET; memcpy(&sin.sin_addr, he->h_addr_list[0], sizeof(struct in_addr)); if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot create client socket: %s\n", strerror(errno)); return -1; } if ((fcntl(sd, F_SETFL, O_NONBLOCK) < 0)) printf("error on setting socket flags."); if (connect(sd, (void *) & sin, sizeof(sin)) == -1) { snprintf(errbuf, CERRBUFSIZ - 1, "cannot connect to server %s: %s\n", authdefhost, strerror(errno)); close(sd); return -1; } FD_ZERO(&fdset); FD_SET(sd, &fdset); int rv; if ((rv = select(sd + 1, NULL, &fdset, NULL, &tv)) == -1) { printf("error occurred on select function."); return -1; } else if (rv == 0) { printf("time out occurred."); return -1; } else { printf("connection established"); return sd; }
Lorsque vous appelez connect()
sur une socket non bloquante, vous obtiendrez EINPROGRESS
au lieu de bloquer l’attente de la fin de la connexion. Ensuite, vous devez select()
pour l’inscription et vérifier l’erreur de socket pour voir si la connexion est établie.
À partir de la page de manuel connect()
de Linux:
EINPROGRESS Le socket est non bloquant et la connexion ne peut pas être complétée immédiatement. Il est possible de sélectionner (2) ou de poll (2) à compléter par sélectionner le socket pour écrire. Après sélection (2) indique inscriptibilité, utilisez getsockopt (2) pour lire l’option SO_ERROR au niveau SOL_SOCKET pour déterminer si connect () s'est terminé avec succès (SO_ERROR est nul) ou sans succès (SO_ERROR est l’un des types habituels codes d'erreur listés ici, expliquant la raison de l'échec).