Provided by:
manpages-pl-dev_20060617-3_all 
NAZWA
CMSG_ALIGN, CMSG_SPACE, CMSG_NXTHDR, CMSG_FIRSTHDR - dostp do danych
pomocniczych
SK/LADNIA
#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 bajtow danych, wlczajc naglowek */
int cmsg_level; /* protokol rodlowy */
int cmsg_type; /* zaleny od protokolu typ */
/* nastpuje po nim unsigned charcmsg_data[]; */
};
OPIS
Makrodefinicje te slu do tworzenia i dostpu do komunikatow sterujcych
(zwanych rownie danymi pomocniczymi), ktore nie s czci gniazda. Te
informacje sterujce mog zawiera: interfejs, przez ktory pakiet zostal
odebrany, rone rzadko uywane pola naglowka, rozszerzony opis bldu,
zestaw deskryptorow plikow lub uwierzytelnie uniksowych. Na przyklad,
komunikaty sterujce mog sluy do ustawiania dodatkowych pol naglowka,
takich jak opcje IP, dla wysylanych pakietow. Dane pomocnicze s
wysylane poprzez wywolanie sendmsg(2) a otrzymywane poprzez wywolanie
recvmsg(2). Wicej informacji znajduje si na stronach podrcznika man
dla tych polece.
Dane pomocnicze s cigiem struktur struct cmsghdr z dodanymi danymi.
Dostp do tego cigu powinien si odbywa wylcznie poprzez opisane na tej
stronie podrcznika makrodefinicje, nigdy za bezporednio. Dostpne
rodzaje komunikatow sterujcych opisano na stronach podrcznika dla
poszczegolnych protokolow. Maksymalny rozmiar bufora danych
pomocniczych dla gniazda mona ustawi za pomoc sysctl-a
net.core.optmem_max; patrz socket(7).
CMSG_FIRSTHDR zwraca wskanik do pierwszego cmsghdr w buforze danych
pomocniczych zwizanym z przekazanym msghdr.
CMSG_NXTHDR zwraca nastpny poprawny cmsghdr po przekazanym cmsghdr.
Zwraca NULL, gdy brak dostatecznej iloci miejsca w buforze.
CMSG_ALIGN, zadana dlugo, zwraca j wlczajc niezbdne wyrownanie. Jest to
wyraenie stale.
CMSG_SPACE zwraca liczb bajtow elementu pomocniczego wlczajc dlugo, jak
zajmuj przekazane dane. Jest to wyraenie stale.
CMSG_DATA zwraca wskanik do czci cmsghdr zawierajcej dane.
CMSG_LEN zwraca warto, ktora ma by przechowywana w elemencie cmsg_len
struktury cmsghdr, biorc pod uwag wszelkie niezbdne wyrownania. Jako
argument pobiera dlugo danych. Jest to wyraenie stale.
Aby utworzy dane pomocnicze, naley najpierw zainicjalizowa element
msg_controllen struktury msghdr dlugoci bufora komunikatow sterujcych.
Naley uy CMSG_FIRSTHDR dla msghdr, aby otrzyma pierwszy komunikat
sterujcy oraz CMSG_NEXTHDR, aby otrzyma wszystkie nastpne. Dla kadego
komunikatu sterujcego naley zainicjalizowa cmsg_len (za pomoc
CMSG_LEN), inne pola naglowka cmsghdr oraz cz zawierajc dane za pomoc
CMSG_DATA. Ostatecznie pole msg_controllen struktury msghdr powinno
zawiera sum CMSG_SPACE dla dlugoci wszystkich komunikatow sterujcych w
buforze. Wicej informacji dotyczcych msghdr, znajduje si w recvmsg(2).
Gdy bufor komunikatow sterujcych jest za krotki, aby przechowa
wszystkie komunikaty, ustawiany jest znacznik MSG_CTRUNC elementu
msg_flags struktury msghdr.
PRZYK/LAD
Nastpujcy kod poszukuje opcji IP_TTL w otrzymanym buforze pomocniczym:
struct msghdr msgh;
struct cmsghdr *cmsg;
int *ttlptr;
int received_ttl;
/* Otrzymywanie danych z zewntrz 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) {
/*
* Bld: IP_TTL not jest wlczone, za maly bufor lub
* bld I/O.
*/
}
Poniszy kod przekazuje tablic deskryptorow plikow poprzez gniazdo
Uniksa SCM_RIGHTS:
struct msghdr msg = {0};
struct cmsghdr *cmsg;
int myfds[NUM_FD]; /* Zawiera przekazywane deskryptory plikow. */
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 dlugoci wszystkich komunikatow sterujcych w buforze: */
msg.msg_controllen = cmsg->cmsg_len;
UWAGI
Dla przenonoci, dostp do danych pomocniczych powinien si odbywa jedynie
za pomoc opisanych tu makrodefinicji. CMSG_ALIGN jest rozszerzeniem
Linuksa i nie powinno by uywane w przenonych programach.
W Linuksie, CMSG_LEN, CMSG_DATA, i CMSG_ALIGN s wyraeniami stalymi
(zakladajc, e ich argument jest staly) - mona to wykorzysta do
zadeklarowania rozmiaru zmiennych globalnych. Jednake, moe si to okaza
nieprzenonym.
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 TAKE
sendmsg(2), recvmsg(2)
RFC 2292
INFORMACJE O T/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.