Quand un UDP sendto() bloc?
Tout en utilisant la valeur par défaut (blocage) le comportement sur un socket UDP, dans lequel cas un appel à sendto() bloc? Je suis intéressé essentiellement dans le Linux comportement.
Pour TCP, je comprends que le contrôle de congestion rend le send() de blocage d'appel si la fenêtre d'envoi est complet, mais qu'en UDP? Est-il même bloc, parfois, ou simplement laisser les paquets se jeter à couches inférieures?
Vous devez vous connecter pour publier un commentaire.
Cela peut se produire si vous avez rempli votre prise de tampon, mais il est hautement dépend du système d'exploitation. Depuis UDP ne garantit en rien votre système d'exploitation peut décider de faire ce qu'il veut lors de votre prise de tampon est plein: bloquer ou supprimer. Vous pouvez essayer d'augmenter SO_SNDBUF pour le soulagement temporaire.
Cela peut s'appuient même sur le réglage de votre système, par exemple, il peut aussi dépendre de la taille de l'anneau TX dans le pilote de votre interface réseau. Il y a quelques discussions à ce sujet dans le iperf liste de diffusion, mais vous voulez vraiment discuter avec la développeurs de votre système d'exploitation. Portez une attention particulière à O_NONBLOCK et EAGAIN /EWOULDBLOCK.
SO_SNDBUF
pour socket UDP est la limite supérieure de paquets UDP (et doncsendto()
jamais blocs). Ou pensez-vous de ce qu'il dit est valable pour UNIX, mais pas Linux? Merci!Ce peut être parce que votre système d'exploitation tente d'effectuer une requête ARP pour obtenir l'adresse matérielle de l'hôte distant.
Fondamentalement, chaque fois qu'un paquet sort, l'en-tête requiert l'adresse IP de l'hôte distant et l'adresse MAC de l'hôte distant. 192.168.1.34 et AB:32:24:64:F3:21.
Votre "bloc" comportement pourrait être que l'ARP de travail.
J'ai entendu dans les anciennes versions de Windows (2k je pense), que le 1er paquet parfois se jeter si la demande est trop long et que vous envoyez trop de données. Un service pack probablement résolu depuis.