gpt4 book ai didi

c - 如何转换 sockaddr_storage 并避免违反严格的别名规则

转载 作者:太空狗 更新时间:2023-10-29 16:24:55 25 4
gpt4 key购买 nike

我在使用 Beej 的网络指南时遇到了别名问题。他提出了一个函数来返回特定结构的 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_storagesockaddr_insockaddr_in6 粘在一起的最佳方法是什么?看起来这应该是网络中的老土,我只是找不到任何具有最佳实践的好例子。

此外,如果有人能准确解释别名问题发生的位置,我将不胜感激。

最佳答案

我倾向于这样做是为了让 GCC 对 type-punning 做正确的事情,这是 union 明确允许的:


/*! Multi-family socket end-point address. */
typedef union address
{
struct sockaddr sa;
struct sockaddr_in sa_in;
struct sockaddr_in6 sa_in6;
struct sockaddr_storage sa_stor;
}
address_t;

关于c - 如何转换 sockaddr_storage 并避免违反严格的别名规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1429645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com