Subroutine sendmsg
Zweck
Sendet eine Nachricht von einem Socket unter Verwendung einer Nachrichtenstruktur.
Bibliothek
Standard-C-Bibliothek (libc.a)
Syntax
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:
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.
|
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. |