read() n'est pas de blocage dans la prise de programmation
J'ai un serveur qui envoie des données à un client toutes les 5 secondes. Je veux que le client à bloquer sur read() jusqu'à ce que le serveur envoie des données, puis de l'imprimer. Je sais lire () est bloquant par défaut. Mon problème est que mon client n'est pas de blocage sur read(). C'est très bizarre, et cela ne semble pas être un numéro ordinaire.
Mon code imprime "Rien n'est venu de retour" dans une boucle infinie. Je suis sur une machine linux, programmation en c. Mon bout de code est ci-dessous. S'il vous plaît conseils.
while(1)
{
n = read(sockfd, recvline, MAXLINE);
if ( n > 0)
{
recvline[n] = 0;
if (fputs(recvline, stdout) == EOF)
printf("fputs error");
}
else if(n == 0)
printf("Nothing came back");
else if (n < 0)
printf("read error");
}
return;
Avez-vous vérifié que la connexion est ouverte (j'.e
Une valeur de retour 0 de
Guérir : Oui, c'est valable. J'ai un chèque pour que.
Eh bien, la chose est que le serveur envoie des données toutes les 5 secondes. À moins que le client attend pour le serveur d'envoyer, ce sera de 0 à chaque fois.
Non, il ne le pourra pas. Zéro signifie que le peer a fermé la connexion. Il ne signifie jamais il n'y a pas de données. Dans un mode de blocage read() bloquera; en mode sans blocage si il n'y a pas de données, il sera de retour -1 avec errno à EAGAIN ou EWOULDBLOCK en fonction de votre plate-forme.
sockfd
est valide)?Une valeur de retour 0 de
read()
signifie que l'autre extrémité (le serveur) fermé le socket.Guérir : Oui, c'est valable. J'ai un chèque pour que.
Eh bien, la chose est que le serveur envoie des données toutes les 5 secondes. À moins que le client attend pour le serveur d'envoyer, ce sera de 0 à chaque fois.
Non, il ne le pourra pas. Zéro signifie que le peer a fermé la connexion. Il ne signifie jamais il n'y a pas de données. Dans un mode de blocage read() bloquera; en mode sans blocage si il n'y a pas de données, il sera de retour -1 avec errno à EAGAIN ou EWOULDBLOCK en fonction de votre plate-forme.
OriginalL'auteur Mathew | 2012-10-07
Vous devez vous connecter pour publier un commentaire.
Il peut y avoir plusieurs cause et plusieurs exceptions sont possibles à différents endroit:
vérifier socket où vous créez:
Vous et aussi d'activer un mode de blocage explicitement avant de l'utiliser:
ou vous pouvez utiliser
socket
comme ci-dessous:Vérifier la Lecture de l'appel de fonction (en Raison de bug)
Aussi vérifier le code serveur!:
Une chose plus intéressante, Essayez de comprendre:
Mode de blocage par défaut: vous n'avez pas à définir explicitement. Le code en (2) qui appelle setsockopt() avec des arguments de &0 et sizeof(sockfd) est un non-sens complet et ne compilera pas. Downvote.
Je sais que le mode par défaut est le blocage. Je voulais juste dire comment définir explicitement un mode de blocage(ou réinitialiser l'appareil pour un mode de blocage). POUR l'ERREUR de COMPILATION: j'ai corrigé le code de setsock option() et Ma DEMANDE pour vous : veuillez vérifier et si ses toujours mal Merci de rectifier, de sorte que l'on peut obtenir de l'aide correct..Merci EJP!
Mathew : Pouvez-vous cliquer sur le droit, Si elle était acceptée!
Merci beaucoup pour votre aide!
OriginalL'auteur Grijesh Chauhan
Ce que Greg Hewgill déjà écrit un commentaire: EOF (qui est, explicite arrêt de l'écriture, soit par l'intermédiaire des
close()
ou viashutdown()
) sera communiquée au côté de réception en ayantrecv()
retour 0. Donc, si vous obtenez 0, vous savez qu'il n'y aura pas toutes les données et vous pouvez arrêter la lecture en boucle.Si vous avez eu de blocage non activé et il n'y a pas de données, vous obtiendrez
-1
eterrno
sera mis àEAGAIN
ouEWOULDBLOCK
.Pas le serveur, mais le serveur est "un socket client" peut-être...
OriginalL'auteur glglgl
Quelle est la valeur de MAXLINE?
Si la valeur est 0, alors il sera de retour 0.
Sinon, comme Grijesh Chauhan mentionner, il l'explcitly de blocage.
Ou, vous pouvez également envisager l'utilisation de recv() où le blocage et les non-bloquant peut être spécifié.
Il a la possibilité, MSG_WAITALL, où il peut bloquer jusqu'à ce que tous les octets sont arrivés.
OriginalL'auteur Hong Zhou