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; beispielsweise ist
SOCK_SEQPACKET nicht für
AF_INET 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
die neue offene Dateibeschreibung. 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. Die Beschreibung des Schalters O_CLOEXEC in
open(2) begründet, warum das nützlich sein kann.
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
- Der Systemschwellwert für die Anzahl geöffneter
Dateien ist 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” ist in
UNIX Programmer's Supplementary Documents Volume 1 nochmals gedruckt.
“BSD Interprocess Communication Tutorial” ist in
UNIX
Programmer's Supplementary Documents Volume 1 nochmals gedruckt.
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler
gemeldet werden können, 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> und Martin Eberhard Schauer
<Martin.E.Schauer@gmx.de> 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>.