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

questionAnswers(4)

yourAnswerToTheQuestion