使用 Checkv4.exe 实用工具

重要

Checkv4.exe 实用工具不会在适用于 Windows 8 的 Windows 软件开发工具包 (SDK) 中提供,也不会在更高版本的 Windows SDK 中提供。

Checkv4.exe 实用工具旨在为您提供代码移植合作伙伴;该实用程序可与您一起逐步完成代码库,识别潜在问题或突出显示可从支持 IPv6 的功能或结构中受益的代码,并提出建议。 借助 Checkv4.exe 实用工具,修改现有 IPv4 应用程序以支持 IPv6 的任务变得更加容易。

Checkv4.exe 实用工具作为适用于 Windows Vista 和更高版本的 SDK 发布的 Microsoft Windows 软件开发工具包 (SDK)的一部分安装(最多包括适用于 Windows 8 的 Windows 软件开发工具包 (SDK))。

Checkv4.exe 实用程序的早期版本功能较为有限,也作为 Windows 2000 的 Microsoft IPv6 技术预览版的一部分提供。

以下部分介绍如何使用 Checkv4.exe 实用工具,然后说明修改现有 IPv4 应用程序以支持 IPv6 的建议方法。

有关运行 Checkv4.exe 的建议

  • Checkv4.exe 实用工具非常简单。 只需在命令行中执行 Checkv4.exe ,其中包含要检查为参数的文件的名称。 Checkv4.exe 分析文件,并提供有关该文件中存在 IPv6 移植问题的反馈。 将 Checkv4.exe 放置在计算机的路径中可以更轻松地从源代码目录结构中的任何位置运行 Checkv4.exe 实用工具。 例如,将 Checkv4.exe 放入 %windir% 后,可以从计算机上的任何目录中启动Checkv4.exe,而无需包括其路径。

  • 在命令提示符下发出以下命令以分析文件 Simplec.c:

    Checkv4 simplec.c

    请注意,Checkv4.exe 实用工具提出的一些建议要求使用 Ws2tcpip.h 头文件最新版本中(如 SOCKADDR_IN6 结构)才提供的结构。 这些头文件包含在适用于 Windows Vista 及更高版本的 Windows SDK 中。 这些头文件也包含在为 Windows Server 2003 发布的早期平台软件开发工具包 (SDK) 中。

    以下屏幕截图显示了在附录 A 中包含的 Simplec.c 文件上使用 Checkv4.exe 实用工具的结果:

    checkv4.exe报告 simplec.c 文件中的 ipv6 不兼容

    以下屏幕截图显示了在附录 A 中也包含的 Simples.c 文件上使用 Checkv4.exe 实用工具的结果:

    checkv4.exe报告 simples.c 文件中的 ipv6 不兼容

应用程序修改过程:启动位置

建议的过程与向应用程序添加 IPv6 功能相关联。 遵循此序列是有益的,因为它使开发人员能够确保修改现有 IPv4 应用程序以支持 IPv6 所需的所有步骤。 某些应用程序可能需要更广泛的关注这些序列之一:例如,系统服务的用户界面问题可能比图形文件传输程序 (FTP) 少。

修改 IPv4 应用程序以支持 IPv6

  1. 修复结构和声明以启用 IPv6 和 IPv4 兼容性。

  2. 修改函数调用以利用启用了 IPv6 的函数,例如 getaddrinfogetnameinfo 函数。

  3. 查看源代码以使用硬编码的 IPv4 地址,例如环回地址或其他文本字符串。

  4. 对用户界面执行彻底评审,包括信息对话框。 考虑是否适合启用 IPv6 的应用程序来指定或提供基于 IP 地址的信息。

  5. 确定应用程序是否依赖于基础协议(如 RPC),并做出适当的编程更改来处理 IPv6 地址。

  6. 在 Windows XP 及更高版本上编译应用程序时,请使用编译时标志 IPV6STRICT。 此标志导致不兼容的代码无法编译,如下所示:

    具有不兼容代码的 Windows Sockets 1.x 应用程序无法编译并返回错误消息“WINSOCK2 Required”。

    具有不兼容代码的 Windows Sockets 2.x 应用程序会导致每个不兼容代码实例的编译时间错误。 生成的错误信息的格式如下:

    [file name] ([line number]) : [error message] '[symbol]_IPV6INCOMPATIBLE'

    例如:

    sample.c(8) : error C2065: 'gethostbyaddr_IPV6INCOMPATIBLE' : undeclared identifier