BEZEICHNUNG¶
socket - einen Kommunikationsendpunkt erzeugen
ÜBERSICHT¶
#include <sys/types.h> /* Siehe ANMERKUNGEN */
#include <sys/socket.h>
int socket(int domain, int type, int
protocol );
BESCHREIBUNG¶
socket() erzeugt einen Kommunikationsendpunkt und gibt einen Deskriptor
zurück.
Der Parameter
domain spezifiziert eine Kommunikations-Domain; dies
wählt die Protokollfamilie aus, die benutzt werden soll. Diese Familien
sind in
<sys/socket.h> definiert. Zu den derzeit verstandenen
Formaten gehören:
Name |
Zweck |
Handbuchseite |
AF_UNIX, AF_LOCAL |
Lokale Kommunikation |
unix(7) |
AF_INET |
IPv4-Internet-Protokolle |
ip(7) |
AF_INET6 |
IPv6-Internet-Protokolle |
ipv6(7) |
AF_IPX |
IPX-Novell-Protokolle |
|
AF_NETLINK |
Kernel-Benutzerschnittstellengerät |
netlink(7) |
AF_X25 |
ITU-T-X.25- / ISO-8208-Protokoll |
x25(7) |
AF_AX25 |
Amateurfunk-Protokoll AX.25 |
|
AF_ATMPVC |
Zugriff auf unbearbeitete ATM PVCs |
|
AF_APPLETALK |
AppleTalk |
ddp(7) |
AF_PACKET |
Systemnahe Paketschnittstelle |
packet(7) |
Der Socket hat den in
type angegebenen Typ, welcher die
Kommunikationssemantik festlegt. Derzeit sind folgende Typen definiert:
- SOCK_STREAM
- Stellt sequentielle, zuverlässige, verbindungsorientierte
Zweiweg-Bytestreams bereit. Ein
»Out-of-Band«-Datenübertragungsmechanismus kann
unterstützt werden.
- SOCK_DGRAM
- Unterstützt Datagramme (verbindungslose, unzuverlässige
Nachrichten mit einer festen Maximallänge).
- SOCK_SEQPACKET
- Bietet einen sequenziellen, verlässlichen, verbindungsbasierten
Zwei-Wege-Übertragungspfad für Datagramme einer festen
maximalen Länge; ein Abnehmer ist erforderlich, um mit jedem
Eingabe-Systemaufruf ein ganzes Paket zu lesen.
- SOCK_RAW
- Bietet Zugriff auf das »rohe« Netzwerkprotokoll.
- SOCK_RDM
- Bietet eine zuverlässige Datagramm-Ebene, die aber keine
Reihenfolge garantiert.
- SOCK_PACKET
- Veraltet und sollte nicht in neuen Programmen verwendet werden; siehe
packet(7).
Einige Socket-Typen sind möglicherweise nicht von allen Protokollfamilien
implementiert.
Seit Linux 2.6.27 dient das Argument
type einem zweiten Zweck:
Zusätzlich zur Angabe des Socket-Typs kann es ein bitweises ODER von
einem der folgenden Werte enthalten, um das Verhalten von
socket() zu
verändern:
- SOCK_NONBLOCK
- Setzt den Dateistatus-Schalter O_NONBLOCK für den neu
geöffneten Dateideskriptor. Die Verwendung dieses Schalters spart
zusätzliche Aufrufe von fcntl(2), um das gleiche Ergebnis zu
erreichen.
- SOCK_CLOEXEC
- Setzt den Schalter »Schließen bei Ausführung«
(close-on-exec, FD_CLOEXEC) für den neuen Dateideskriptor.
Lesen Sie die Beschreibung des Schalters O_CLOEXEC in
open(2), um die Gründe zu beleuchten, warum dies
nützlich sein könnte.
Das
protocol bezeichnet ein spezielles Protokoll, das auf diesem Socket
benutzt wird. Normalerweise gibt es nur ein einziges Protokoll, das von einem
speziellen Sockettyp einer Protokollfamilie unterstützt wird. In diesem
Fall kann
protocol als 0 angegeben werden. Nichtsdestotrotz ist es
möglich, dass mehrere Protokolle existieren. In diesem Fall muss das zu
Verwendende auf diese Art angegeben werden. Die Protokollnummer ist
individuell für die bestimmte »Kommunikations-Domain«.
Siehe dazu auch
protocols(5). Lesen Sie
getprotoent(3), um zu
erfahren, wie Sie die Protokollnamenzeichenketten auf Protokollnummern
abbilden.
Sockets des Typs
SOCK_STREAM sind Vollduplex-Byte-Streams, ähnlich
wie Pipes. Sie erhalten die Grenzen von Datensätzen nicht. Ein
Stream-Socket muss sich in einem
connected-Status 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 Sitzung abgeschlossen ist, kann
close(2)
ausgeführt werden. Out-of-band Daten können, wie in
send(2) und
recv(2) beschrieben, gesendet und empfangen werden.
Die Kommunikationsprotokolle, die ein
SOCK_STREAM implementieren,
gewährleisten, dass die Daten nicht verloren gehen oder dupliziert
werden. Falls ein Datenelement, für das das Peer-Protokoll Platz im
Pufferspeicher bereithält, nicht erfolgreich innerhalb einer
angemessenen Zeitspanne übertragen werden kann, dann wird die
Verbindung als »tot« betrachtet. Falls
SO_KEEPALIVE
für den Socket aktiviert ist, überprüft das Protokoll auf
eine protokollspezifische Weise, ob das andere Ende »noch am
Leben« ist. Es wird ein
SIGPIPE-Signal ausgelöst, wenn
ein Prozess auf einem unterbrochenen Stream sendet oder empfängt; naive
Prozesse, die das Signal nicht abfangen, werden beendet.
SOCK_SEQPACKET-Sockets verwenden die gleichen Systemaufrufe wie
SOCK_STREAM-Sockets. Der einzige Unterschied ist, dass Aufrufe von
read (2) nur die Menge an angeforderten Daten zurückgeben und
alle verbleibenden Daten im ankommenden Paket verwerfen. Ebenso werden alle
Nachrichtengrenzen in eingehenden Datagrammen beibehalten.
SOCK_DGRAM- und
SOCK_RAW-Sockets ermöglichen das Senden von
Datagrammen zu Empfängern, die in
send(2)-Aufrufen benannt
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 für den Empfang von
Rohdaten direkt vom Treiber. Verwenden Sie stattdessen
packet(7).
Mit einer
fcntl(2)-
F_SETOWN-Operation kann ein Prozess oder eine
Prozessgruppe angegeben werden, der/die ein
SIGURG empfangen soll, wenn
Out-of-Band-Daten eintreffen, oder
SIGPIPE, wenn eine
SOCK_STREAM-Verbindung unerwartet unterbrochen wird. Diese Operation
kann auch verwendet werden, um den Prozess oder die Prozessgruppe festzulegen,
welche(r) die E/A und die asynchrone Benachrichtigung über
E/A-Ereignisse mittels
SIGIO empfängt. Die Verwendung von
F_SETOWN entspricht einem Aufruf von
ioctl(2) mit den Argumenten
FIOSETOWN oder
SIOCSPGRP.
Wenn das Netzwerk dem Protokollmodul einen Fehlerzustand signalisiert (z.B.
mittels einer ICMP-Nachricht für IP) wird für den Socket der
Schalter für einen anstehenden Fehler gesetzt. Die nächste
Operation auf diesem Socket liefert den Fehlercode des anstehenden Fehlers.
Bei manchen Protokollen ist es möglich, für jeden Socket eine
Fehler-Warteschlange zu aktivieren, um detaillierte Informationen über
den Fehler abrufen zu können; siehe
IP_RECVERR 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.
RÜCKGABEWERT¶
Bei Erfolg wird ein Dateideskriptor für den neuen Socket
zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und
errno entsprechend gesetzt.
FEHLER¶
- EACCES
- Es ist dem Prozess nicht erlaubt, einen Socket von angegebenen Typ
und/oder Protokoll zu erzeugen.
- EAFNOSUPPORT
- Die Implementierung unterstützt die angegebene Adressfamilie
nicht.
- EINVAL
- Unbekanntes Protokoll oder Protokollfamilie nicht verfügbar.
- EINVAL
- Ungültige Schalter in type.
- EMFILE
- Überlauf der Prozessdateitabelle
- ENFILE
- Die Systembeschränkung für die Gesamtzahl offener Dateien
wurde erreicht.
- ENOBUFS oder ENOMEM
- Es ist nicht ausreichend Speicher verfügbar. Der Socket kann nicht
erzeugt werden, bis ausreichend Ressourcen freigegeben wurden.
- EPROTONOSUPPORT
- Der Protokolltyp oder das angegebene Protokoll wird von dieser
Kommunikations-Domain nicht unterstützt.
Andere Fehler können von den unterliegenden Protokollmodulen erzeugt
werden.
4.4BSD, POSIX.1-2001.
Die Schalter
SOCK_NONBLOCK und
SOCK_CLOEXEC sind
Linux-speziifisch.
socket() erschien in 4.2BSD. Es ist grundsätzlich zu/von
Nicht-BSD-Systemen portierbar, die Clone der BSD-Socket-Schicht
unterstützen (einschließlich System-V-Varianten).
ANMERKUNGEN¶
POSIX.1-2001 erfordert nicht, dass
<sys/types.h> eingebunden wird.
Diese Header-Datei ist in Linux nicht erforderlich. Allerdings
benötigen einige historische Implementierungen (BSD) diese
Header-Datei. Es wird empfohlen, sie für portierbare Anwendungen
einzubinden.
Die unter 4.x BSD verwendeten Manifest-Konstanten für Protokollfamilien
sind
PF_UNIX,
PF_INET und so weiter, währen
AF_UNIX,
AF_INET und so weiter für Adressfamilien
verwendet werden. Jedoch verspricht schon die BSD-Handbuchseite:»The
protocol family generally is the same as the address family« und
nachfolgende Standards verwenden überall AF_.
BEISPIEL¶
Ein Beispiel für die Verwendung von
socket() ist in
getaddrinfo(3) dargestellt.
SIEHE AUCH¶
accept(2),
bind(2),
connect(2),
fcntl(2),
getpeername(2),
getsockname(2),
getsockopt(2),
ioctl(2),
listen(2),
read(2),
recv(2),
select(2),
send(2),
shutdown(2),
socketpair(2),
write(2),
getprotoent(3),
ip(7),
socket(7),
tcp(7),
udp(7),
unix(7)
“An Introductory 4.3BSD Interprocess Communication Tutorial” und
“BSD Interprocess Communication Tutorial”, nochmals in
UNIX Programmer's Supplementary Documents Volume 1 gedruckt.
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.74 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler
gemeldet werden können sowie die aktuelle Version dieser Seite finden
sich unter
http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Schulze
<joey@infodrom.org>, Sebastian Rittau
<srittau@jroger.in-berlin.de>, Helge Kreutzmann
<debian@helgefjell.de>, Martin Eberhard Schauer
<Martin.E.Schauer@gmx.de> und Mario Blättermann
<mario.blaettermann@gmail.com> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General
Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.