Как разыграть sockaddr_storage и избежать нарушения правил строгого наложения имен

Я использую Руководство Биджа по работе с сетями и столкнулся с проблемой псевдонимов. Он предлагает функцию, которая возвращает адрес IPv4 или IPv6 определенной структуры:

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  }

Это заставляет GCC выплевывать ошибку строгого наложения дляса на строке 3. Как я понимаю, это потому, что я вызываю эту функцию так:

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

Я предполагаю, что псевдонимы связаны с тем, чтоtheir_addr переменная имеет типsockaddr_storage и другой указатель другого типа указывает на ту же память.

Это лучший способ обойти это прилипаниеsockaddr_storage, sockaddr_in, а такжеsockaddr_in6 в союз? Кажется, что это должно быть изношенной территорией в сети, я просто не могу найти хороших примеров с лучшими практиками.

Кроме того, если кто-нибудь может объяснить, где именно возникает проблема с алиасами, я был бы очень признателен.

Ответы на вопрос(4)

Ваш ответ на вопрос