Rechercher une page de manuel
cmsg
Langue: pl
Version: 1998-10-02 (openSuse - 09/10/07)
Section: 3 (Bibliothèques de fonctions)
NAZWA
CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR - dostêp do danych pomocniczychSK£ADNIA
#include <sys/socket.h>struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *msgh);
struct cmsghdr *CMSG_NXTHDR(struct msghdr *msgh, struct cmsghdr *cmsg);
size_t CMSG_ALIGN(size_t length);
size_t CMSG_SPACE(size_t length);
size_t CMSG_LEN(size_t length);
unsigned char *CMSG_DATA(struct cmsghdr *cmsg);
struct cmsghdr { socklen_t cmsg_len; /* liczba bajtów danych, w³±czaj±c nag³ówek */ int cmsg_level; /* protokó³ ¼ród³owy */ int cmsg_type; /* zale¿ny od protoko³u typ */ /* nastêpuje po nim unsigned charcmsg_data[]; */ };
OPIS
Makrodefinicje te s³u¿± do tworzenia i dostêpu do komunikatów steruj±cych (zwanych równie¿ danymi pomocniczymi), które nie s± czê¶ci± gniazda. Te informacje steruj±ce mog± zawieraæ: interfejs, przez który pakiet zosta³ odebrany, ró¿ne rzadko u¿ywane pola nag³ówka, rozszerzony opis b³êdu, zestaw deskryptorów plików lub uwierzytelnieñ uniksowych. Na przyk³ad, komunikaty steruj±ce mog± s³u¿yæ do ustawiania dodatkowych pól nag³ówka, takich jak opcje IP, dla wysy³anych pakietów. Dane pomocnicze s± wysy³ane poprzez wywo³anie sendmsg(2) a otrzymywane poprzez wywo³anie recvmsg(2). Wiêcej informacji znajduje siê na stronach podrêcznika man dla tych poleceñ.Dane pomocnicze s± ci±giem struktur struct cmsghdr z dodanymi danymi. Dostêp do tego ci±gu powinien siê odbywaæ wy³±cznie poprzez opisane na tej stronie podrêcznika makrodefinicje, nigdy za¶ bezpo¶rednio. Dostêpne rodzaje komunikatów steruj±cych opisano na stronach podrêcznika dla poszczególnych protoko³ów. Maksymalny rozmiar bufora danych pomocniczych dla gniazda mo¿na ustawiæ za pomoc± sysctl-a net.core.optmem_max; patrz socket(7).
CMSG_FIRSTHDR zwraca wska¼nik do pierwszego cmsghdr w buforze danych pomocniczych zwi±zanym z przekazanym msghdr.
CMSG_NXTHDR zwraca nastêpny poprawny cmsghdr po przekazanym cmsghdr. Zwraca NULL, gdy brak dostatecznej ilo¶ci miejsca w buforze.
CMSG_ALIGN, zadana d³ugo¶æ, zwraca j± w³±czaj±c niezbêdne wyrównanie. Jest to wyra¿enie sta³e.
CMSG_SPACE zwraca liczbê bajtów elementu pomocniczego w³±czaj±c d³ugo¶æ, jak± zajmuj± przekazane dane. Jest to wyra¿enie sta³e.
CMSG_DATA zwraca wska¼nik do czê¶ci cmsghdr zawieraj±cej dane.
CMSG_LEN zwraca warto¶æ, która ma byæ przechowywana w elemencie cmsg_len struktury cmsghdr, bior±c pod uwagê wszelkie niezbêdne wyrównania. Jako argument pobiera d³ugo¶æ danych. Jest to wyra¿enie sta³e.
Aby utworzyæ dane pomocnicze, nale¿y najpierw zainicjalizowaæ element msg_controllen struktury msghdr d³ugo¶ci± bufora komunikatów steruj±cych. Nale¿y u¿yæ CMSG_FIRSTHDR dla msghdr, aby otrzymaæ pierwszy komunikat steruj±cy oraz CMSG_NEXTHDR, aby otrzymaæ wszystkie nastêpne. Dla ka¿dego komunikatu steruj±cego nale¿y zainicjalizowaæ cmsg_len (za pomoc± CMSG_LEN), inne pola nag³ówka cmsghdr oraz czê¶æ zawieraj±c± dane za pomoc± CMSG_DATA. Ostatecznie pole msg_controllen struktury msghdr powinno zawieraæ sumê CMSG_SPACE dla d³ugo¶ci wszystkich komunikatów steruj±cych w buforze. Wiêcej informacji dotycz±cych msghdr, znajduje siê w recvmsg(2).
Gdy bufor komunikatów steruj±cych jest za krótki, aby przechowaæ wszystkie komunikaty, ustawiany jest znacznik MSG_CTRUNC elementu msg_flags struktury msghdr.
PRZYK£AD
Nastêpuj±cy kod poszukuje opcji IP_TTL w otrzymanym buforze pomocniczym:-
struct msghdr msgh; struct cmsghdr *cmsg; int *ttlptr; int received_ttl; /* Otrzymywanie danych z zewn±trz do msgh */ for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL; cmsg = CMSG_NXTHDR(&msgh,cmsg) { if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_TTL) { ttlptr = (int *) CMSG_DATA(cmsg); received_ttl = *ttlptr; break; } } if (cmsg == NULL) { /* * B³±d: IP_TTL not jest w³±czone, za ma³y bufor lub * b³±d I/O. */ }
Poni¿szy kod przekazuje tablicê deskryptorów plików poprzez gniazdo Uniksa SCM_RIGHTS:
-
struct msghdr msg = {0}; struct cmsghdr *cmsg; int myfds[NUM_FD]; /* Zawiera przekazywane deskryptory plików. */ char buf[CMSG_SPACE(sizeof myfds)]; /* bufor danych pomocniczych */ int *fdptr; msg.msg_control = buf; msg.msg_controllen = sizeof buf; cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(sizeof(int) * NUM_FD); /* Inicjalizacja: */ fdptr = (int *)CMSG_DATA(cmsg); memcpy(fdptr, myfds, NUM_FD * sizeof(int)); /* Suma d³ugo¶ci wszystkich komunikatów steruj±cych w buforze: */ msg.msg_controllen = cmsg->cmsg_len;
UWAGI
Dla przeno¶no¶ci, dostêp do danych pomocniczych powinien siê odbywaæ jedynie za pomoc± opisanych tu makrodefinicji. CMSG_ALIGN jest rozszerzeniem Linuksa i nie powinno byæ u¿ywane w przeno¶nych programach.W Linuksie, CMSG_LEN, CMSG_DATA, i CMSG_ALIGN s± wyra¿eniami sta³ymi (zak³adaj±c, ¿e ich argument jest sta³y) - mo¿na to wykorzystaæ do zadeklarowania rozmiaru zmiennych globalnych. Jednak¿e, mo¿e siê to okazaæ nieprzeno¶nym.
ZGODNE Z
Ten model danych pomocniczych jest zgodny ze szkicem POSIX.1003.1g, z 4.4BSD-Lite, z zaawansowanym API dla IPv6 opisanym w RFC2292 oraz ze specyfikacj± Single Unix v2. CMSG_ALIGN jest rozszerzeniem Linuksa.ZOBACZ TAK¯E
sendmsg(2), recvmsg(2)RFC 2292
Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre