Subroutine sendmsg

Zweck

Sendet eine Nachricht von einem Socket unter Verwendung einer Nachrichtenstruktur.

Bibliothek

Standard-C-Bibliothek (libc.a)

Syntax

#include <sys/types.h>
#include <sys/socketvar.h>
#include <sys/socket.h>
int sendmsg ( Socket,  Message,  Flags)
int Socket;
const struct msghdr Message [ ];
int Flags;

Beschreibung

Die Subroutine sendmsg sendet Nachrichten über verbundene oder nicht verbundene Sockets unter Verwendung der Nachrichtenstruktur msghdr . Die Datei /usr/include/sys/socket.h enthält die Struktur msghdr und definiert die Strukturmember. In BSD 4.4wurden Größe und Member der msghdr -Nachrichtenstruktur geändert. Anwendungen, die die alte Struktur starten möchten, müssen mit COMPAT_43 kompiliert werden. Das Standardverhalten ist das von BSD 4.4.

Zum Broadcastbetrieb über ein Socket muss das Anwendungsprogramm zuerst eine Subroutine setsockopt mit der Option SO_BROADCAST ausgeben, um Broadcastberechtigungen zu erhalten.

Die Subroutine sendmsg unterstützt nur 15 Nachrichtenelemente.

Alle Anwendungen, die die Subroutine sendmsg enthalten, müssen mit einem bestimmten Wert für das Makro _BSD kompiliert werden. Zulässige Werte sind 43 und 44. Außerdem müssen alle Socketanwendungen die BSD-Bibliothek libbsd.a enthalten.

Die Routine sendmsg unterstützt IPv6 -Hilfsdatenelemente, wie in der Advanced Sockets API für IPv6definiert.

Parameter

Element Beschreibung
Socket Gibt den Socketdeskriptor an.
Nachricht Verweist auf die msghdr -Nachrichtenstruktur, die die zu sendende Nachricht enthält.
Flags Ermöglicht dem Absender die Steuerung der Nachrichtenübertragung. Die Datei sys/socket.h enthält den Parameter Flags . Der Parameter Flags , der zum Senden eines Aufrufs verwendet wird, wird durch logisches Verknüpfen eines oder beider der folgenden Werte mit OR gebildet:
MSG_OOB
Verarbeitet Außerbanddaten an Sockets, die SOCK_STREAMunterstützen.
Hinweis Der folgende Wert ist nicht für die allgemeine Verwendung bestimmt. Es ist ein Verwaltungstool, das für das Debugging oder für das Routing von Programmen verwendet wird.
MSG_NICHT_WEITERLEITEN
Sendet ohne Verwendung von Routing-Tabellen.
MSG_MPEG2
Gibt an, dass dieser Block ein MPEG2 -Block ist. Sie gilt nur für Sockets des Typs SOCK_CONN_DGRAM .

Rückgabewerte

Nach erfolgreicher Beendigung gibt die Subroutine sendmsg die Anzahl der gesendeten Zeichen zurück.

Wenn die Subroutine sendmsg nicht erfolgreich ist, führt der Systemhandler die folgenden Funktionen aus:

  • Gibt den Wert -1 an das aufrufende Programm zurück.
  • Verschiebt einen Fehlercode, der den spezifischen Fehler angibt, in die globale Variable errno .

Fehlercodes

Die Subroutine sendmsg ist nicht erfolgreich, wenn einer der folgenden Fehler auftritt:

Fehler Beschreibung
EACCES Der Schreibzugriff auf den benannten Socket wird verweigert oder der Socket, der versucht, ein Broadcastpaket zu senden, hat keine Broadcastfunktionalität.
EADDRNOTAVAIL Die angegebene Adresse ist keine gültige Adresse.
EAFNOSUPPORT Die angegebene Adresse ist keine gültige Adresse für die Adressfamilie dieses Sockets.
EBADF Der Parameter Socket ist ungültig.
ECONNRESET Das Schließen einer Verbindung wurde von einem Peer erzwungen.
EDESTADDRREQ Der Socket befindet sich nicht im Verbindungsmodus und hat keine definierte Peeradresse.
EFAULT Der Parameter Address befindet sich nicht in einem beschreibbaren Teil des Benutzeradressraums.
EHOSTUNREACH Der Zielhost kann nicht erreicht werden.
EINTR Ein Signal unterbrach die Subroutine sendmsg , bevor Daten übertragen wurden.
EINVAL Die Länge der msghdr -Struktur ist ungültig.
EISVerbindung (EISCONN) Ein SOCK_DGRAM -Socket ist bereits verbunden.
EMSGSIZE Die Nachricht ist zu groß, um auf einmal gesendet zu werden (wie für das Socket erforderlich), oder das msg_iovlen -Member der msghdr -Struktur, auf die der Parameter Messages verweist, ist kleiner-gleich 0 oder größer als IOV_MAX.
ENOENT Der Pfadname verweist nicht auf eine vorhandene Datei oder der Pfadname ist eine leere Zeichenfolge.
ENETUNREACH Das Zielnetz ist nicht erreichbar.
ENOBUFS Das System hat keinen Speicher mehr für eine interne Datenstruktur.
ENOMEM Der verfügbare Datenspeicherbereich im Speicher ist nicht groß genug, um Gruppen-oder ACL-Informationen aufzunehmen.
ENOPROTOOPT (ENOPROTOOPT) Das Protokoll wird nicht unterstützt (64 Bit).
ENOTCONN Der Socket befindet sich im Verbindungsmodus, ist aber nicht verbunden.
ENOTSOCK (ENOTSOCK) Der Parameter Socket verweist auf eine Datei, nicht auf einen Socket.
EOPNOTSUPP Das Socketargument ist einem Socket zugeordnet, der mindestens einen der in Flags festgelegten Werte nicht unterstützt.
EPIPE Es wurde versucht, an ein Socket zu senden, das verbunden war, aber die Verbindung wurde entweder vom fernen Peer oder von dieser Seite der Verbindung beendet. Wenn der Socket den Typ SOCK_STREAMhat, wird das Signal SIGPIPE für den aufrufenden Prozess generiert.
EWOULDBLOCK Der Socket wird als nicht blockierend markiert und es sind keine Verbindungen vorhanden, die akzeptiert werden können.