我正在使用 Beej's 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 在第 3 行为sa吐出严格别名错误。据我了解,这是因为我这样调用此函数:
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
?看起来这应该是网络中的老旧领域,我只是找不到任何具有最佳实践的好例子。
另外,如果有人能准确解释混叠问题发生的位置,我将不胜感激。