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

问题描述:

我正在编写一个客户端,它既可以连接到IPv4地址,也可以连接IPv6地址,从而尽可能使代码尽可能通用。 我用getaddrinfo函数传递IP地址的字符串,并从中获得地址族(此时我知道它是IPv4还是IPv6)。现在我需要将该地址和端口绑定到sockaddr结构。我读过,为了使它通用,我应该使用sockaddr_storage,然后通过将其转换为sockaddr来使用它,但我不知道如何用连接所需的地址和端口填充sockaddr_storage。使用sockaddr_storage独立于IP版本创建和连接套接字

感谢您的关注。

注意:我希望它能在UNIX上工作。

POSIX specification只是说sockaddr_storage应该

  • 大到足以容纳一个适当的边界对齐,使指针它可以对所有支持的特定协议的地址结构

  • 作为指向特定于协议的地址结构的指针并用于访问那些没有对齐问题的结构的字段

而且

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

sa_family_t ss_family

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

所以,我要说的是,“最好”的方式来使用它是对IPv4和IPv6的特殊情况下,在正确的sockaddr_in或结构填充,然后memcpy他们进入以后可以使用sockaddr_storage结构。

+0

谢谢!这解决了我的问题。 – Mdp11