Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

write(), writev() - Nachricht von Socket zu Socket senden

&pagelevel(4)&pagelevel

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

#include <sys/uio.h>

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

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