c++ - Winsock2 C++ : How do I find the address for an IPv4 client to send a packet to an IPv6 server?

标签 c++ sockets networking ipv6 ipv4

我一直在尝试使用 IPv6 设置一个 UDP 服务器,该服务器接受来自 IPv4 和 IPv6 客户端的数据包。我正在使用 C++ 中的 winsock2 和 Windows 中的代码块进行编程。我已经成功地收到并从 friend 那里退回了一个来自 IPv6 的数据包。当我发送到本地地址 10.0.0.90(静态)和 127.0.0.1(环回)时,我还可以通过 IPv4 接收和反弹来 self 自己的数据包。显然,当不同网络上的 friend 试图通过互联网发送到这些本地地址时,我这边没有收到任何数据包。 我在哪里可以找到 IPv4 地址,以便仅支持 IPv4 的客户端可以通过互联网成功地将 sendto() 发送到我的 IPv6 服务器?

当我在 127.0.0.1 通过 getaddrinfo() ping 自己时,生成的 addrinfo 结构包含一个空白的通配符 ipv4 地址 (0.0.0.0) 而没有 ipv6 地址。

当我使用 getaddrinfo() 通过我的 IPv6 地址 ping 自己时,我只得到一个具有相同 IPv6 地址但没有 IPv4 结构的 ipv6 addrinfo 结构。

当我使用目标的 NULL 值调用 getaddrinfo() 时,我得到两个 addrinfo 结构,它们都包含 IPv4 和 IPv6 位置的通配符值。

来自 this question ,我已经收集到要使用 ipv4 客户端连接到 IPv6 服务器,您可以使用 ipv4 映射的 ipv6 地址。我的问题是我不确定我是否还有 ipv4 地址。当我访问 www.whatismyipaddress.com 时,我只得到一个 ipv6 公共(public)地址。

这些试验都没有为我提供一个 ipv4 地址,我可以将其提供给仅 ipv4 的客户端,现在我完全被困住了。我已经处理过绑定(bind)到通配符 IP 并禁用 IPV6_V6ONLY。一切都很好,但我不知道还有什么地方可以寻找目标地址。有人可以给我一个正确方向的提示吗?谢谢!

最佳答案

目标地址是您的服务器的 IPv4 地址。禁用 V6ONLY 后,您的 IPv6 套接字可以接收 IPv4 数据包,但您的服务器仍需要具有可访问的 IPv4 地址。如果没有 IPv4 地址,纯 IPv4 客户端无法联系到您。

IPv4 映射的IPv6 地址只是在IPv6 软件中表示IPv4 地址。但是您仍然需要一个 IPv4 地址。

关于c++ - Winsock2 C++ : How do I find the address for an IPv4 client to send a packet to an IPv6 server?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34387252/

相关文章:

linux - 服务器发送复位信号而不是FIN

Linux:检索每个接口(interface)发送/接收的数据包计数器(以太网、ipv4、ipv6)

java - 获取与本地 MAC 地址关联的本地 IP 地址

c++ - 没有比较器的 STL 中的最小堆

c++ - 循环之间的 pthread_create 中重复的线程 ID?

c++ - 如何使用 Windows API 直接将 "assign"进程发送到信号量?

c++ - cppreference 中对宽松排序的解释是错误的吗?

scala - 如何在 scala playframework/akka 中设计缓冲的 tcp 发布者/订阅者

C - IPv6 原始 ICMPv6 数据包制作

java - Java Netty跨 channel 通信失败