125 votes

Linux: est-il lire ou recv de socket par timeout?

Comment puis-je essayer de lire les données de prise par timeout? Je sais, de sélectionner, de pselect, sondage, a un délai d'attente de champ, mais à l'aide de leur désactive l'option "tcp fast-path" dans tcp reno pile.

La seule idée que j'ai est d'utiliser recv(fd, ..., MSG_DONTWAIT) dans une boucle

230voto

Robert S. Barnes Points 17244

Vous pouvez utiliser le setsockopt fonction pour définir un délai d'expiration sur les opérations de réception:

SO_RCVTIMEO

Définit la valeur de délai d'expiration qui spécifie la durée maximale d'une entrée la fonction attend jusqu'à la fin. Il accepte une structure timeval avec l' nombre de secondes et microsecondes la spécification de la limite sur combien de temps d'attente pour une opération d'entrée à complète. Si une opération de réception a bloqué pendant autant de temps sans la réception de données supplémentaires, il est de retour avec un partiel de nombre ou de errno réglé sur [EAGAIN] ou [EWOULDBLOCK] si non les données sont reçues. La valeur par défaut pour cette l'option est égale à zéro, ce qui indique qu'un opération de réception ne doit pas le temps. Cette option prend une structure timeval. Notez que toutes les implémentations permettre cette option pour être ensemble.

struct timeval tv;

tv.tv_sec = 30;  /* 30 Secs Timeout */
tv.tv_usec = 0;  // Not init'ing this can cause strange errors

setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));

1voto

caf Points 114951

Installer un gestionnaire pour SIGALRM, puis utilisez alarm() ou ualarm() avant régulière de blocage recv(). Si l'alarme se déclenche, l' recv() retournera un message d'erreur avec errno ensemble de EINTR.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X