使用sockaddr_storage从IP版本独立创建和连接套接字

时间:2017-03-31 12:23:53

标签: c sockets unix network-programming

我正在编写一个可以同时连接到IPv4和IPv6地址的客户端,使代码尽可能完整。 我使用了getaddrinfo函数,我传递了IP地址的字符串,从中我获得了地址族(此时我知道它是IPv4还是IPv6)。现在我需要将该地址和端口绑定到sockaddr结构。我已经读过为了使它更通用我应该使用sockaddr_storage然后通过将它转换为sockaddr来使用它,但我不明白如何使用连接所需的地址和端口填充sockaddr_storage。

感谢您的关注。

NB。我希望它能在UNIX上运行。

1 个答案:

答案 0 :(得分:1)

POSIX specification仅表示sockaddr_storage应为

  
      
  • 足以容纳所有支持的协议特定地址结构

  •   
  • 在适当的边界对齐,以便指向它的指针可以作为指向协议特定地址结构的指针,并用于访问这些结构的字段而不会出现对齐问题

  •   

  

sockaddr_storage结构应至少包含以下成员:

     

sa_family_t ss_family

有一些说明说所有family - 家庭结构的sockaddr结构成员将在同一个地方,但就是这样。

所以我会说,使用它的“最佳”方式是为IPv4和IPv6提供特殊情况,填充正确的sockaddr_insockaddr_in6结构,然后memcpy将它们转换为sockaddr_storage结构,以后可以使用。