Gewusst wie: sockaddr_storage umwandeln und vermeiden, dass strenge Aliasing-Regeln verletzt werden

Ich verwende Beejs Netzwerkhandbuch und bin auf ein Aliasing-Problem gestoßen. Er schlägt eine Funktion vor, um entweder die IPv4- oder die IPv6-Adresse einer bestimmten Struktur zurückzugeben:

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  }

Dies führt dazu, dass GCC einen Strict-Aliasing-Fehler für ausgibtsa Wie ich es verstehe, liegt es daran, dass ich diese Funktion wie folgt aufrufe:

struct sockaddr_storage their_addr;
...
inet_ntop(their_addr.ss_family,
          get_in_addr((struct sockaddr *)&their_addr),
          connection_name,
          sizeof connection_name);

Ich vermute, das Aliasing hat damit zu tun, dass dastheir_addr Variable ist vom Typsockaddr_storage und ein anderer Zeiger eines anderen Typs zeigt auf den gleichen Speicher.

Ist der beste Weg, um dieses Haften zu umgehensockaddr_storage, sockaddr_in, undsockaddr_in6 in eine Gewerkschaft? Es scheint, als ob dies in der Vernetzung ein ausgetretenes Terrain sein sollte. Ich kann einfach keine guten Beispiele für Best Practices finden.

Wenn jemand genau erklären kann, wo das Aliasing-Problem auftritt, würde ich es sehr begrüßen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage