Wie kann ich versuchen, Daten aus dem Socket mit Timeout zu lesen? Ich weiß, auswählen, auswählen, abfragen, hat ein Timeout-Feld, aber wenn ich sie verwende, wird "tcp fast-path" im tcp reno-Stapel deaktiviert.
Die einzige Idee, die ich habe, ist, recv (fd, ..., MSG_DONTWAIT) in einer Schleife zu verwenden
Antworten:
Sie können die Verwendung setsockopt Funktion ein Timeout einstellen auf Operationen erhalten:
Berichten zufolge sollte dies unter Windows vor dem Aufruf erfolgen
bind
. Ich habe experimentell bestätigt, dass dies entweder vor oder nachbind
Linux und OS X möglich ist.quelle
struct timeval tv;
wird, bedeutet dies, dass select () auch nicht funktioniert? Ich habe versucht, meinen select () - Code nach Windows zu portieren, und es tritt sofort eine Zeitüberschreitung auf. Es sieht so aus, als würde der Wert, den ich zum Zeitpunkt eingestellt habe, ignoriert.Hier ist ein einfacher Code, mit dem Sie Ihrer
recv
Funktionpoll
in C eine Zeitüberschreitung hinzufügen können :quelle
poll
wartet auf den Empfang von mindestens einem Byte oder Timeout, während beim Aufrufen derrecv
Funktion aufsizeof(buf)
Bytes gewartet wird , wodurch diese erneut blockiert wird, wenn diese Anzahl noch nicht eingetroffen ist, diesmal jedoch ohne Timeout.// funktioniert auch nach dem Bindevorgang für WINDOWS
quelle
Installieren Sie einen Handler für
SIGALRM
, dann verwenden Siealarm()
oderualarm()
vor einer regulären Blockierungrecv()
. Wenn der Alarm ausgelöst wird,recv()
wird ein Fehler mit dererrno
Einstellung auf zurückgegebenEINTR
.quelle
LINUX
FENSTER
HINWEIS : Sie haben diese Einstellung vor dem
bind()
Funktionsaufruf für einen ordnungsgemäßen Lauf festgelegtquelle