我正在编写一个可以同时连接到IPv4和IPv6地址的客户端,使代码尽可能完整。
我使用了getaddrinfo
函数,我传递了IP地址的字符串,从中我获得了地址族(此时我知道它是IPv4还是IPv6)。现在我需要将该地址和端口绑定到sockaddr结构。我已经读过为了使它更通用我应该使用sockaddr_storage然后通过将它转换为sockaddr来使用它,但我不明白如何使用连接所需的地址和端口填充sockaddr_storage。
感谢您的关注。
NB。我希望它能在UNIX上运行。
答案 0 :(得分:1)
POSIX specification仅表示sockaddr_storage
应为
足以容纳所有支持的协议特定地址结构
在适当的边界对齐,以便指向它的指针可以作为指向协议特定地址结构的指针,并用于访问这些结构的字段而不会出现对齐问题
和
sockaddr_storage结构应至少包含以下成员:
sa_family_t ss_family
有一些说明说所有family
- 家庭结构的sockaddr
结构成员将在同一个地方,但就是这样。
所以我会说,使用它的“最佳”方式是为IPv4和IPv6提供特殊情况,填充正确的sockaddr_in
或sockaddr_in6
结构,然后memcpy
将它们转换为sockaddr_storage
结构,以后可以使用。