2009-11-16 7 views
2

le client écrit 5 octets à la socket toutes les 1 seconde. le serveur lit en continu depuis le socket. le tampon à la fin du serveur est long de 10 octets. donc la fonction ressemble à cecicomportement de socket à la lecture

read(fd, buf, 10); 

le serveur lit 5 octets à chaque fois.

maintenant le client écrit continuellement 5 octets. le serveur est le même. le serveur lit 10 octets à chaque fois.

est donc que la lecture sur un socket renvoie autant d'octets que disponible dans le tampon. il n'attend pas pour remplir le tampon.

est-ce que cela a quelque chose à voir avec SO_RCVLOWAT. J'ai lu que cette option de socket n'a d'effet que dans select/poll io.

grâce

mise à jour:

i changé SO_RCVLOWAT à 10, il attend maintenant 10 octets au moins dans le tampon de réception. il semble donc que cela a quelque chose à voir avec la marque de basse mer du tampon de réception.

mais je ne peux pas mettre le filigrane bas à 0. il le règle toujours à 1 dans ce cas. pourquoi est-ce vrai?

Répondre

1

Le 10 je crois est en fait la longueur de la mémoire tampon, de sorte que la lecture lira jusqu'à 10 octets, mais pourrait ne pas tout avoir là-dedans ou il ne peut pas le remplir. Je crois qu'il retourne réellement le nombre d'octets écrits dans le tampon. Non, il n'attendra généralement pas jusqu'à ce que le tampon soit complet pour retourner.

1

Si vous n'avez pas défini d'E/S non bloquantes, l'appel read() attendra que tous les octets demandés soient disponibles ou qu'il y ait eu une erreur sur le socket. Si vous définissez des E/S non bloquantes, il n'y a aucune garantie que vous obtiendrez même 5 octets - vous pouvez obtenir une lecture avec 2 et une avec 6 - cela dépend de la synchronisation du système et du réseau.

+0

peut être quelques lectures avec 0 aussi :) –

1

Si vous souhaitez remplir le tampon de 10 octets, vous pouvez définir SO_RCVLOWAT sur 10 et cela devrait fonctionner correctement. Poll/select signalera une socket lisible même s'il n'y a pas SO_RCVLOWAT octets disponibles (au moins sur Linux)

Si vous avez l'intention d'utiliser votre socket avec poll/select, sachez qu'un appel read/recv/etc ... after poll/select peut bloquer jusqu'à ce que SO_RCVLOWAT nombre d'octets soient disponibles.

Questions connexes