为什么启用 Windows 基本筛选引擎服务后,我的应用程序无法接收 UDP 数据包?



在开始之前,我只想说,这种情况使用TCP完美地工作,没有任何问题-问题是,我想自动检测网络上的设备,所以我仍然需要UDP来广播和检测我的网络上的设备。

我有一个简单的UDP广播/发送/接收程序在我的笔记本电脑和台式机上运行,使用UDP和SDL_Net,用C++编码。我的台式机运行的是Linux,而我的笔记本电脑运行的是Windows。Linux机器可以接收所有UDP数据包,而Windows机器会丢弃这些数据包。我安装了Wireshark,机器确实接收到了数据包——它们从来没有进入我的应用程序:(

经过深思熟虑,我将问题缩小到了基本过滤引擎服务,当它被禁用时,我的程序可以完美地工作!当服务被禁用时,所有UDP数据包(广播或定向)都会在两台机器上接收。虽然这对测试来说很好,但这让我怀疑我的应用程序是否能在启用BFE的客户端机器上运行(我敢打赌90%的Windows计算机都启用了BFE)。

有没有一个替代的跨平台网络堆栈可以用来缓解这个问题?有什么简单的解决方案可以用基本过滤引擎"注册"我的应用程序吗?

您是否在发送查询的同一端口上侦听响应?响应广播查询的机器是否将其响应发送到与其接收到的源地址和端口号相同的源地址或端口号?

通常,防火墙会自动允许您在发送数据的任何端口上接收数据,尽管我不确定这对广播的效果如何。

还要记住,当你第一次在Vista或7下运行EXE时,可能会被问到是否允许该程序在网络上通信。如果您回答"允许"以外的任何问题(包括关闭对话框),则该EXE或任何其他使用相同路径名的EXE将被永久阻止。

尽管你提到防火墙以某种方式被"删除",但这显然不是真的,因为BFE仍然存在:基本过滤引擎是Windows防火墙的一部分。如果防火墙的某些部分丢失,例如询问是否允许EXE的部分,则自动允许规则可能无法工作。

除了自动规则之外,为了接收传入流量,您或您的用户都需要打开相应的防火墙端口。如果您的程序是以管理权限运行的,您可以通过编程方式打开端口,但这并不容易,并且需要不同的API,这取决于您是在XPSP2、Vista还是7上运行。

一般来说,Windows因为XPSP2总是运行防火墙(即使用户认为他们已经禁用了它),最佳做法是通知用户需要在安装时打开任何需要打开的端口。

但首先要确保在同一个UDP端口上发送和接收,并在一个全新的、未修改的Windows系统上进行测试。

相关内容

最新更新