【问题标题】:Using socket in C how can I send message from IPv6 to IPv4?在 C 中使用套接字如何将消息从 IPv6 发送到 IPv4?
【发布时间】:2015-04-28 18:10:50
【问题描述】:

我尝试将目标地址转换为 IPv6 格式为::ffff:IPv4。并使用AF_INET6 类型的套接字。它给了error: Network Unreachable。但是使用相同的技术,我可以从 IPV4 通信到 IPV6

提前感谢您的帮助。

【问题讨论】:

    标签: sockets networking ipv6 ipv4


    【解决方案1】:

    IPv4 和 IPv6 是不同的协议。他们不互相交谈。

    在某些操作系统上,您可以使用 IPv6 套接字并接受传入的 IPv4 连接。但这只是让服务器代码的代码开发更容易的软件。我从来没有见过客户端代码的工作。您必须为此创建正确的套接字类型。

    通常您使用 DNS 解析主机名,您会得到多个答案(IPv4 和 IPv6),您遍历它们创建所需的套接字类型并尝试连接。如果可行,则使用该套接字,否则,请进行下一次迭代以创建新套接字等。

    如果您的代码对延迟很敏感,您可能需要实现happy eyeballs 算法。

    【讨论】:

    • 他们肯定会互相交谈。有一种特定的 IPv6 地址格式可用于连接到 IPv4 地址。
    • @EJP:IPv4 和 IPv6 有不同的数据包格式。他们不了解对方。有些系统两者兼有,有些 NAT64 机器可以从 IPv6 到 IPv4 进行 NAT,但是纯 IPv4 系统无法直接与纯 IPv6 系统通信。正如我所说,有一些 IP 堆栈可以将 IPv4 连接表示为具有::ffff:192.0.2.1 样式地址的 IPv6 套接字,但这只是软件伪装。它仍然是网络上的 IPv4 连接。
    【解决方案2】:

    在大多数系统上,PF_INET6 套接字能够通过使用::FFFF:0:0/96 范围内的地址与 IPv4 地址进行通信。但是,这仅在套接字库级别完成:实际的在线数据是纯 IPv4 数据包(就像您使用了 PF_INET 套接字一样),网络中没有协议转换。

    您收到的错误表明您没有到请求目的地的 IPv4 路由。这可能表明您的主机没有 IPv4 默认路由。没有解决方案 - 如果没有 IPv4 连接,您将无法访问 IPv4 地址。

    【讨论】:

    • 您曾提到:“没有解决方案 - 没有 IPv4 连接,您无法访问 IPv4 地址。”因此,这意味着仅 IPv6 的机器和仅 IPv4 的机器无法相互联系。
    • 是的,弗吉尼亚。幸运的是,在您的 IPv4 机器上获得 IPv6 连接很容易,搜索 Teredo(如果运行 Linux 或 Mac OS X,则为 Miredo)。
    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 2020-06-08
    • 2015-06-21
    • 1970-01-01
    • 2021-04-28
    • 2021-04-07
    • 2017-06-27
    • 2015-05-17
    相关资源
    最近更新 更多