gpt4 book ai didi

sockets - 使用 sockaddr_storage 的 API

转载 作者:行者123 更新时间:2023-12-02 08:57:40 26 4
gpt4 key购买 nike

我正在尝试进行一些与 IP 无关的编码,并且根据各种来源的建议,我尝试使用 sockaddr_storage。然而,所有 API 调用(getaddrinfo、getnameinfo)仍然依赖于 struct sockaddr。在它们之间进行转换并不完全是一个好的选择,会引起许多其他问题。

分别转换为 sockaddr_in 和 sockaddr_in6 有点违背了我尝试使用 sockaddr_storage 的目的。

任何在开发简单的客户端服务器套接字应用程序时有效使用 sockaddr_storage 的人。

最佳答案

联合进行 IPV6 和 IPV4 编程的问题是纯 sockaddr 结构本身不足以容纳 sockaddr_in6。因此,如果您需要盲目地传递可能是 sockaddr_in 或 sockaddr_in6 的地址,则 sockaddr_storage 更容易使用。

最终,无论您使用的是 sockaddr_in、sockaddr_in6 还是 sockaddr_storage,您都必须转换这些指针来调用 sendto、recvfrom、connect、accept 和许多其他套接字函数。这只是套接字编程的一个已知的细微差别。只要放下做不安全事情的感觉即可。你的代码就没问题。

现在,在编写适用于 IPV4 和 IPV6 的网络代码时,您很容易陷入使用大量 switch 语句来处理不同网络类型的陷阱。然后代码就会变得困惑,如下所示:

if (addr.ss_family == AF_INET)
sendto(sock, buffer, len, 0, (sockaddr*)&addr, sizeof(sockaddr_in))
else (addr.ss_family == AF_INET6)
sendto(sock, buffer, len, 0, (sockaddr*)&addr, sizeof(sockaddr_in6));

然后这种类型的“if family == AF_INET”表达式很容易开始一遍又一遍地重复。这就是您想要避免的情况。

假设您使用 C++,您会发现套接字地址对象的抽象类非常有用。我在github上有一个例子herehere 。 CSocketAddress 类由 {sockaddr, sockaddr_in, sockaddr_in6} 的联合支持,并且可以使用 sockaddr_storage 构造。如果我在开始这门课之前就知道 sockaddr_storage,我会使用它而不是 union 。无论如何,它允许我编写如下代码:

CSocketAddress addr;
...
sendto(sock, buffer, len, 0, addr.GetSockAddr(), addr.GetSockAddrLength());

同样,“接受”语句如下所示:

sockaddr_storage addrstorage = {};
int len = sizeof(sockaddr_storage);
accept(sock, (sockaddr*)&addrstorage, &len);

CSocketAdddress addr(addrstorage); // construct an address object to pass around everywhere else

这对于调用绑定(bind)、发送和接收的代码路径非常有帮助。现在,我的 STUN 服务器和客户端代码路径不再需要了解有关套接字地址的族类型的任何信息。他们只使用“CSocketAddress”对象。唯一的 IPV4 和 IPV6 特定代码是在客户端和服务器初始化期间 - 当实际构造地址对象时。幸运的是,这也被部分抽象了。

您可能还想仔细阅读辅助函数 here 。还有一些更有用的东西可以以与 IP 无关的方式解析主机名、枚举适配器等。这是Linux 代码,但其中一些应该可以正确映射到Windows 和winsock。

我即将完成向该代码库添加 TCP 支持的工作。在添加对 SOCK_STREAM 的支持的过程中,我无需进行任何更改,也无需添加任何新代码来处理 IPV4 和 IPV6 地址结构的差异。

关于sockets - 使用 sockaddr_storage 的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8835322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com