Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

recv(), recvfrom(), recvmsg() - Nachricht von einem Socket empfangen

&pagelevel(4)&pagelevel

#include <sys/socket.h>
#include <netinet/in.h>

ssize_t recv(int s, void *buf, size_t len, int flags);
ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from,
                 size_t *fromlen);

ssize_t recvmsg(int s, struct msghdr *msg, int flags);

Beschreibung

Die Funktionen recv(), recvfrom() und recvmsg() empfangen Nachrichten von einem Socket.

recv() kann Nachrichten nur von einem Socket empfangen, über den eine Verbindung aufgebaut ist (siehe "connect() - Verbindung über einen Socket initiieren").

recvfrom() und recvmsg() können Nachrichten von einem Socket mit oder ohne Verbindung empfangen.

Der Parameter s bezeichnet den Socket, von dem die Nachricht empfangen wird.

Wenn der Parameter from nicht der Null-Zeiger ist, wird in dem durch from referenzierten Speicherbereich die Absenderadresse der Nachricht abgelegt.

fromlen ist ein Ergebnisparameter. Zu Beginn enthält die size_t-Variable, auf die fromlen zeigt, die Größe des durch from referenzierten Puffers. Bei Rückkehr der Funktion enthält *fromlen die aktuelle Länge der Adresse, die in *from gespeichert ist. Die Funktion liefert die Länge der Nachricht zurück.

Bei einem Datagramm-Socket muss die gesamte Nachricht in einer einzigen Operation gelesen werden. Wenn der angegebene Nachrichtenpuffer zu klein und MSG_PEEK im Parameter flags nicht gesetzt ist, werden die über die Puffergröße hinausgehenden Daten gelöscht.

Bei einem Stream-Socket werden Nachrichtengrenzen ignoriert. Sobald Daten verfügbar sind, werden sie an den Anrufer zurückgeliefert; es werden keine Daten gelöscht.

Wenn auf dem Socket keine Nachrichten vorhanden sind, wartet der Empfangsaufruf auf eine ankommende Nachricht, es sei denn der Socket ist nicht-blockierend (siehe "ioctl() - Sockets steuern"). In diesem Fall wird -1 zurückgeliefert und die Variable errno auf den Wert EWOULDBLOCK gesetzt.

Mit den Funktionen poll() bzw. select() kann festgestellt werden, wann weitere Daten ankommen.

Wenn der Prozess, der recv(), recvfrom() oder recvmsg() aufruft, ein Signal erhält, bevor irgendwelche Daten vorhanden sind, wird im Standardfall die betreffende Funktion erneut aufgerufen. Nicht erneut aufgerufen wird die Funktion, wenn der aufrufende Prozess mit sigaction() festgelegt hat, diese Funktionsaufrufe zu unterbrechen (siehe auch Handbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen").

Der Parameter flags gibt die Art des Nachrichtenempfangs an:

MSG_PEEK

Empfängt eine ankommende Nachricht. Die Daten werden jedoch als ungelesen behandelt und die nächste Empfangsfunktion liefert diese Daten noch einmal zurück.

MSG_WAITALL

Die Funktion blockiert solange, bis die gesamte angeforderte Datenmenge zurückgegeben werden kann.
In folgenden Fällen kann eine geringere Datenmenge zurückgegeben werden:

  • Ein Signal trifft ein.

  • Die Verbindung wird beendet.

  • Eine Fehlersituation tritt auf.

Die Funktion recvmsg() verwendet die Struktur msghdr, um die Anzahl der direkt anzugebenden Parameter zu verringern. Die Struktur msghdr ist in der Include-Datei <sys/socket.h> wie folgt deklariert:

struct msghdr {
   void         *msg_name;            /* optionale Adresse */
   size_t        msg_namelen;         /* Länge der Adresse */
   struct iovec *msg_iov;             /* scatter/gather-Felder */
   int           msg_iovlen;          /* Anzahl der Elemente in msg-iov */
   caddr_t       msg_accrights;       /* Zugriffsrechte Senden/Empfangen */
   int           msg_accrightslen;
   void         *msg_control;         /* Hilfsdaten */
   size_t        msg_controllen;      /* Länge des Puffers für Hilfsdaten */
   int           msg_flags;           /* flag für empfangene Nachricht */
};

Die Elemente msg_name und msg_namelen enthalten Absende-Adresse und Adresslänge des Partners, wenn der Socket keine aufgebaute Verbindung hat. Die Partneradresse ist eine sockaddr-Struktur. Das tatsächliche Format der sockaddr-Struktur hängt von der Adressfamilie ab und ist im Abschnitt "Socket-Adressierung" beschrieben. Wenn der Socket eine aufgebaute Verbindung hat, kann msg_name als Null-Zeiger übergeben werden.

Die Elemente msg_iov und msg_iovlen beschreiben die Scatter- und Gather-Felder.

Die Elemente msg_accrights und msg_accrightslen sowie msg_control und msg_controllen werden standardmäßig ignoriert (siehe Inline-Dokumentation in <sys/socket.h> wenn nötig).

Returnwert

>0:

Bei Erfolg. Der Wert gibt die Anzahl der empfangenen Bytes an.

=0:

Bei Erfolg. Es können keine Daten mehr empfangen werden. Der Partner hat seine Verbindung ordentlich geschlossen (nur bei Sockets vom Typ SOCK_STREAM).

-1:

Bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

EBADF

Der Parameter s ist kein gültiger Deskriptor.

ECONNRESET

Die Verbindung zum Partner wurde abgebrochen (nur bei Sockets vom Typ SOCK_STREAM).

EFAULT

Die Daten sollen in einem nicht vorhandenen oder geschützten Teil des Prozess-Adressbereichs empfangen werden.

EINTR

Der aufrufende Prozess hat ein Signal empfangen, bevor irgendwelche Daten empfangen werden konnten. Die Einstellung den Funktionsaufruf zu unterbrechen und nicht zu wiederholen ist aktiv.

EINVAL

Es wurden mehr als MSG_MAXIOVLEN Scatter/Gather-Felder spezifiziert.

EIO

Es sind Benutzerdaten verloren gegangen.

ENETDOWN

Die Verbindung zum Netzwerk ist nicht mehr aktiv.

ENOTCONN

Für den Socket besteht keine Verbindung.

ENOTSOCK

Der Deskriptor s referenziert eine Datei, keinen Socket.

EOPNOTSUPP

Der Parameter flags enthält einen ungültigen Wert oder msg_accrights wurde spezifiziert.

EWOULDBLOCK

Der Socket ist als nicht-blockierend markiert, und die geforderte Operation würde blockieren.

Siehe auch

connect(), getsockopt(), send(), socket(), fcntl(), ioctl(), read(), select()