Jak rzucać sockaddr_storage i unikać łamania reguł ścisłego aliasingu
Korzystam z przewodnika Beej's Guide to Networking i natknąłem się na problem aliasingu. Proponuje funkcję zwracającą adres IPv4 lub IPv6 określonej struktury:
1 void *get_in_addr( struct sockaddr *sa )
2 {
3 if (sa->sa_family == AF_INET)
4 return &(((struct sockaddr_in*)sa)->sin_addr);
5 else
6 return &(((struct sockaddr_in6*)sa)->sin6_addr);
7 }
Powoduje to, że GCC wypluwa błąd ścisłego aliasingusa w linii 3. Jak rozumiem, to dlatego, że nazywam tę funkcję tak:
struct sockaddr_storage their_addr;
...
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr),
connection_name,
sizeof connection_name);
Zgaduję, że aliasing ma związek z faktem, żetheir_addr
zmienna jest typusockaddr_storage
a inny wskaźnik innego typu wskazuje na tę samą pamięć.
To najlepszy sposób na obejście tego problemusockaddr_storage
, sockaddr_in
, isockaddr_in6
w związek? Wygląda na to, że w sieciach powinno być dobrze zużyte, po prostu nie mogę znaleźć dobrych przykładów z najlepszymi praktykami.
Ponadto, jeśli ktoś może wyjaśnić dokładnie, gdzie ma miejsce problem aliasingu, bardzo bym to docenił.