Nicht Blockierenden recv () - Sockets in C

Bin ich mit einer Endlosschleife in-buchsen, in denen, wenn es empfängt einige Daten, die er erhalten soll, oder wenn es will, zum senden von Daten, die es sendet. So etwas wie unten angegeben. Ich bin mit auswählen. Ich habe nur einen socket sd.

fd_set readsd;
int maxsd = readsd +1;
//all those actions of setting maxsd to the maximum fd +1 and FDSETing the FDs.
while(1)
{
     FD_ZERO(&read_sd);
     FD_SET(sd, &read_sd);
     if(FD_ISSET(sd, &readsd))
     {
       //recv call
     }
     else
     {
       //send call
     }
}

Soweit ich weiß, select wählt eine der socket-Deskriptoren, die auf die Daten der zuerst ankommt. Aber hier habe ich nur eine Buchse, und ich will recv wenn es einige Daten, oder ich möchte senden, sonst.

In diesem Fall ist der code, der oben angegeben Ordnung? Oder gibt es irgendeine andere Möglichkeit für mich, die ich nicht kennen?

  • Da Sie nur eine Buchse zu sehen, ich verstehe nicht, wie Sie entscheiden, ob Sie senden soll oder nicht. Schließlich wählen Sie zurückkehren wird, wenn Daten angekommen und da Sie nur eine Steckdose-es ist das gleiche wie warten snchronously, es sei denn, es ist mehr, um Ihren code, mit dem Sie nicht zeigen, noch nicht. In dem obigen Beispiel, wenn Sie hinzufügen auswählen, es wird immer empfangen aber nie senden, wie Sie es geschrieben hat.
  • Ja! Das ist, was ich sage. was ich Tat, war ich ein recv aufrufen, aber es blockiert Sie, bis es keine Daten zu senden. Da alle meine anderen Kunden mit demselben code, werden alle blockiert, bis er empfängt etwas. So Niemand sendet. Also, Was ich will zu tun ist, überprüfen, ob alle Daten empfangen, wenn Sie nicht gehen, um zu senden. Gibt es eine Möglichkeit?
  • Ja, die Antwort von Evans. fcntl tragbar ist, so sollten Sie diesen verwenden. recv wird -1 zurück und errno wird EAGAIN oder EWOULDBLOCK, wenn es keine Daten zu Lesen. Wenn der Rückgabewert 0 ist der sockel wurde richtig geschlossen werden, sonst gibt es so viel, wie es derzeit zur Verfügung steht.
InformationsquelleAutor Natha Kamat | 2013-05-15
Schreibe einen Kommentar