Как разыграть 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
в союз? Кажется, что это должно быть изношенной территорией в сети, я просто не могу найти хороших примеров с лучшими практиками.
Кроме того, если кто-нибудь может объяснить, где именно возникает проблема с алиасами, я был бы очень признателен.