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.
Wie kann man recv
function nach einer bestimmten Zeit zurücksetzen?
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:
%Vor%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.
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%Mit dem Makro FD_ISSET () testen, ob Daten zu lesen sind. Wenn sie false zurückgibt, lese nicht.
Tags und Links c++ sockets visual-c++ recv