Zeitüberschreitung für die recv-Funktion einstellen

10

Ich habe vom Socket mit recv function gelesen. Ich habe ein Problem, wenn keine Daten zum Lesen verfügbar sind. Mein Programm hört einfach auf. Ich habe festgestellt, dass ich Timeout mit% Co_de% -Funktion einstellen kann. Aber es sieht so aus, dass das Timeout die select-Funktion selbst beeinflusst und select , das nach select geht, immer noch unkontinuierlich wartet.

%Vor%

Wie kann man recv function nach einer bestimmten Zeit zurücksetzen?

    
vico 22.05.2015, 11:14
quelle

3 Antworten

6

Sie sollten den Rückgabewert von select überprüfen. select gibt 0 zurück, wenn das Zeitlimit abgelaufen ist. Daher sollten Sie nach einem Fehler suchen und recv nur aufrufen, wenn select einen positiven Wert zurückgegeben hat:

  

Wenn Sie erfolgreich sind, wählen Sie () und pselect () die Anzahl der Dateideskriptoren aus, die in den drei zurückgegebenen Deskriptorgruppen enthalten sind (dh die Gesamtzahl der Bits, die in readfds, writefds, exceptfds gesetzt sind) Das Zeitlimit läuft ab, bevor etwas Interessantes passiert.

%Vor%     
Nemanja Boric 22.05.2015, 11:38
quelle
22

Eine andere Möglichkeit, ein Timeout für recv() selbst festzulegen, ohne select() zu verwenden, ist die Verwendung von setsockopt() , um die Option SO_RCVTIMEO des Sockets zu setzen (auf Plattformen, die dies unterstützen).

Unter Windows würde der Code wie folgt aussehen:

%Vor%

Auf anderen Plattformen würde der Code stattdessen so aussehen:

%Vor%     
Remy Lebeau 22.05.2015 17:06
quelle
1

Mit dem Makro FD_ISSET () testen, ob Daten zu lesen sind. Wenn sie false zurückgibt, lese nicht.

Ссылка

    
Richard Hodges 22.05.2015 11:24
quelle

Tags und Links