#include <sys.types.h>
#include <sys.socket.h>
#include <sys.uio.h>
Kernighan-Ritchie-C:
int sendmsg(s, msg, flags);
int s, flags;
struct msghdr *msg;
ANSI-C:
int sendmsg(int s, struct msghdr* msg, int flags);
Beschreibung
Die Funktion sendmsg() wird in den Adressfamilien AF_INET, AF_INET6 und AF_ISO unterstützt und bietet je nach Parametrisierung (Parameter msg) folgende Funktionalität:
Mit sendmsg() können Benutzerdaten von einem Socket an einen Partner-Socket gesendet werden.
Nur in AF_ISO: Mit sendmsg() können Verbindungsdaten in einen Socket s geschrieben werden.
Als aktueller Parameter für msg ist ein Zeiger auf ein Objekt vom Datentyp struct msghdr anzugeben. Über die Komponente msg->msg_control (Datentyp caddr_t bzw. char *) wird die gewünschte Funktionalität von sendmsg() ausgewählt:
Wenn msg->msg_control der Null-Zeiger ist, werden Benutzerdaten gesendet.
Nur in AF_ISO: Wenn msg->msg_control nicht der Null-Zeiger ist, wird msg->msg_control als ein Zeiger auf einen Speicherbereich mit der Struktur cmsghdr interpretiert, und es werden Verbindungsdaten in den Socket geschrieben.
Auf diese Weise ermöglicht es sendmsg() in AF_ISO, die Quittung für eine Verbindungsanforderung an den Kommunikationspartner zu senden, ohne dass Benutzerdaten oder Verbindungsdaten übertragen werden.
Struktur msghdr
Die Struktur msghdr ist in <sys.socket.h> wie folgt deklariert:
struct msghdr { caddr_t msg_name; /* Ziel-Adresse */ int msg_namelen; /* Länge der Ziel-Adresse */ struct iovec *msg_iov; /* scatter/gather-Felder */ int msg_iovlen; /* Anzahl der Elemente in msg_iov */ caddr_t msg_control; /* Hilfsdaten */ int msg_controllen; /* Länge des Puffers für Hilfsdaten */ int msg_flags; /* Flag für empfangene Nachricht */ }; struct msghdr *msg;
msg->msg_name und msg->msg_namelen werden nur in den Adressfamilien AF_INET und AF_INET6 mit dem Socket-Typ SOCK_DGRAM ausgewertet. msg_name gibt die Adresse einer Socket-Adress-Struktur und msg_namelen die Länge dieser Adress-Struktur an.
Wenn diese Parameter nicht genutzt werden sollen, sollte msg_name den Wert des NULL-Zeigers und msg_namelen den Wert 0 haben.
msg->msg_iov ist ein Zeiger auf einen Speicherbereich mit Objekten vom Typ struct iovec. msg->msg_iovlen gibt die Anzahl der Elemente (max. 16) dieses Speicherbereiches an.msg->msg_control ist ein Zeiger auf ein Objekt vom Typ struct cmsghdr, das vor Aufruf von sendmsg() mit den zu schreibenden Verbindungsdaten versorgt werden muss (nur AF_ISO).msg->msg_controllen spezifiziert die Länge von *msg->msg_control.
In msg->msg_flags kennzeichnet sendmsg() das Satzende mit MSG_EOR (nur AF_ISO).
Struktur iovec
Die Struktur iovec ist in <sys.uio.h> wie folgt deklariert:
struct iovec{ caddr_t iov_base; /* Puffer für Hilfsdaten */ int iovlen; /* Pufferlänge */ };
Struktur cmsghdr
Die Struktur cmsghdr ist in <sys.socket.h> wie folgt deklariert:
struct cmsghdr { u_int cmsg_len; /* Anzahl der Datenbytes inkl. Header */ int cmsg_level; /* erzeugendes Protokoll */ int cmsg_type; /* protokollspezifischer Typ */ /* gefolgt von u_char cmsg_data[] */ }; struct cmsghdr *cmsg;
cmsg->cmsg_len enthält die Länge des Speicherbereiches von *msg->msg_control.
In cmsg->cmsg_level wird SOL_TRANSPORT für den ISO-Transport-Service eingetragen. cmsg->cmsg_type kennzeichnet den Verbindungsdatentyp (TPOPT_CONN_DATA, TPOPT_CFRM_DATA, TPOPT_DISC_DATA).
Im Datenbereich werden die Verbindungsdaten sowie das abschließende NULL-Byte eingetragen.
Für die Handoff-Prozedur werden TPOPT_REDI_DATA und TPOPT_REDI_BDOK angeboten. Hier wird die Struktur cmsg_redhdr benötigt. Beschreibung siehe Kapitel „Erweiterte Funktionen von SOCKETS(BS2000)".
Returnwert
>=0:
Anzahl Bytes der gesendeten Benutzerdaten
AF_ISO: 0 bei Verbindungsdaten (CONN_DATA, CFRM_DATA, DISC_DATA)
-1:
bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.
Fehleranzeige durch errno
EBADF
Der Parameter s ist kein gültiger Deskriptor.
ECONNRESET
Die Verbindung zum Partner wurde abgebrochen.
EINVAL
Ein Parameter spezifiziert einen ungültigen Wert.
EIO
E/A-Fehler. Die Nachricht konnte nicht an das Transportsystem übergeben werden.
ENETDOWN
Die Verbindung zum Netzwerk ist nicht mehr aktiv.
ENOTCONN
Für den Socket besteht keine Verbindung.
EOPNOTSUPP
Der Funktionsaufruf enthält falsche Attribute.
EPIPE
Der Partner hat die Verbindung abgebrochen.
EWOULDBLOCK
Der Socket ist als nicht-blockierend markiert, und die geforderte Operation würde blockieren.