将 C++ TCP/IP 应用程序从 IPv4 转换为 IPv6。难的?值得这么麻烦吗?

2024-05-24

多年来,我使用 WinSock 为 Windows 开发了少量 C++ 服务器/客户端应用程序(路由器、Web/邮件/FTP 服务器等...等等...)。

我开始越来越多地考虑创建这些应用程序的 IPv6 版本(当然,同时也保留原始的 IPv4 版本)。

问题:

  1. 我可能会遇到哪些陷阱?
  2. 移植/转换困难吗?
  3. 转换值得吗?


作为参考(或为了好玩),您可以偷看一下IPv4代码 http://networkdls.com/Software.Asp?Review=23我的应用程序的核心。


获取地址信息 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 版本的依赖,并且最终获得的套接字管理代码比开始时要少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 C++ TCP/IP 应用程序从 IPv4 转换为 IPv6。难的?值得这么麻烦吗? 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐