#include <sys.types.h>
#include <sys.socket.h>
Kernighan-Ritchie-C:
int socket(domain, type, protocol);
int domain, type, protocol;
ANSI-C:
int socket(int domain, int type, int protocol);
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 und somit die 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 Adressfamilien AF_INET, AF_INET6 und AF_ISO unterstützt.
Der Parameter type legt den Typ des Sockets und damit die Semantik der Kommunikation fest. Derzeit sind die folgenden Socket-Typen definiert:
SOCK_STREAM
SOCK_DGRAM
SOCK_RAW
In den Adressfamilien AF_INET und AF_INET6 werden alle drei Typen unterstützt, in der Adressfamilie AF_ISO ist nur der Typ SOCK_STREAM definiert.
Der Parameter protocol wird nicht ausgewertet.
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 der Benutzer diese Optionen abfragen bzw. setzen.
Adressfamilien AF_INET und AF_INET6
Ein Socket vom Typ SOCK_STREAM ermöglicht eine sequenzielle, gesicherte, bidirektionale Datenübertragung über eine Verbindung. Bevor Daten an einen Stream-Socket gesendet oder von ihm empfangen werden können, muss der Stream-Socket mit einem anderen Stream-Socket verbunden sein.
Eine Verbindung zu einem anderen Socket wird hergestellt, indem der Socket die Verbindung zu einem Partner-Socket mit connect() anfordert und der Partner die Verbindung mit accept() bestätigt. Nach erfolgreichem Verbindungsaufbau können beide Kommunikationspartner Daten übertragen mit soc_read() bzw. soc_readv() und soc_write() bzw. soc_writev() oder vergleichbaren Aufrufen wie send() und recv().
Ein Socket vom Typ SOCK_DGRAM unterstützt die Übertragung von Datagrammen. Datagramme sind verbindungslose, ungesicherte Nachrichten einer festen maximalen Länge. Mit der Funktion sendto() werden Datagramme von einem Datagramm-Socket an den im sendto()-Aufruf genannten Datagramm-Socket gesendet. Empfangen werden Datagramme mit der Funktion recvfrom(). recvfrom() liefert das nächste Datagramm zusammen mit der Adresse des Absenders.
Wenn mit der Funktion connect() der Kommunikationspartner eines Datagramm-Sockets voreingestellt wurde, können für diesen Datagramm-Socket auch die Funktionen send() und recv() verwendet werden.
Ein Socket vom Typ SOCK_RAW unterstützt die Übertragung von ICMP-/ICMPv6-Nachrichten.
Adressfamilie AF_ISO
Ein Socket vom Typ SOCK_STREAM ermöglicht eine satzorientierte, sequenzielle, gesicherte, bidirektionale Datenübertragung über eine Verbindung. Bevor Daten an einen Stream-Socket gesendet oder von ihm empfangen werden können, muss der Stream-Socket mit einem anderen Stream-Socket verbunden sein.
Eine Verbindung zu einem anderen Socket wird hergestellt, indem der Socket die Verbindung zu einem Partner-Socket mit connect() anfordert und der Partner die Verbindung mit accept() und einer der Funktionen send(), soc_write() oder sendmsg() bestätigt.
Nach erfolgreichem Verbindungsaufbau können beide Kommunikationspartner Daten übertragen mit soc_read() bzw. soc_readv() und soc_write() bzw. soc_writev() oder vergleichbaren Aufrufen wie send() und recv() oder sendmsg() und recvmsg().
Returnwert
>=0: | bei Erfolg. Der Wert bezeichnet einen nicht-negativen Deskriptor. |
-1: | bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen. |
Fehleranzeige durch errno
EMFILE
Die Tabelle der Deskriptoren pro Task ist voll; die maximale Anzahl gleichzeitig bearbeitbarer Socket-Deskriptoren ist erreicht. Mit der Funktion getdtablesize() kann dieser Maximalwert ermittelt werden.
ENOBUFS
Es gibt nicht genug Speicherplatz im Puffer. Der Socket kann nicht erzeugt werden, bis genügend Speicher-Ressourcen frei gemacht werden.
EAFNOSUPPORT
Die Adressfamilie wird von dieser Protokollfamilie nicht unterstützt. Die angegebene Adresse ist inkompatibel zum verwendeten Protokoll.
ENOMEM
Speicherengpass. Während der Ausführung der Funktion konnte nicht genügend virtueller Speicherplatz zugewiesen werden.
EPROTONOSUPPORT
Der Socket-Typ wird in dieser Domäne nicht unterstützt.
Siehe auch
accept(), bind(), connect(), getsockname(), getsockopt(), listen(), recv(), recvfrom(), select(), send(), sendto(), soc_close(), soc_ioctl(), soc_read(), soc_readv(), soc_write(), soc_writev()