Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

read(), readv() - Nachricht von einem Socket empfangen

&pagelevel(4)&pagelevel

#include <sys/socket.h>
#include <sys/uio.h>

ssize_t read(int s, char *buf, int len);
ssize_t readv(int s, const struct iovec *iov, int iovcnt);

Beschreibung

Die Funktionen read() und readv() empfangen Nachrichten von einem Socket. read() und readv() können nur bei einem Socket verwendet werden, über den eine Verbindung aufgebaut ist. Es wird die Länge der Nachricht zurückgeliefert.

Weitere allgemeine Informationen zu dieser Funktion finden Sie im Handbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen".

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

Bei read() zeigt der Parameter buf auf das erste Byte des Empfangspuffers. Der Parameter len gibt die Länge des Empfangspuffers (in Bytes) und damit die maximale Nachrichtenlänge an.

Bei readv() werden die empfangenen Daten im Vektor (Array) mit den Elementen iov[0] bis iov[iovcnt-1] abgelegt. Die Vektorelemente sind Objekte vom Typ struct iovec. Im Parameter iov wird die Adresse des Vektors übergeben. Jedes Vektorelement enthält Adresse und Länge eines Speicherbereichs, in den readv() die vom Socket s empfangenen Daten speichert. readv() füllt einen Bereich nach dem anderen mit Daten, wobei readv() immer erst dann zum nächsten Bereich übergeht, wenn der aktuelle Bereich vollständig mit Daten gefüllt ist.

Die Struktur iovec ist wie folgt deklariert:

struct iovec {
  caddr_t  iov_base;  /* Puffer für Daten */
  size_t   iov_len;   /* Pufferlänge */
};

iovcnt gibt die Anzahl der Vektorelemente an.

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

Mit den Funktionen poll() bzw. select() stellen Sie fest, wann weitere Daten ankommen.

Wenn der Prozess, der read() bzw. readv() 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").

Returnwert

>0:

Bei Erfolg.

-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.

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.

EWOULDBLOCK

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

Siehe auch

connect(), getsockopt(), recv(), send(), socket(), fcntl(), ioctl(), select(), write()