SOCKET(2)

BEZEICHNUNG
socket - erzeuge einen Kommunikationsendpunkt

Diese Handbuchseite ist eventuell veraltet. Im Zweifelsfall ziehen Sie die englischsprachige Handbuchseite zu Rate, indem Sie

    man -LC 2 socket

eingeben.

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.

Zurzeit werden folgende Domains unterstützt:

Name | Zweck | Handbuchseite
 | Lokale Kommunikation |
 | IPv4 Internet-Protokoll |
 | IPv6 Internet-Protokoll |
 | IPX - Novell-Protokoll |
 | Kernel User Interface Device |
 | ITU-T X.25 / ISO-8208-Protokoll |
 | Amateur-Radio AX.25-Protokoll |
 | Zugriff auf raw ATM PVCs |
 | Appletalk |
 | Low-Level Paketschnittstelle |

Der Socket hat den in type angegebenen Typ, der die Art der Kommunikation bestimmt. Zurzeit sind folgende Arten definiert:

SOCK_STREAM
    stellt einen sequenziellen, verlässlichen, zwei-Wege, verbindungsbasierten Bytestream zur Verfügung. Ein “out-of-band”-Übertragungsmechanismus kann unterstützt werden.

SOCK_DGRAM
    bietet Datagramme (verbindungslos, unverlässliche Nachricht einer festen (meist kleinen) maximalen Länge).

SOCK_SEQPACKET
    bietet einen sequenziellen, verlässlichen, zwei-Weg-basierten Übertragungspfad für Datagramme einer festen maximalen Länge. Der Empfänger muss ein ganzes Paket mit jedem Funktionsaufruf lesen.

SOCK_RAW
    stellt Zugriff auf interne Netzwerkprotokolle und Schnittstellen zur Verfügung.

SOCK_RDM
    bietet eine verlässliche Datagramm-Schicht, die kein Sortieren garantiert.

SOCK_PACKET
    ist veraltet und sollte nicht in neuen Programmen benutzt werden. Siehe packet(7).

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, dass mehrere Protokolle existieren. In diesem Fall muss das zu verwendende Protokoll auf diese Art angegeben werden. Die Protokollnummer ist individuell für eine bestimmte “Kommunikationsdomain”. Siehe dazu auch protocols(5).

In getprotoent(3), ist beschrieben, wie Protokollnamen in Protokollnummern umgewandelt werden können.

Sockets des Typs SOCK_STREAM sind vollduplex-orientierte Bytestreams, ähnlich wie Pipes. Sie erhalten die Record-Grenzen nicht. Ein Stream-Socket muss sich in einem connected-Modus 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, dass 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, dass die Verbindung unterbrochen (“broken”) ist. Wenn SO_KEEPALIVE für den Socket gesetzt ist, überprüft das Protokoll auf eine protokollspezifische Art, ob das andere Ende noch immer existiert. Ein SIGPIPE-Signal wird erzeugt, wenn ein Prozess versucht, auf einem kaputten Stream zu senden oder zu empfangen. Dies beendet Prozesse, die das Signal nicht verarbeiten.

SOCK_SEQPACKET-Sockets benutzen dieselben Systemcalls wie SOCK_STREAM-Sockets. Der einzige Unterschied besteht darin, dass read(2) nur die angeforderte Menge an Daten zurückliefert und alle restlichen verwirft. Außerdem werden alle Nachrichtengrenzen der eingehenden Datagramme beibehalten.

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.

SOCK_PACKET ist ein veralteter Socket-Typ, um rohe Pakete direkt vom Gerätetreiber zu empfangen. Benutzen Sie stattdessen packet(7).

Ein fcntl(2)-Aufruf kann mit dem F_SETOWN-Argument benutzt werden, um eine Prozessgruppe anzugeben, die ein SIGURG-Signal empfangen soll, wenn out-of-band Daten ankommen, oder ein SIGPIPE-Signal, wenn eine SOCK_STREAM-Verbindung unerwartet zusammenbricht. Damit kann ebenfalls der Prozess oder die Prozessgruppe eingestellt werden, welche I/O und asynchrone Benachrichtigung von I/O-Ereignissen mit dem SIGIO-Signal erhält. F_SETOWN zu benutzen entspricht dem Aufruf der Systemfunktion ioctl(2) mit dem Argument SIOSETOWN

Wenn das Netzwerk dem Protokollmodul einen Fehler meldet (z. B. durch eine ICMP-Nachricht unter IP), wird der Flag gesetzt, der auf einen unbearbeiteten Fehler (“pending error”) hinweist. Der nächste Funktionsaufruf für diesen Socket liefert den Code des Fehlers zurück. Bei manchen Protokollen ist es möglich, eine socket-spezifische Fehlerliste einzuschalten, um genaue Informationen über den Fehler zu erhalten. Siehe IP_RECEIVER in ip(7).

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.

BEMERKUNG
Die unter BSD 4.* benutzten Konstanten für Protokoll-Familien sind PF_UNIX, PF_INET usw., während AF_UNIX usw. für Adressfamilien verwandt werden. Allerdings verspricht die BSD Handbuchseite bereits: “Die Protokollfamilie ist generell dieselbe wie die Adressfamilie”, und die folgenden Standards benutzen überall AF_*.

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.

ENFILE
    Es ist nicht genügend Kernelspeicher vorhanden, um eine neue Socket-Struktur anzulegen.

EMFILE
    Die Dateideskriptortabelle des Prozesses ist voll.

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

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

EINVAL
    Unbekanntes Protokoll oder Protokollfamilie nicht verfügbar.

KONFORM ZU
4.4BSD (die socket-Funktion taucht in BSD 4.2 auf). Generell portabel auf/von nicht-BSD-Systemen, die den BSD-Socket-Layer unterstützen (inklusive System-V-Varianten).

BUGS
SOCK_UUCP ist noch nicht implementiert.

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” ist in UNIX Programmer's Supplementary Documents Volume 1 abgedruckt.

“BSD Interprocess Communication Tutorial“ ist in UNIX Programmer's Supplementary Documents Volume 1 abgedruckt.