read() nicht blockiert, die in socket-Programmierung
Ich habe einen server, sendet Daten an einen client alle 5 Sekunden. Ich möchte die client-zu-block-read (), bis der server sendet einige Daten und dann drucken. Ich weiß, read () blockiert standardmäßig. Mein problem ist, dass mein client nicht blockiert read(). Dies ist sehr sonderbar und scheint dies nicht zu sein ein normales Problem.
Mein code druckt "es kam Nichts zurück ..." in einer Endlosschleife. Ich bin auf einer linux-Maschine, in c Programmieren. Mein code-snippet unten. Bitte um Rat.
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;
- Haben Sie überprüft, dass die Verbindung offen ist (ich.e
sockfd
gültig ist)? - Ein Rückgabewert von 0 aus
read()
bedeutet, dass das andere Ende (der server) der socket geschlossen. - Heilen : ja, es ist gültig. Ich habe einen check für die.
- Naja, die Sache ist die, dass der server sendet die Daten alle 5 Sekunden. Es sei denn, wartet der client für den server zu senden, wird es 0 und das jedes mal.
- Nein ist es nicht. Null bedeutet, dass der peer die Verbindung geschlossen. Es bedeutet niemals gab es keine Daten. Im blockierenden Modus read() blockiert; im non-blocking-Modus, wenn es keine Daten, es wird -1 zurück mit errno gesetzt, um EAGAIN oder EWOULDBLOCK je in Ihre Plattform.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann es mehrere Ursachen und mehrere Ausnahmen sind möglich, an verschiedenen Ort:
überprüfen, Steckdose, wo Sie erstellen:
Sie und ermöglichen auch blocking-Modus explizit vor der Verwendung:
oder verwenden Sie
setsockopt
wie folgt:Überprüfen, Lesen Aufruf der Funktion (Grund-Fehler)
Auch check server-code!:
Eine weitere interessante Sache, Versuchen Sie zu verstehen:
recvline
undMAXLINE
Was Greg Hewgill schon schrieb als Kommentar: Ein EOF (eine explizite aufhören zu schreiben, sei es über
close()
oder übershutdown()
) mitgeteilt werden, um die empfangende Seite, indemrecv()
0 zurück. Also, wenn du 0, du weißt, dass es nicht alle Daten, und beenden Sie die lese-Schleife.Wenn Sie non-blocking aktiviert und es gibt keine Daten, erhalten Sie
-1
underrno
aufEAGAIN
oderEWOULDBLOCK
.Was ist der Wert der MAXLINE?
Wenn der Wert 0 ist, dann wird es wieder 0 als gut.
Ansonsten, wie Grijesh Chauhan erwähnen, legen Sie es explcitly zu blockieren.
Oder Sie können auch erwägen, recv (), wo blockierende und nicht-blockierende angegeben werden können.
Es hat die Möglichkeit, MSG_WAITALL, wo es gesperrt wird, bis alle bytes angekommen.