Définition du délai d'attente pour la fonction recv
J'ai lu à partir de socket à l'aide de recv
fonction. J'ai un problème lorsque aucune donnée n'est disponible pour la lecture. Mon programme s'arrête juste. J'ai trouvé que je peux vous définissez le délai à l'aide de select
fonction. Mais il semble que le délai d'attente touche sélectionner la fonction elle-même et recv
qui va au bout de sélectionner attend toujours uncontinuously.
fd_set set;
struct timeval timeout;
FD_ZERO(&set); /* clear the set */
FD_SET(s, &set); /* add our file descriptor to the set */
timeout.tv_sec = SOCKET_READ_TIMEOUT_SEC;
timeout.tv_usec = 0;
int rv = select(s, &set, NULL, NULL, &timeout);
if((recv_size = recv(s , rx_tmp , bufSize ,0)) == SOCKET_ERROR)
{
...
}
Comment demander recv
fonction de retour après quelques timout?
source d'informationauteur vico
Vous devez vous connecter pour publier un commentaire.
Vous devez vérifier la valeur de retour de
select
.select
sera de retour0
en cas de délai d'attente expiré, de sorte que vous devriez vérifier pour les erreurs et de les appelerrecv
seulement siselect
retourné valeur positive:Une autre façon de définir un délai d'attente sur
recv()
lui-même sans l'aide deselect()
est d'utilisersetsockopt()
pour définir le socketSO_RCVTIMEO
option (sur les plates-formes qui prennent en charge).Sur Windows, le code ressemblera à ceci:
Sur d'autres plates-formes, le code devrait ressembler à ceci à la place:
utiliser le FD_ISSET() macro pour tester si il y a des données à lire. Si elle retourne false, ne faites pas le lire.
http://linux.die.net/man/3/fd_set