Opération en cours d’erreur sur erreur de connexion (fonction)

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).