【问题标题】:IPv6 at programming level in windowsWindows中编程级别的IPv6
【发布时间】:2011-08-03 00:25:41
【问题描述】:

IPv6和IPv4在windows编程层面的区别是什么?

我们可以将 IPv4 地址更改为 IPV6 并保持所有其他程序相同,它可以工作吗?

【问题讨论】:

  • 编码的区别
  • 异步名称解析不适用于 IPv6(必须使用 getnameinfo,老实说这是一种考验)。除此之外,理论上,如果您使用“良好实践”,一切都应该完全相同,因为所有结构长期以来都是不透明的,所以您不会知道引擎盖下是否发生了某些变化。有关如何编写与 AF 无关的代码,请参阅此内容:kame.net/newsletter/19980604
  • 对于 Vista 和更高版本,您可以在套接字上设置一个选项,以便将其用于 IPv4 和 IPv6 目的。看看msdn.microsoft.com/en-us/library/ms738649(v=vs.85).aspx 来帮助你。仔细使用 API 和结构可以允许以不可知的方式完成所有工作。
  • 您没有选择任何一个答案。如果两者都不能满足您的需求,您能否提供更多有关您正在寻找的信息的信息?
  • @michael 您的答案非常接近。我想知道我必须在哪里进行更改才能使 ipv4 程序与 ipv6 一起使用。

标签: c++ windows ipv6


【解决方案1】:

这真的取决于你的程序做什么。

IPV6 地址占用 16 个字节,而不是 IPV4 使用的四个字节。字符串表示也不同。

创建套接字几乎是一样的:

            sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

只需将 PF_INET 更改为 PF_INET6。

连接有点不同:

            nRet = connect(sock, 
                           reinterpret_cast<SOCKADDR *>(&SockAddr), 
                           sizeof(SockAddr));

在 IPV4 中,SockAddr 是一个 sockaddr_in 结构,在 IPV6 中是一个 sockaddr_in6。

您必须使用 getaddrinfo() 之类的东西来初始化 SockAddr,因为 gethostbyname() 不适用于 IPV6。

bind()、listen() 和accept() 更相似。一旦socket建立,读、写等都是独立于IP版本的。

如果您在更高级别(例如 HTTP)上工作,您的程序应该不需要任何更改,但它可能需要链接到不同的库。

【讨论】:

    【解决方案2】:

    IPv6 规范 (RFC 3493) 定义了一些新的 API 方法和数据结构。 Microsoft 在 Windows 中实现了 API 的早期版本 (RFC 2553),因此存在一些差异。此链接描述了差异并分解了哪些 API 在什么版本的 Windows 上受支持:

    http://tdistler.com/2011/02/28/cross-platform-ipv6-socket-programming

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多