Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

CMSG-Makros

&pagelevel(3)&pagelevel

Mithilfe von einigen Makros können verschiedene Informationen aus der Struktur cmsghdr gewonnen werden. Dies ist in etwa notwendig, um manche Socketoptionen (siehe getsockopt(), setsockopt() - Socket-Optionen abfragen und ändern) und detaillierte Fehlermeldungen (siehe Fehleranalyse) auszulesen.

Diese Funktionialität erfordert BCAM V25 oder neuer.

Die Makros sind wie folgt definiert:

#include <sys/socket.h>
struct cmsghdr  *CMSG_FIRSTHDR(struct msghdr *msg);
struct cmsghdr  *CMSG_NXTHDR(struct msghdr *msg, struct cmsghdr *cmsg);
int             CMSG_ALIGN(int length);
int             CMSG_SPACE(int length);
int             CMSG_LEN(int length);
unsigned char   *CMSG_DATA(struct cmsghdr *cmsg);


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;


Die Struktur cmsghdr sollte niemals direkt verändert werden. Stattdessen wird empfohlen, die folgenden Makros zu benutzen.

CMSG_FIRSTHDR(struct msghdr *msg)

übergibt einen Zeiger zu dem ersten zur Struktur msghdr zugehörigen cmsghdr. Es wird NULL zurückgegeben, falls nicht genügend Platz im Speicher ist.

CMSG_NXTHDR(struct msghdr *msg, struct cmsghdr *cmsg)

übergibt einen Zeiger zum nächsten gültigen auf cmsghdr folgenden cmsghdrEs wird NULL zurückgegeben, falls nicht genügend Platz im Speicher ist. CMSG_NEXTHDR kann auch an Stelle von CMSG_FIRSTHDR benutzt werden, wenn statt einer gültigen Struktur cmsghdr 0 übergeben wird.

CMSG_ALIGN(int length)

passt die übergebene Länge unter Berücksichtigung von eventuellen Verschiebungen im Speicher an und gibt sie anschließend zurück.

CMSG_SPACE(int length)

gibt die Gesamtlänge des cmsghdr zurück, unter der Annahme, dass der Datenbereich length Speicher benötigt. Der Rückgabewert wird lediglich durch length beeinflusst. Das Padding und der Pufferbereich zwischen zwei cmsghdr wird dabei berücksichtigt.

CMSG_DATA(struct cmsghdr *cmsg)

übergibt einen Zeiger zum Datenbereich der Struktur cmsghdr. Der übergebene Zeiger ist nicht unbedingt korrekt ausgerichtet, daher sollten sämtliche Operationen mit memcpy() vorgenommen werden.

CMSG_LEN(int length)

gibt den Wert für cmsg->cmsg_len zurück. Die Länge entspricht der Länge des gesamten cmsghdrs, unter der Annahme, dass der Datenbereich length Speicher benötigt. Das Padding wird dabei berücksichtigt, aber nicht der Pufferbereich zwischen zwei cmsghdr.