GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux:Gibt es ein Lesen oder Empfangen vom Socket mit Timeout?

// 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;
}

Linux
  1. Linux – Können wir Compiler-Informationen aus einer Elf-Binärdatei erhalten?

  2. So senden Sie eine E-Mail mit Anhang und Text von Linux

  3. Gibt es STDCALL unter Linux?

  4. C-Bibliothek zum Lesen der EXE-Version von Linux?

  5. Wie extrahiert man Text mit OCR aus einem PDF unter Linux?

Linux-Timeout-Befehl für Anfänger erklärt (mit Beispielen)

So teilen Sie Dateien sicher über die Befehlszeile mit ffsend in Linux

Lesen Sie E-Books von der Befehlszeile mit Epy Ebook Reader

Vim-Tipps – Lesen und schreiben Sie entfernte Dateien mit Vim unter Linux

Arbeiten mit Microsoft Exchange von Ihrem Linux-Desktop aus

Setzen Sie einen Timer auf Ihre laufenden Befehle mit dem Timeout-Befehl in Linux