// funktioniert auch nach der Bindeoperation für WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
Sie können die Funktion setsockopt verwenden, um eine Zeitüberschreitung für Empfangsvorgänge festzulegen:
SO_RCVTIMEO
Legt den Timeout-Wert fest, der die maximale Zeitspanne angibt, die eine Eingabefunktion wartet, bis sie abgeschlossen ist. Es akzeptiert eine Zeitstruktur mit der Anzahl von Sekunden und Mikrosekunden, die das Limit angeben, wie lange auf den Abschluss einer Eingabeoperation gewartet werden soll. Wenn eine Empfangsoperation für diese lange Zeit blockiert wurde, ohne zusätzliche Daten zu empfangen, soll sie mit einer Teilzählung zurückkehren oder eine Fehlermeldung auf [EAGAIN] oder [EWOULDBLOCK] setzen, wenn keine Daten empfangen werden. Der Standardwert für diese Option ist null, was anzeigt, dass eine Empfangsoperation keine Zeitüberschreitung haben soll. Diese Option nimmt eine timeval-Struktur an. Beachten Sie, dass nicht alle Implementierungen das Setzen dieser Option zulassen.
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
Berichten zufolge sollte dies unter Windows vor dem Aufruf von bind
erfolgen . Ich habe experimentell verifiziert, dass dies entweder vor oder nach bind
erfolgen kann unter Linux und OS X.
Installieren Sie einen Handler für SIGALRM
, dann verwenden Sie alarm()
oder ualarm()
vor einer regulären Sperrung recv()
. Wenn der Wecker klingelt, der recv()
gibt einen Fehler mit errno
zurück auf EINTR
gesetzt .
Hier ist ein einfacher Code, um Ihrem recv
eine Auszeit hinzuzufügen Funktion mit poll
in C:
struct pollfd fd;
int ret;
fd.fd = mySocket; // your socket handler
fd.events = POLLIN;
ret = poll(&fd, 1, 1000); // 1 second for timeout
switch (ret) {
case -1:
// Error
break;
case 0:
// Timeout
break;
default:
recv(mySocket,buf,sizeof(buf), 0); // get your data
break;
}