【问题标题】:Creating and connecting a socket indipendently from the IP version using sockaddr_storage使用 sockaddr_storage 从 IP 版本独立创建和连接套接字
【发布时间】:2017-08-25 17:18:24
【问题描述】:
我正在编写一个可以连接到 IPv4 和 IPv6 地址的客户端,使代码尽可能通用。
我使用getaddrinfo函数将IP地址的字符串传递给它,并从中获得地址系列(此时我知道它是IPv4还是IPv6)。现在我需要将该地址和端口绑定到一个 sockaddr 结构。我已经读过,为了使其通用,我应该使用 sockaddr_storage,然后通过将其转换为 sockaddr 来使用它,但我不明白如何用连接所需的地址和端口填充 sockaddr_storage。
感谢您的关注。
注意。我希望它可以在 UNIX 上运行。
【问题讨论】:
标签:
c
sockets
unix
network-programming
【解决方案1】:
POSIX specification 只表示sockaddr_storage 应该是
和
sockaddr_storage 结构应至少包含以下成员:
sa_family_t ss_family
有一些注释说所有sockaddr-family 结构的family 结构成员将在同一个位置,但仅此而已。
所以我会说使用它的“最佳”方法是为 IPv4 和 IPv6 设置特殊情况,填充正确的 sockaddr_in 或 sockaddr_in6 结构,然后将 memcpy 它们放入 sockaddr_storage以后可以使用的结构。