Pourquoi le système code> RECV code> est-il simplement bloquer jusqu'à ce que toutes les données soient reçues? Chaque fois que j'ai vu un appel code> recv code>, c'est dans une boucle tandis que cela ne cesse de continuer à appeler recv code> jusqu'à ce que toutes les données soient là. Pourquoi pas seulement avoir
recv code> bloc en premier lieu? P>
3 Réponses :
Vous pouvez demander à ce bloc Recv jusqu'à ce que toutes les données soient reçues, avec le drapeau Quant à la raison pour laquelle c'est le cas par défaut, il y a quelques raisons qui me viennent à l'esprit: p>
Mais surtout, puisque vous devez être prêt à faire face à un tampon partiel de toute façon em>, il est bon de forcer les gens à y faire face par défaut, alors ils augmentent les bugs dans leur boucle - plutôt que de les faire rester cacher jusqu'à ce qu'un signal arrive à un moment malheureux. P> msg_waittall code>. Toutefois, si un signal arrive, un appel système qui a effectué certains travaux (c.-à-d. Une partie de la réception des données) ne peut pas être redémarré pour recevoir le reste. En tant que tel, même avec
msg_waitall code>, il existe des cas où l'appel RECV peut renvoyer avant que le tampon soit plein et que vous devez être prêt à gérer ces cas. Compte tenu de cela, beaucoup de gens choisissent simplement de boucler et de ne pas vous embêter avec des drapeaux peu connus tels que
msg_waitall code>. P>
telnet code>, qui était populaire à l'heure où la BSD Sockets API a été conçue. Vous recevrez généralement une poignée d'octets à la fois, il n'y a pas de champs de longueur vous indiquant la quantité de données à attendre, et de plus vous devez afficher ces données tout de suite em>. Il n'a pas de sens à bloquer tant que vous remplissez un tampon ici. De même avec les protocoles orientés en ligne tels que SMTP ou IMAP - vous ne savez pas combien de temps la commande est jusqu'à ce que vous ayez reçu tout cela. LI>
RECV code> est souvent utilisé pour les sockets de datagramme, où il reçoit un seul datagramme, même s'il est beaucoup plus petit que le tampon fourni. L'extension naturelle de streaming des prises est de revenir autant que possible sans attendre. Li>
ul>
Dans la plupart des cas, vous ne savez pas combien de données est "toutes les données". Par exemple, si vous recevez des données dans un protocole orienté ligne, une ligne peut être de 10 octets longue ou 65 octets longs. P>
Vous pouvez modifier des drapeaux de prise en blocage ou sans blocage. Votre cas spécifique n'a rien à voir avec le blocage ou ne pas bloquer. P>
Il ne ferait aucun sens de faire fonctionner une fonction de réseau de la manière dont vous décrivez par défaut - Et si le flux ne finit jamais .. Si le programme ne se termine jamais? Prima Facia, cela ne semble pas comme sain défaut em> comportement. P>
lire http://www.scottklement.com/rpg/socktt/nonblocking.html pour vous familiariser avec le blocage et l'IO non bloquantes. P>