socket(3N) socket(3N)
NAME
socket - Kommunikationsendpunkt erzeugen
SYNTAX
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
BESCHREIBUNG
socket() erzeugt einen Kommunikationsendpunkt und liefert einen
Deskriptor zurück.
Der Parameter domain gibt eine Kommunikations-Domäne an, worin die
Kommunikation stattfindet. Eine Kommunikations-Domäne setzt sich aus
Adreßfamilien und zugehörigen Protokoll-Familien zusammen. Eine Adreß-
familie faßt Adressen gleicher Adreß-Struktur zusammen. Eine Proto-
koll-Familie definiert einen Satz von Protokollen, die die Socket-
Typen einer Adreßfamilie verwenden können. Derzeit entspricht die Pro-
tokollfamilie der Adreßfamilie für die Adressen, die bei späteren Ope-
rationen auf dem Socket verwendet werden. Diese Familien sind in der
Datei /usr/include/sys/socket.h definiert. Die augenblicklich verwen-
deten Familien sind:
PFUNIX Interne Protokolle des UNIX Systems
PFINET ARPA-Internet-Protokolle
Der Socket hat den angegebenen Typ type, der die Art der Kommunikation
bezeichnet (verbindungsorientiert oder verbindungslos). Die augen-
blicklich definierten und von Reliant UNIX unterstützten Typen sind:
SOCKSTREAM
SOCKDGRAM
SOCKRAW
Ein SOCKSTREAM-Socket bietet gesicherte, bidirektionale und verbin-
dungsorientierte Byteübertragung in richtiger Reihenfolge. Der "out-
of-band"-Übertragungsmechanismus kann unterstützt werden. Sockets vom
Typ SOCKSTREAM sind Vollduplex-Byteströme, die Ähnlichkeit mit Pipes
haben. Ein Socket-Stream muß verbunden sein, bevor Daten auf ihm
gesendet oder empfangen werden können. Eine Verbindung zu einem ande-
ren Socket wird mittels einem connect(3N)-Aufruf aufgebaut. Wenn die
Verbindung einmal eingerichtet ist, können Daten mittels den Aufrufen
von read(2) und write(2) oder mittels einiger Varianten der Aufrufe
von send(3N) und recv(3N) übertragen werden. Wenn eine Sitzung beendet
ist, kann ein close(2) durchgeführt werden. "Out-of-band"-Daten können
ebenfalls übertragen [send(3N)] und empfangen [recv(3N)] werden.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
socket(3N) socket(3N)
Die Kommunikationsprotokolle, die für die Realisierung eines Sockets
vom Typ SOCKSTREAM verwendet werden, gewährleisten, daß Daten nicht
verloren gehen oder dupliziert werden. Wenn Daten, für die das Part-
nerprotokoll Pufferplatz verfügbar hat, innerhalb einer angemessenen
Zeit nicht erfolgreich übertragen werden können, wird die Verbindung
als unterbrochen angesehen und die Aufrufe zeigen einen Fehler mit -1
sowie dem spezifischen Fehlercode in der globalen Variable errno an.
Diese Protokolle unterstützen wahlweise einen Mechanismus zur Überwa-
chung von Verbindungen, die lange Zeit inaktiv sind (d.h. bei denen
lange Zeit kein Datentransfer stattfindet), damit solche Verbindungen
nach einer bestimmten Zeit abgebaut werden können. So ein Mechanismus
kann mit der Option SOKEEPALIVE und dem Aufruf setsockopt() für die
Adreßfamilie AFINET mit dem Protokoll TCP eingeschaltet werden. Ist
die Verbindung zu lange inaktiv (systemweites Zeitlimit, typischer-
weise 120 Sekunden), so werden von TCP Nachrichten periodisch (typi-
scherweise alle 75 Sekunden) an den Partner gesendet. Antwortet der
Partner nicht nach einer gewissen Anzahl von Wiederholungen, wird
angenommen, daß er nicht "am Leben" ist, und die Verbindung wird abge-
baut. Versucht ein Prozeß auf einer abgebrochenen Verbindung zu sen-
den, erhält er ein Signal SIGPIPE. Ist für SIGPIPE keine Signal-
Behandlungsroutine definiert, wird der Prozeß beendet.
Ein SOCKDGRAM-Socket bietet Datagramm-Übertragung (verbindungslose
und ungesicherte Übertragung von Nachrichten fester Maximalgröße; nor-
malerweise kleine Nachrichten). SOCKRAW-Sockets bieten den Zugriff
auf interne Netzwerkschnittstellen an.
Die Socket-Typen SOCKDGRAM und SOCKRAW ermöglichen das Senden von
Datagrammen an Partner, die in sendto-Aufrufen direkt angegeben wer-
den. Datagramme werden mittels recvfrom-Aufrufe empfangen, das das
nächste Datagramm und eine Quell-Adresse zurückliefert.
Für jede Protokollfamilie und jeden Typ muß mindestens ein Eintrag in
der Datei /etc/netconfig [siehe netconfig(4)] existieren.
protocol spezifiziert ein bestimmtes Protokoll, das für den Socket
verwendet werden soll. Normalerweise existiert innerhalb einer gegebe-
nen Protokollfamilie nur ein einziges Protokoll, um einen bestimmten
Socket-Typ zu unterstützen. Es können jedoch mehrere Protokolle exi-
stieren, wobei dann ein bestimmtes Protokoll angegeben werden muß. Die
zu verwendende Protokollnummer ist für jede Kommunikations-Domäne, in
der die Kommunikation stattfinden soll, eindeutig. Wenn ein Protokoll
vom Aufrufer angegeben wird, wird es in eine Optionsanforderung auf
Socket-Ebene verpackt und an die darunterliegende Protokollschicht
gesendet.
Wenn protocol angegeben wurde, für das Tupel Familie, Typ, Protokoll
jedoch in der Datei /etc/netconfig kein passender Eintrag gefunden
wurde, wird der erste Eintrag verwendet, der die angegebene Familie
und den Typ mit null für den Protokolleintrag enthält.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
socket(3N) socket(3N)
Mit fcntl(2) kann eine Prozeßgruppe spezifiziert werden, um ein
SIGURG-Signal empfangen zu können, wenn "out-of-band"-Daten angekommen
sind. Mit diesem System-Aufruf kann ebenfalls nicht-blockierende E/A
und asynchrones Melden von E/A-Ereignissen durch SIGIO-Signale akti-
viert werden.
Das Verhalten von Sockets wird durch die Optionen der Socket-Ebene
gesteuert. Diese Optionen sind in der Datei /usr/include/sys/socket.h
definiert. Mit setsockopt(3N) und getsockopt(3N) können die Optionen
gesetzt bzw. ermittelt werden.
RÜCKGABEWERT
Es wird -1 zurückgegeben, wenn ein Fehler auftritt. Andernfalls ist
der Rückgabewert ein Deskriptor, der auf einen Socket verweist.
DIAGNOSE
Der socket()-Aufruf schlägt in folgenden Fällen fehl:
EPROTONOSUPPORT Der Protokolltyp oder das spezifizierte Protokoll
ist innerhalb des Bereichs nicht verfügbar.
EMFILE Die Deskriptortabelle für den entsprechenden Pro-
zeß ist voll.
EACCESS Die Erlaubnis, einen Socket des angegebenen Typs
und/oder des angegebenen Protokolls zu erzeugen,
wird nicht erteilt.
ENOMEM Es ist nicht genügend Speicher verfügbar, um die
Operation durchzuführen.
ENOSR Es waren nicht genügend STREAMS-Betriebsmittel
verfügbar, um die Operation durchzuführen.
SIEHE AUCH
close(2), fcntl(2), ioctl(2), read(2), write(2), accept(3N), bind(3N),
connect(3N), getsockname(3N), getsockopt(3N), listen(3N), recv(3N),
send(3N), shutdown(3N), socketpair(3N), netconfig(4).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98