Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

send(), sendto(), sendmsg() - Nachricht von Socket zu Socket senden

&pagelevel(4)&pagelevel

#include <sys/socket.h> 
#include <netinet/in.h>

ssize_t send(int s, const void *msg, size_t len, int flags);
ssize_t sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to,
               size_t tolen);
ssize_t sendmsg(int s, const struct msghdr *msg, int flags);

Beschreibung

Die Funktionen send(), sendto() und sendmsg() senden Nachrichten von einem Socket an einen anderen. send() kann nur bei einem Socket benutzt werden, über den eine Verbindung aufgebaut ist (siehe Funktion connect()). sendto() und sendmsg() können immer verwendet werden.

Der Parameter s bezeichnet den Socket, von dem eine Nachricht gesendet wird. Die Zieladresse wird mit to übergeben, wobei tolen die Größe der Zieladresse angibt.

Die Länge der Nachricht wird mit len angegeben. Wenn die Nachricht zu lang ist, um von der darunter liegenden Protokollebene vollständig transportiert zu werden, wird der Fehler EMSGSIZE geliefert und die Nachricht wird nicht übermittelt.

Der Parameter flags wird zurzeit nicht unterstützt. Ein Wert ungleich 0 führt zu einem Fehler, wobei die Variable errno auf den Wert EOPNOTSUPP gesetzt wird.

Empfängt der Prozess, der send(), sendmsg() oder sendto() aufruft, ein Signal, bevor irgendwelche Daten zum Senden gepuffert wurden, so 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 Handbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen").

Die Funktion sendmsg() verwendet die Struktur msghdr, um die Anzahl der direkt zu versorgenden Parameter zu verringern. Die Struktur msghdr ist in der Include-Datei <sys/socket.h> wie folgt definiert:

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 spezifizieren die Zieladresse, wenn der Socket keine aufgebaute Verbindung hat. Für msg_name kann der Null-Zeiger übergeben werden, wenn keine Namen gewünscht oder gefordert werden. Wie Sie dem Socket eine Adresse zuweisen erläutert der Abschnitt "Socket-Adressierung".

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 gesendeten Bytes an.

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

EDESTADDRREQ

Der Socket ist nicht verbindungsorientiert, ein fester Partner wurde nicht festgelegt und im Aufruf wurde kein Partner angegeben.

EFAULT

Die Daten sollen in einen nicht vorhandenen oder geschützten Teil des Prozess-Adressbereichs gesendet werden.

EHOSTUNREACH

Der Zielrechner ist nicht erreichbar.

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

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

EOPNOTSUPP

Der Parameter flags oder msg->msg_accrights wurde spezifiziert. Dies wird jedoch nicht unterstützt.

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.

EAFNOSUPPORT

Adressen der bei sendto() bzw. sendmsg() angegebenen Adressfamilie können mit diesem Socket nicht verwendet werden.

Wenn AF_UNIX die Adressfamilie des Sockets ist, kann die Ausführung von send(), sendto() und sendmsg() auch aus folgenden Gründen zu einem Fehler führen:

EACCES

Für eine Komponente des Pfadnamens wird die Zugriffsberechtigung verweigert, oder die Berechtigung zum Schreiben auf den angegebenen Socket wird verweigert.

ENAMETOOLONG

Eine Komponente eines Pfadnamens überschreitet NAME_MAX Zeichen, oder der gesamte Pfadname ist länger als PATH_MAX Zeichen.

ENOENT

Eine Komponente des Pfadnamens verweist auf eine nicht vorhandene Datei, oder der Pfadname ist leer.

ENOTDIR

Eine Komponente im Pfadnamen ist kein Verzeichnis.

Siehe auch

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