recv(3N) recv(3N)
NAME
recv, recvfrom, recvmsg - Nachricht von einem Socket empfangen
SYNTAX
#include <sys/types.h>
#include <sys/socket.h>
int recv(int s, char *buf, int len, int flags);
int recvfrom(int s, char *buf, int len, int flags,
struct sockaddr *from, int *fromlen);
int recvmsg(int s, struct msghdr *msg, int flags);
BESCHREIBUNG
s ist ein Socket, der mit socket(3N) erzeugt wurde. Mit recv(),
recvfrom() und recvmsg() können Nachrichten von einem anderen Socket
empfangen werden. recv() kann nur auf einem verbundenen Socket [siehe
connect(3N)] verwendet werden. recvfrom() und recvmsg() können hinge-
gen für den Empfang von Daten auf einem Socket verwendet werden, unab-
hängig davon, ob er verbunden ist oder nicht.
Wenn der Zeiger from nicht den Wert NULL hat, wird dort die Sende-
adresse der Nachricht eingetragen. fromlen gibt die Länge der Adresse
an und sollte mit der Größe des Puffers from initialisiert werden.
Zurückgeliefert wird die Länge der Nachricht. Falls eine Nachricht zu
lang ist, und nicht in den angegebenen Puffer buf paßt, können Bytes,
abhängig vom Socket-Typ (SOCKSTREAM und SOCKRAW), von dem die Nach-
richt empfangen wird, verworfen werden [siehe socket(3N)].
Wenn keine Nachrichten auf dem Socket verfügbar sind, wartet der Pro-
zeß auf eine ankommende Nachricht, es sei denn, der Typ des Sockets
ist nichtblockierend [siehe fcntl(2)]. Im letzteren Fall wird eine -1
zurückgegeben und die externe Variable errno auf EWOULDBLOCK gesetzt.
Mit dem Aufruf select() kann für den Socket abgefragt werden, ob wei-
tere Daten angekommen sind.
Der Parameter flags wird durch eine Oder-Verknüpfung der folgenden
Werte gebildet.
MSGOOB Liest alle "out-of-band"-Daten, die sich auf dem
Socket befinden, statt die normalen "in-band"-Daten.
MSGPEEK Liest die Daten, die sich auf dem Socket befinden. Die
Daten werden zurückgeliefert, aber nicht verarbeitet,
so daß nachfolgende Empfangsoperationen die gleichen
Daten vorfinden.
Der Aufruf recvmsg() verwendet zur Vereinfachung eine Struktur msghdr.
Die Struktur ist in /usr/include/sys/socket.h definiert und enthält
folgende Komponenten:
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
recv(3N) recv(3N)
caddrt msgname; /* optionale Adresse */
int msgnamelen; /* Länge der Adresse */
struct iovec *msgiov; /* scatter/gather-Array */
int msgiovlen; /* # Elemente in msgiov */
caddrt msgaccrights; /* empfangene/gesendete
Zugriffsrechte */
int msgaccrightslen;
msgname und msgnamelen geben die Zieladresse an, wenn der Socket
nicht verbunden ist. msgname kann auf den Wert NULL gesetzt werden,
wenn keine Adressen erwünscht bzw. erforderlich sind. msgiov und
msgiovlen spezifizieren den Scatter-Gather-Bereich, wie in read(2)
beschrieben ist. Um alle Zugriffsrechte zu empfangen, die zusammen mit
der Nachricht gesendet werden, ist in msgaccrights ein Puffer angege-
ben, der die Länge msgaccrightslen besitzt. Der Empfang von Zugriffs-
rechten wird nicht von allen Protokoll-Familien unterstützt.
RÜCKGABEWERT
Die Aufrufe liefern die Anzahl empfangener Bytes zurück oder -1, falls
ein Fehler aufgetreten ist.
DIAGNOSE
Die Aufrufe scheitern in folgenden Fällen:
EBADF s ist ein ungültiger Deskriptor.
ENOTSOCK s verweist nicht auf einen Socket.
EINTR Die Operation wurde durch den Empfang eines Signals
unterbrochen, bevor Daten für den Empfang verfügbar
waren.
EWOULDBLOCK Der Socket ist als nichtblockierend markiert, und die
gewünschte Operation würde blockieren.
ENOMEM Es war nicht genügend Speicher verfügbar, um die Ope-
ration durchzuführen.
ENOSR Es waren nicht genügend STREAMS-Betriebsmittel verfüg-
bar, um die Operation durchzuführen.
SIEHE AUCH
fcntl(2), ioctl(2), read(2), select(3C), connect(3N), getsockopt(3N),
send(3N), socket(3N).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98