Winsock2 C++:如何找到 IPv4 客户端将数据包发送到 IPv6 服务器的地址?

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

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

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

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

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

根据 this question,我了解到要使用 ipv4 客户端连接到 IPv6 服务器,您需要使用 ipv4 映射的 ipv6 地址。我的问题是我不确定我是否还有 ipv4 地址。当我转到 www.whatismyipaddress.com 时,我只得到一个 ipv6 public 地址。

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

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

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