【问题标题】: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_insockaddr_in6 结构,然后将 memcpy 它们放入 sockaddr_storage以后可以使用的结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多