|
Beschreibung
Die Funktion socket() erzeugt einen Kommunikationsendpunkt und liefert einen Deskriptor zurück.
Der Parameter domain legt die Kommunikationsdomäne fest, in der die Kommunikation stattfinden soll. Dies bestimmt auch die zu verwendende Protokollfamilie. Die Protokollfamilie entspricht im Allgemeinen der Adressfamilie für die Adressen, die bei späteren Operationen auf dem Socket verwendet werden. Diese Familien werden in der Include-Datei <sys/socket.h> definiert. Es werden die Protokollfamilien AF_INET, AF_INET6 und AF_UNIX unterstützt.
Der Parameter type legt den Typ des Sockets und damit die Semantik der Kommunikation fest. Die beiden folgenden Socket-Typen sind definiert:
SOCK_STREAM
SOCK_DGRAM
Der Typ SOCK_STREAM bietet eine sequenzielle, gesicherte, bidirektionale Verbindung. Ein Socket vom Typ SOCK_DGRAM unterstützt die Übertragung von Datagrammen. Datagramme sind verbindungslose, ungesicherte Nachrichten einer festen maximalen Länge.
Der Parameter protocol legt ein bestimmtes Protokoll fest, das für den Socket verwendet werden soll. Da diese Implementierung nur die TCP/IP-Protokollfamilie unterstützt, sind hier nur die Werte 0 (Standardprotokoll), IPPROTO_IP, IPPROTO_IPV6, IPPROTO_TCP und IPPROTO_UDP für den allgemeinen Gebrauch zugelassen. Andere Protokolle sind dem internen Gebrauch vorbehalten.
Sockets vom Typ SOCK_STREAM sind Voll-Duplex-Datenströme, ähnlich wie Pipes. Ein Stream-Socket muss im verbundenen Zustand befinden, bevor irgendwelche Daten über ihn gesendet oder empfangen werden können. Eine Verbindung zu einem anderen Socket wird mit der Funktion connect() hergestellt. Sind zwei Sockets einmal miteinander verbunden, können Daten mit read()- und write()-Aufrufen oder vergleichbaren Aufrufen wie send() und recv() übertragen werden. Wenn eine Sitzung beendet ist, sollte das Programm die Funktion close() aufrufen.
Die für einen Stream-Socket verwendeten Kommunikationsprotokolle stellen sicher, dass Daten nicht verloren gehen oder dupliziert werden.
Sockets vom Typ SOCK_DGRAM erlauben das verbindungslose Senden und Empfangen von Datagrammen mit sendto() und recvfrom() bzw. sendmsg() und recvmsg(). Bei den Aufrufen dieser Funktionen wird dann die Adresse des Kommunikationspartners als Parameter übergeben.
Mit der Funktion fcntl() kann das Programm eine Prozessgruppe angeben, um ein SIGIO-Signal zu empfangen, wenn Ein-/Ausgabe-Operationen oder Verbindungsaufbau-Wünsche ankommen.
Socket-Operationen werden von Optionen der Socket-Ebene gesteuert. Diese Operationen sind in der Include-Datei <sys/socket.h> definiert. Mit den Funktionen getsockopt() und setsockopt() kann das Programm diese Optionen abfragen und ändern.
Returnwert
≥0:
Bezeichnet einen nicht-negativen Deskriptor bei Erfolg.
-1:
Bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.
Fehler
EACCES
Die Erlaubnis zum Erzeugen eines Sockets des angegebenen Typs oder Protokolls wird nicht gewährt.
EMFILE
Die Tabelle der Deskriptoren pro Prozess ist voll.
ENFILE
Die Datei-Tabelle des Systems ist voll.
ENOBUFS
Es gibt nicht genug Speicherplatz im Puffer. Der Socket kann nicht erzeugt werden, bis genügend Speicher-Ressourcen frei gemacht werden.
EPROTONOSUPPORT
Der Protokolltyp oder das angegebene Protokoll wird in dieser Domäne nicht unterstützt.
EPROTOTYPE
Das Protokoll hat für den Socket den falschen Typ.
EAFNOSUPPORT
Die im Parameter domain angegebene Adressfamilie wird an diesem System nicht unterstützt. Siehe dazu auch "Abhängigkeiten vom BS2000-Transportsystem BCAM".
Siehe auch
accept(), bind(), connect(), getsockname(), getsockopt(), listen(), recv(), send(), shutdown(), socketpair(), close(), fcntl(), ioctl(), read(), select(), write()