Sie können das setsockopt Funktion ein Timeout setzen auf Operationen erhalten:
SO_RCVTIMEO
Setzt den Timeout-Wert, der die maximale Menge an Zeit, bis er eine Eingangs Funktion wartet angibt schließt ab. Es akzeptiert eine timeval Struktur mit der Anzahl der Sekunden und Mikrosekunden Angabe der Grenze, wie lange auf warten auf eine Eingabeoperation bis abgeschlossen. Wenn eine Empfangsoperation so lange blockiert ist, ohne dass zusätzliche Daten empfängt, muss mit einer Teilzählung oder errno auf [EAGAIN] oder [EWOULDBLOCK] zurückgesetzt werden, wenn keine Daten empfangen werden. Der Standardwert für diese Option ist Null, was bedeutet, dass eine Empfangsoperation keine Zeitüberschreitung haben soll. Diese Option benötigt eine zeitliche Struktur. Beachten Sie, dass nicht alle Implementierungen diese 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);
Reportedly unter Windows sollte dies vor bind
Aufruf erfolgen. Ich habe durch das Experiment bestätigt, dass es entweder getan werden kann, vor oder nach bind
unter Linux und OS X.
Es gibt auch eine Option Threads verwenden :) aber Thread Signale benötigt noch – osgx