SOCKET(2)

BEZEICHNUNG
socket - erzeuge einen Kommunikationsendpunkt

SYNTAX
#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

BESCHREIBUNG
Socket erzeugt einen Kommunikationsendpunkt und gibt den zugehörigen Deskriptor zurück. Der Parameter domain spezifiziert die Kommunikationsdomain, in der die Kommunikation stattfinden soll, also die Protokollfamilie, die benutzt werden soll. Diese Familien sind in der Include-Datei <sys/socket.h> definiert. Zur Zeit werden folgende Domains unterstützt:

    AF_UNIX
        (UNIX interne Protokolle)

    AF_INET
        (ARPA Internet Protokolle)

    AF_ISO
        (ISO Protokolle)

    AF_NS
        (Xerox Network Systems Protokolle)

    AF_IMPLINK
        (IMP “host at IMP” Link Ebene)
Der Socket hat den in type angegebenen Typ, der die Art der Kommunikation bestimmt. Zur Zeit sind folgende Arten definiert:
    SOCK_STREAM
    SOCK_DGRAM
    SOCK_RAW
    SOCK_SEQPACKET
    SOCK_RDM
Ein Socket vom Typ SOCK_STREAM stellt einen sequenziellen, verläßlichen, zwei-weg-basierten Byte-Stream zur Verfügung. Ein "out-of-band" Übertragungsmechanismus kann unterstützt werden. Ein Socket vom Typ SOCK_DGRAM bietet Datagramme (verbindungslos, unverläßliche Nachricht einer festen (meist kleinen) maximalen Länge). Ein SOCK_SEQPACKET Socket kann einen sequenziellen, verläßlichen, zwei-weg-basierten Übertragungspfad für Datagramme einer festen maximalen Länge bieten. Möglicherweise wird vom lokalen Endpunkt erwartet, daß er ein komplettes Paket mit jedem read System-Call liest. Diese Art ist protokollspezifisch und zur Zeit nur für AF_NS implementiert. SOCK_RAW Sockets stellen Zugriff auf interne Netzwerkprotokolle und Schnittstellen zur Verfügung. Die Typen SOCK_RAW, der nur für den Superuser (=root) zugänglich ist, und SOCK_RDM, der geplant aber noch nicht implementiert ist, werden hier nicht beschrieben. Das protocol bezeichnet ein spezielles Protokoll, das auf diesem Socket benutzt wird. Normalerweise gibt es nur ein einziges Protokoll, das von einem speziellen Socket einer Protokollfamilie unterstützt wird. Nichtsdestotrotz ist es möglich, daß mehrere Protokolle existieren. In diesem Fall muß das zu verwendende auf diese Art angegeben werden. Die Protokollnummer ist individuell für eine bestimmte "Kommunikationsdomain". Siehe dazu auch protocols(5). Sockets des Typs SOCK_STREAM sind voll-duplex-orientierte Byte-Streams, ähnlich wie Pipes. Ein Stream-Socket muß sich in einem connected Stadium befinden bevor mit ihm irgendwelche Daten gesendet oder empfangen werden können. Eine Verbindung zu einem anderen Socket wird mit connect(2) hergestellt. Einmal verbunden können Daten mit read(2) und write(2) übertragen werden bzw. mit Varianten von send(2) oder recv(2). Wenn eine Verbindung abgebaut werden soll, wird close(2) ausgeführt. Out-of-band Daten können, wie in send(2) beschrieben, gesendet und, wie in recv(2) beschrieben, empfangen werden. Die Kommunikationsprotokolle, die verwendet werden, um ein SOCK_STREAM zu implementieren, stellen sicher, daß Daten weder verloren gehen noch verdoppelt werden. Wenn ein Datum, für das das Partnerprotokoll ausreichend Puffer zur Verfügung hat, in einem angemessenen Zeitraum nicht erfolgreich übertragen werden kann, wird angenommen, daß die Verbindung kaputt ("broken") ist und Aufrufe zeigen einen Fehler an, indem sie -1 zurückgeben und ETIMEDOUT als entsprchenden Wert in der globalen Variable errno setzen. Die Protokolle halten den Socket unter Umständen warm, indem sie ca. jede Minute eine Übertragung erzwingen, wenn keine anderen Aktivitäten vorliegen. Ein Fehler wird angezeigt, wenn keine Antwort auf einer sonst stillen Verbindung in einer erweiterten Zeitspanne (z.B. 5 Minuten) erzielt werden kann. Ein SIGPIPE-Signal wird erzeugt, wenn ein Prozeß auf einen kaputten Stream sendet; das verursacht bei naive Prozesse, die das Signal nicht verarbeiten, ein Programmende. SOCK_SEQPACKET-Sockets setzen dieselben Systemcalls ein wie SOCK_STREAM-Sockets. Der einzige Unterschied besteht darin, daß read(2) nur die angeforderte Menge an Daten zurückliefert und alle restlichen verwirft. SOCK_DGRAM- und SOCK_RAW-Sockets erlauben das Senden von Datagrammen zu Empfängern, die im send(2) Aufruf genannt werden. Datagramme werden grundsätzlich mit recvfrom(2) empfangen, das das nächste Datagramm zusammen mit der Absenderadresse zurückliefert. Ein fcntl(2) Aufruf kann benutzt werden, um ein Prozeßgruppe zu spezifizieren, die ein SIGURG-Signal empfangen soll, wenn out-of-band Daten ankommen. So kann ebenfalls eingestellt werden, daß non-blocking I/O und asynchrone Benachrichtigung von I/O Ereignissen via SIGIO vorgenommen werden. Die Arbeitsweise von Sockets wird von Socket-Level-Optionen gesteuert. Diese sind in der Include-Datei <sys/socket.h> definiert. Setsockopt(2) und getsockopt(2) werden verwendet, um diese Optionen zu setzen bzw. zu lesen.

RÜCKGABEWERTE
-1 wird zurückgegeben, wenn ein Fehler auftritt, ansonsten wird die Nummer des Deskriptors zurückgegeben, der den Socket referenziert.

FEHLER

EPROTONOSUPPORT
    Der Protokolltyp, der in protocol angegeben ist, wird nicht von dieser Kommunikationsdomain unterstützt.

EMFILE
    Die Deskriptor-Tabelle des Prozesses ist voll.

ENFILE
    Die System-Dateitabelle ist voll.

EACCESS
    Es ist dem Prozess nicht erlaubt, einen Socket von angegebenen Tyo und/oder Protokoll zu erzeugen.

ENOBUFS
    Es ist nicht ausreichend Speicher verfügbar. Der Socket kann nicht erzeugt werden bis ausreichend Resourcen freigemacht wurden.

GESCHICHTE
Die socket Funktion taucht in BSD 4.2 auf.

SIEHE AUCH
accept(2), bind(2), connect(2), getprotoent(3), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2). "An Introductory 4.3 BSD Interprocess Communication Tutorial" is reprinted in UNIX Programmer's Supplementary Documents Volume 1

"BSD Interprocess Communication Tutorial" is reprinted in UNIX Programmer's Supplementary Documents Volume 1