获取地址信息 http://en.wikipedia.org/wiki/Getaddrinfo and 获取姓名信息 http://en.wikipedia.org/wiki/Getaddrinfo#getnameinfo.28.29是你的朋友.. 我尽可能建议他们成为你在现有应用程序中寻求提供 IPv4 和 IPv6 支持时最好的朋友。
如果添加 IPv6 支持正确的话,您最终还会将系统抽象到无需修改代码即可运行未知的未来 IP 协议的程度。
通常,在连接时,您会填写套接字结构、端口、地址族、IP 地址、将地址/端口转换为网络字节顺序等。
With getaddrinfo
您发送一个 IP 地址或主机名以及端口或端口名称,它会返回一个链接列表,其中包含结构和准备直接传递到的所有内容socket()
and connect()
.
getaddrinfo
对于使用这两种 IP 协议至关重要,因为它知道主机是否具有 IPv6 或 IPv4 连接,并且通过查看 DNS 知道对等方是否也具有 IPv6 或 IPv4 连接AAAA
vs A
记录并动态地找出哪些协议可用于服务特定的连接请求。
我强烈建议不要使用inet_pton()
, inet_addr()
或特定于 IP 版本的类似设备。具体在Windows平台上inet_pton()
与早期版本的 MS Windows(XP、2003 等)不兼容,除非您自己推出。还建议不要为 IPv4 和 IPv6 使用单独的版本...作为一种技术解决方案,这是行不通的,因为在不久的将来,这两种协议将需要同时使用,而人们可能无法提前知道该使用哪一个。套接字接口是抽象的,通过尝试创建 IPv6 套接字或尝试为侦听器设置 IPv6 双栈套接字选项,可以轻松检测双栈或 IPv6 支持。生成的应用程序没有理由不能在不支持或不了解 IPv6 的系统上运行。
对于传出连接使用PF_UNSPEC
in getaddrinfo
以便在进行传出连接时为您选择地址族。恕我直言,这比双栈方法更好,因为它允许不支持双栈的平台工作。
对于传入连接,如果设计合理,您可以单独绑定 IPv4/IPv6 套接字;如果无法执行单独的侦听器,则可以使用双栈。使用双栈时getnameinfo
返回 IPv4 地址的 IPv6 地址,恕我直言,这最终毫无用处。一个小实用程序可以将字符串转换为普通的 IPv4 地址。
根据我的经验,如果做得正确,您已经消除了对特定 IP 版本的依赖,并且最终获得的套接字管理代码比开始时要少。