|
Beschreibung
Die Funktionen write() bzw. writev() senden Nachrichten von einem Socket zu einem anderen. write() bzw. writev() können nur bei einem Socket benutzt werden, über den eine Verbindung aufgebaut ist.
Weitere allgemeine Informationen zu dieser Funktion finden Sie im Handbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen".
Der Parameter s bezeichnet den Socket, über den die Nachricht gesendet wird.
Bei write() zeigt der Parameter buf auf das erste Byte des Sendepuffers und len spezifiziert die Länge (in Bytes) der Nachricht im Sendepuffer.
Bei writev() werden die zu sendenden Daten im Vektor (Array) mit den Elementen iov[0] bis iov[iovcnt-1] bereitgestellt. 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, aus dem writev() die zu sendenden Daten liest.
Die Struktur struct 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.
Ist die Nachricht zu lang, um von der darunterliegenden Protokollebene ganz transportiert zu werden, dann wird der Fehler EMSGSIZE geliefert und die Nachricht wird nicht übermittelt.
Wenn der Prozess, der write() bzw. writev() aufruft, ein Signal erhält, bevor irgendwelche Daten zum Senden gepuffert 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
Anzahl der tatsächlich gesendeten Bytes:
Bei Erfolg.
-1:
Bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen. Die Deskriptormengen werden dann nicht verändert.
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 aus einem nicht vorhandenen oder geschützten Teil des Prozess-Adressbereichs gesendet werden.
EINTR
Der aufrufende Prozess hat ein Signal empfangen, bevor irgendwelche Daten zum Senden gepuffert werden konnten. Die Einstellung den Funktionsaufruf zu unterbrechen und nicht zu wiederholen ist aktiv.
EINVAL
Ein Parameter spezifiziert einen ungültigen Wert.
EMSGSIZE
Die Nachricht ist zu groß, um auf einmal gesendet zu werden.
ENETDOWN
Die Verbindung zum Netzwerk ist nicht mehr aktiv.
ENOBUFS
Das System konnte keinen internen Puffer bereitstellen. Die Operation kann gelingen, wenn wieder Speicherplatz frei wird. Die Ausgabe-Warteschlange für ein Netz-Interface ist voll. Dies führt generell dazu, dass das Interface aufhört zu senden, kann aber auf einem vorübergehenden Stau beruhen.
ENOTCONN
Für den Socket besteht keine Verbindung.
ENOTSOCK
Der Deskriptor s referenziert eine Datei, keinen Socket.
EPIPE
Der Socket ist nicht für Schreiben aktiviert, oder der Socket ist verbindungsorientiert und der Partner hat die Verbindung beendet.
Wenn der Socket vom Typ SOCK_STREAM ist, wird das Signal SIGPIPE für den aufrufenden Prozess generiert.
EWOULDBLOCK
Der Socket ist als nicht-blockierend markiert, und die geforderte Operation würde blockieren.
Siehe auch
connect(), getsockopt(), recv(), socket(), fcntl(), select(), write()