如何在 VC++ 中禁用 Windows TCP/IP 堆栈 [以编程方式]

Posted

技术标签:

【中文标题】如何在 VC++ 中禁用 Windows TCP/IP 堆栈 [以编程方式]【英文标题】:How to Disable Windows TCP/IP Stack in VC++ [Programmatically] 【发布时间】:2009-04-14 10:30:51 【问题描述】:

我想知道如何在 VC++ [以编程方式]禁用 Windows TCP/IP 堆栈。

我们正在使用 winpcap 进行一些原始套接字编程。因此,我们的应用程序不需要 Windows TCP/IP 堆栈,我们希望在应用程序启动时将其卸载。

【问题讨论】:

仍然不清楚你想要什么。在决定禁用 TCP/IP 堆栈之前,您遇到了什么问题? 如果您在设置中提供“错误”网关 IP 会发生什么?机器还会发送/接收 ip 数据吗? @sharptooth,我们不希望 windows Stack 处理 ARP 数据包。我们要处理它。 Windows 堆栈回复 ARP 请求我们不想要那个,我们想要回复它。我们不希望 Windows 堆栈吃掉所有的 ARP 请求/回复,我们想要 ARP 请求/回复的全部所有权。谢谢: 【参考方案1】:

TCP/IP 堆栈是任何现代操作系统的重要组成部分,包括最新版本的 MS Windows。正如MS knowlegebase Q299357 中解释的那样(谈到 Win XP):

由于 TCP/IP 是 Windows 的核心组件,您无法将其删除。

无论如何,即使有可能,使用 TCP/IP(这是最现代的软件,因为大多数都包含某种网络集成、自动更新等)的任何程序都不会工作。而且大多数可能会以神秘的方式失败,因为没有人测试过该配置。

所以简短的回答是:不要这样做。

也许您可以解释一下为什么您认为有必要删除 TCP/IP 网络?那么我们或许可以为您提供帮助。

编辑:

根据您在下面的评论,如果您想绕过/禁用 TCP/IP 堆栈的 ARP 处理,那么 WinPcap 应该让您这样做。如果没有,您可能需要编写自己的 Windows 网络驱动程序。同样,这似乎非常复杂和侵入性。您能否描述一下您的应用程序是做什么的,以及为什么您甚至需要处理低级网络?

【讨论】:

sleske,我们正在构建应用程序,其中我们有发送和回复查询的 ARP 模块。所以我们不希望 Windows TCP/IP 堆栈处理这个 ARP 请求/回复,我们想要处理它。 如果您能告诉我们如何操作,那就太好了。因为您可以在 Windows 的“本地连接属性对话框”中卸载 TCP/IP 堆栈。 请将该信息放入您的问题中,以便其他人阅读和回答。我对 Windows 内部的了解不够,无法在这里提供帮助。 不,据我了解,您不能卸载 TCP/IP 堆栈,至少不能在 XP 上卸载(见上文)。 sleske :感谢您的回答。我检查了它。它只有启用/禁用复选框按钮。我想禁用它就是这样。 :)【参考方案2】:

禁用 TCP/IP 并不少见。我们倾向于在主机上禁用它,以便虚拟机可以不间断地使用 IP 堆栈。

您可以通过转到相关适配器的连接属性页面并取消选中 TCP/IP 框来手动禁用它(如果安装了 IPv6,则可能有多个)。

经过一些简短的调查,WMI 似乎不支持以编程方式更改此属性。但是,看起来 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Linkage\Bind 是存储每个启用 TCP/IP 的适配器的关键。从该列表中删除适配器(使用 win32 注册表 API)可能会禁用 TCP/IP。

测试时要小心...

【讨论】:

【参考方案3】:

您需要致电 WSCDeinstallProvider,即 MSDN 上的 documented。您还需要使用WSCEnumProtocols 枚举提供程序。

我不确定您的尝试是否可行,但祝您好运。如果您成功了,请告诉我们。

【讨论】:

【参考方案4】:

我知道它不能直接回答问题,但由于我一整天都在寻找完全相同的东西,我虽然可以给其他人我找到的解决方案。

我找到了一个名为nvspbind 的工具,它正是这样做的。它可用于在任何 NIC 上设置正确的绑定和启用/禁用特定绑定。

它使用一个名为INetCfg 的接口。如果您不想使用该工具并以编程方式进行操作,我认为这是您应该使用的界面。

我还是个学生,所以我可能错了。

【讨论】:

像魅力一样工作。谢谢!

以上是关于如何在 VC++ 中禁用 Windows TCP/IP 堆栈 [以编程方式]的主要内容,如果未能解决你的问题,请参考以下文章

如何启用或禁用特定 ViewController 的横向模式?

如何强制我的 C# 应用程序立即确认 TCP 数据报?

在视图控制器上启用滑动,但在该 VC 的视图中禁用

如何在 iPhone 上的 TCP 连接上禁用 Nagle 算法

如何在Windows2008中禁用IPv6

如何在 Linux 中禁用 Nagle 算法? [关闭]