Comment puis-je essayer de lire les données du socket avec timeout? Je sais, select, pselect, poll, a un champ timeout, mais leur utilisation désactive "tcp fast-path" dans la pile tcp reno.
La seule idée que j'ai est d'utiliser recv (fd, ..., MSG_DONTWAIT) dans une boucle
Réponses:
Vous pouvez utiliser la fonction setsockopt pour définir un délai sur les opérations de réception:
Apparemment, sur Windows, cela devrait être fait avant d'appeler
bind
. J'ai vérifié par expérience que cela pouvait être fait avant ou aprèsbind
sous Linux et OS X.la source
struct timeval tv;
cela signifie-t-il que select () ne fonctionnera pas aussi? J'ai essayé de porter mon code select () sur Windows et il expire immédiatement, il semble ignorer la valeur que je définis à timeval.Voici un code simple pour ajouter un délai à votre
recv
fonction en utilisantpoll
en C:la source
poll
attendra la réception d'au moins un octet ou timeout, alors que lors de l'appel de larecv
fonction, il attendra dessizeof(buf)
octets, provoquant un nouveau blocage si ce décompte n'est pas encore arrivé, mais cette fois sans délai.// fonctionne également après l'opération de liaison pour WINDOWS
la source
Installez un gestionnaire pour
SIGALRM
, puis utilisezalarm()
ouualarm()
avant un blocage normalrecv()
. Si l'alarme se déclenche, lerecv()
renverra une erreur avecerrno
la valeurEINTR
.la source
LINUX
LES FENÊTRES
REMARQUE : vous avez mis ce paramètre avant
bind()
l'appel de fonction pour une exécution correctela source