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