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 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