Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

recvmsg() - Nachricht von einem Socket empfangen

&pagelevel(4)&pagelevel



#include <sys.types.h>
#include <sys.socket.h>
#include <sys.uio.h>

 
Kernighan-Ritchie-C:
int recvmsg(s, msg, flags);

int s;
flags struct msghdr *msg;

ANSI-C:
int recvmsg(int s, struct msghdr* msg, int flags);


Beschreibung

Die Funktion recvmsg() wird in den Adressfamilien AF_INET, AF_INET6 und AF_ISO unterstützt und bietet je nach Parametrisierung (Parameter msg) folgende Funktionalität:

  • Am Socket s können mit recvmsg() Benutzerdaten vom Partner-Socket empfangen werden.

  • Nur in AF_ISO: Mit recvmsg() können Verbindungsdaten aus dem Socket s gelesen 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 recvmsg() ausgewählt:

  • Wenn msg->msg_control der Null-Zeiger ist, werden Benutzerdaten empfangen.

  • 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 aus dem Socket gelesen.

    Aufgrund des internen Socket-Status von s wählt recvmsg() den Verbindungsdatentyp (CONN_DATA, CFRM_DATA oder DISC_DATA) aus und schreibt die zugehörigen Daten in den Datenbereich von msg->msg_control (siehe Strukturen msghdr und cmsghdr auf der nächsten Seite).

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

   


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 können im verbindungslosen Betrieb verschiedene Informationen zurückliefern:
1: Das Flag MSG_ERRQUEUE ist gesetzt und es wird ein Fehlerpaket empfangen: Ziel-Adresse und dessen Länge
2: Das Flag MSG_ERRQUEUE ist gesetzt und es wird kein Fehlerpaket empfangen: Die Felder werden nicht beschrieben und recvmsg() gibt -1 zurück
3: Das Flag MSG_ERRQUEUE ist nicht gesetzt und es wird ein Fehlerpaket empfangen: Die Felder werden nicht beschrieben
4: Das Flag MSG_ERRQUEUE ist nicht gesetzt und es wird kein Fehlerpaket empfangen: Adresse des Absenders des gerade empfangenen Pakets und dessen Länge

Ist msg_name nicht Null, dann wird der Inhalt als Zeiger auf einen Puffer interpretiert, in dem die Partner-Adressinformation eingetragen wird. msg_namelen gibt die Länge dieses Puffers an. Ist der Socket „non-connected“, so wird die Adressinformation des Absenders mit einer sockaddr-Struktur hinterlegt und msg_namelen enthält die Länge dieser Struktur.

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, in die die Funktion recvmsg() die erwarteten Verbindungsdaten einträgt.
msg->msg_controllen spezifiziert die Länge von *msg->msg_control.
msg->msg_flags = MSG_EOR kennzeichnet das Satzende (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      iov_len;    /* 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 durch Angabe des Protokoll-Levels beschrieben, welche Informationen sich im Datenbereich befinden.
cmsg->cmsg_type liefert durch einen Options-Wert weitere Informationen zum Datenbereich.
Im Datenbereich (zugreifbar über das Makro CMSG_DATA) werden die entsprechenden Daten sowie das abschließende NULL-Byte eingetragen.

Der Parameter flags kann derzeit mit folgenden Flags versehen werden:

  • MSG_PEEK (nur bei Datagramm-Sockets):

MSG_PEEK bewirkt, dass die Daten gelesen werden können, ohne dass sie an der Quelle gelöscht werden. Darum ist ein Wiederholungslesen erforderlich. 

  • MSG_ERRQUEUE (nur bei Datagramm- und Raw-Sockets):

MSG_ERRQUEUE bewirkt, dass detailliertere Informationen im Fehlerfall abgerufen werden können. Die Daten werden in msg_iov und das Fehlerprotokoll in msg_control geschrieben.

Returnwert

>0:

bei Erfolg:
Anzahl Bytes der empfangenen Benutzerdaten

=0:

  • nur AF_ISO
    bei Verbindungsdaten (CONN_DATA, CFRM_DATA, DISC_DATA)

  • AF_INET, AF_INET6
    Es können keine Daten mehr empfangen werden. Der Partner hat seine Verbindung geordnet abgebaut (nur bei Sockets vom Typ SOCK_STREAM).

    Bei Sockets vom Typ SOCK_DGRAM wurde ein Datenpaket mit der Länge 0 empfangen, oder die Daten sind wegen Timeout vom Transportsystem gelöscht worden.

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

EFAULT

Das Flag MSG_ERRQUEUE ist gesetzt worden und es ist kein Fehlerpaket vorhanden

EINVAL

Ein Parameter spezifiziert einen ungültigen Wert.

ENETDOWN

Die Verbindung zum Netzwerk ist nicht mehr aktiv.

ENOTCONN

Für den Socket besteht keine Verbindung.

EOPNOTSUPP

Der Funktionsaufruf enthält unzulässige Attribute.

EPIPE

Der Partner hat die Verbindung abgebrochen.

EWOULDBLOCK

Der Socket ist als nicht-blockierend markiert, und die geforderte Operation würde blockieren.