Wie schon unter Voraussetzungen erwähnt wurde, gibt es einen Unterschied zwischen Windows und UNIX, was die Fehlerbehandlung und die Rückgabewerte in Fehlerfällen angeht. Es folgen die Besonderheiten von Windows gegenüber UNIX.
Die Funktionen, die Sockets zurückgeben (und deren Rückgabewert daher vom Datentyp SOCKET sein muß), liefern INVALID_SOCKET im Fehlerfall. Dies sind namentlich socket() und accept().
Die Funktionen, die int zurückgeben, liefern SOCKET_ERROR.
Die Funktionen, die Zeiger zurückgeben, liefern wie unter UNIX auch NULL.
Die eigentlichen Fehlercodes kriegt man mit WSAGetLastError().
Unter UNIX ist alles schöner, da gibt's im Fehlerfall immer -1 bzw. NULL, und die Begründung steht in errno bzw. h_errno, man kann mit strerror() und perror() einen Text entlocken. Für Fehler im Resolver-Teil, der h_errno setzt, gibt es noch herror(), eine entsprechende Variante von strerror() existiert hierfür nicht.
Ein Wort noch zum Thema Systemcalls unter UNIX: wenn ein solcher unterbrochen wird, weil ein Signal eintrifft, so wird er beim Einsatz von signal() betriebssystemspezifisch entweder automatisch erneut aufgerufen (der Benutzer merkt nichts davon), oder aber er kehrt mit einem Fehler zurück, wobei errno auf EINTR (Interrupted Systemcall) steht. Ein Server verbringt einen Hauptteil seiner Zeit blockierend in accept (wenn er denn mit fork arbeitet), sodaß ihn hier der Interrupt am ehesten erwischt. So ein zurückkehrendes accept darf man natürlich nicht fuer einen neuen Client halten! Man kann mit den Funktionen signal() oder sigaction() einen eigenen Signalhandler installieren bzw. die Bearbeitung von (manchen) Signalen verhindern. Wenn möglich sollte sigaction() eingesetzt werden, hierbei kann über das Flag SA_RESTART beeinflusst werden, ob der unterbrochene Systemcall fortgesetzt werden soll oder nicht.