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 unterbrochen wird, weil er auf die Beendigung von accept(), connect() oder Ein-/Ausgabe-Funktionen warten muss. Einen mit s=socket() erzeugten Socket markieren Sie mit der Funktion soc_ioctl() (siehe Abschnitt "soc_ioctl() (ioctl) - Sockets steuern") wie folgt als nicht-blockierend:
#include <ioctl.h> ... int s; ... int block; s = socket(AF_INET, SOCK_STREAM, 0); ... block = 1; ... if (soc_ioctl(s, FIONBIO, &block) < 0) { perror("soc_ioctl(s, FIONBIO, block) <0"); exit(1); } ...
Wenn auf nicht-blockierenden Sockets die Funktionen accept(), connect() oder Ein-/Ausgabe-Funktionen ausgeführt werden, achten Sie sorgfältig auf den Fehler EWOULDBLOCK. 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: Auch wenn z.B. die Funktion send() nicht vollständig ausgeführt wird, kann es bei Stream-Sockets dennoch sinnvoll sein, wenigstens einen Teil der Schreiboperationen auszuführen. In diesem Fall berücksichtigt send() nur die Daten, die sofort gesendet werden können. Der Returnwert zeigt die Menge der bereits gesendeten Daten an.
Die Eigenschaft „nicht-blockierend“ eines Listen-Sockets wird nicht auf den durch accept() angelegten Socket vererbt.