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() - Nachricht von einem Socket empfangen

&pagelevel(4)&pagelevel



#include <sys.types.h>
#include <sys.socket.h>

#include <netinet.in.h> /* AF_INET, AF_INET6 bei verbindungslosem Betrieb */
 
Kernighan-Ritchie-C:
int recv(s, buf, len, flags);

int s;
char *buf;
int len;
int flags;
  
int recvfrom(s, buf, len, flags, from, fromlen);

int s;
char *buf;
int len;
int flags;

struct sockaddr_in *from;   /* AF_INET  */
struct sockaddr_in6 *from;  /* AF_INET6 */
int *fromlen;

ANSI-C:
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);


Beschreibung

Die Funktionen recv() und recvfrom() empfangen Nachrichten von einem Socket. Für das Empfangen von Nachrichten von einem RAW_SOCKET, sollte jedoch die Funktion recvmsg() verwendet werden.

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

recvfrom() kann Nachrichten von einem Socket mit oder ohne Verbindung empfangen.
Der Funktionsaufruf von recvfrom() mit from != Null-Zeiger und fromlen != Null-Zeiger wird nur für Datagramme unterstützt.

Der Parameter s bezeichnet den Socket, von dem die Nachricht empfangen wird. buf spezifiziert den Speicherbereich, in den die Daten eingelesen werden sollen. len spezifiziert die Länge dieses Puffers.

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

fromlen ist ein Ergebnisparameter. Vor dem Aufruf muss die Integer-Variable, auf die fromlen zeigt, die Größe des durch from referenzierten Puffers enthalten. 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.

Der Parameter flags wird derzeit nur bei einem Datagramm-Socket mit dem Flag MSG_PEEK in den Adressfamilien AF_INET und AF_INET6 unterstützt. In den anderen Fällen sollte flags mit dem Wert 0 versorgt werden.
MSG_PEEK bewirkt, dass Daten gelesen werden können, ohne dass sie an der Quelle gelöscht werden. Darum ist ein Wiederholungslesen erforderlich.

Bei einem Datagramm-Socket (AF_INET, AF_INET6) muss die gesamte Nachricht in einer einzigen Operation gelesen werden. Wenn der angegebene Nachrichtenpuffer zu klein ist, werden die Daten, die nicht in den Puffer aufgenommen werden können, gelöscht.

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

Bei einem Socket der Adressfamilie AF_ISO werden Nachrichtengrenzen berücksichtigt. 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 soc_ioctl() im Abschnitt "soc_ioctl() (ioctl) - Sockets steuern"). In diesem Fall wird -1 zurückgeliefert, wobei die Variable errno auf den Wert EWOULDBLOCK gesetzt wird.

Mit der Funktion select() stellen Sie fest, ob weitere Daten angekommen sind.

Returnwert

>0:

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

=0:

bei Erfolg.
Bei Sockets vom Typ SOCK_STREAM oder bei Sockets der Adressfamilie AF_ISO können keine Daten mehr empfangen werden. Der Partner hat seine Verbindung abgebaut.

Bei Sockets vom Typ SOCK_DGRAM wurde ein Datenpaket mit der Länge 0 empfangen, oder die Daten sind wegen Timeout vom Transportsystem gelöscht worden.

-1:

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

Fehleranzeige durch errno

EBADF

Der Parameter s ist kein gültiger Deskriptor.

ECONNRESET

Die Verbindung zum Partner wurde abgebrochen, obwohl noch Daten erwartet wurden (nur bei Sockets vom Typ SOCK_STREAM).

EFAULT

Die Länge des Bereichs für die Aufnahme der Adresse ist zu klein.

EIO

Es sind Benutzerdaten verlorengegangen.

ENETDOWN

Die Verbindung zum Netzwerk ist nicht mehr aktiv.

ENOTCONN

Für den Socket besteht keine Verbindung.

EOPNOTSUPP

  • Der Parameter flags enthält einen von 0 verschiedenen Wert.

oder

  • Der Socket-Typ ist nicht SOCK_STREAM, und recv() unterstützt nur Stream-Sockets.

EPIPE

Es besteht keine Verbindung zum Partner (nur bei Sockets vom Typ SOCK_STREAM).

EWOULDBLOCK

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

Siehe auch

connect(), getsockopt(), select(), send(), soc_ioctl(), soc_read(), soc_readv(), socket()