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