|
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()