Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

sendmsg() - Nachricht von Socket zu Socket senden

&pagelevel(4)&pagelevel



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