Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Nicht-blockierende Sockets

&pagelevel(3)&pagelevel

Bei nicht-blockierenden Sockets werden die Funktionen accept() und connect() sowie alle Ein-/Ausgabe-Funktionen abgebrochen, wenn sie nicht sofort ausgeführt werden können. Die betreffende Funktion liefert dann einen Fehlercode zurück. Im Gegensatz zu gewöhnlichen Sockets verhindern nicht-blockierende Sockets also, dass ein Prozess angehalten wird, weil er auf die Beendigung von accept(), connect() oder Ein-/Ausgabe-Funktionen warten muss. Einen Socket können Sie mit der Funktion fcntl() wie folgt als nicht-blockierend markieren:

#include <fcntl.h>
...
int s;
...
s = socket(AF_INET, SOCK_STREAM, 0);
...
if (fcntl(s, F_SETFL, O_NONBLOCK) < 0) {
    perror("fcntl(s, F_SETFL, O_NONBLOCK)");
    exit(1);
}
...

Die Funktion fcntl() gehört zum Grundumfang der POSIX-Schnittstelle. Sie ist beschrieben in "fcntl() - Sockets steuern" sowie im Handbuch "C-Bibliotheksfunktionen für POSIX- Anwendungen".

Wenn auf nicht-blockierenden Sockets die Funktionen accept(), connect() oder Ein-/Ausgabe-Funktionen ausgeführt werden, sollten Sie insbesondere auf den Fehler EWOULDBLOCK achten. EWOULDBLOCK wird in der globalen Variablen errno abgelegt und tritt auf, wenn auf einem nicht-blockierenden Socket eine normalerweise blockierende Funktion ausgeführt wird.

Die Funktionen accept(), connect() sowie alle Schreib- und Leseoperationen können den Fehlercode EWOULDBLOCK liefern. Daher sollten Prozesse auf die Behandlung solcher Returnwerte vorbereitet sein.

Es gibt Situationen, in denen beispielsweise die Funktion send() nur teilweise ausgeführt werden kann, d. h. nur ein Teil der Daten des Anrufers konnte sofort übertragen werden, ohne blockiert zu werden. Eine solche Situation wird nicht durch EWOULDBLOCK angezeigt, sondern durch den Returnwert der Funktion send(), welcher der Anzahl der übertragenen Bytes entspricht.