簡體   English   中英

為什么在啟用 Windows Base Filtering Engine 服務時我的應用程序無法接收 UDP 數據包?

[英]Why can't my application receive UDP packets when the Windows Base Filtering Engine service is enabled?

在開始之前,我只想說這種情況使用 TCP 可以完美運行,沒有任何問題 - 問題是我想自動檢測我網絡上的設備,所以我仍然需要 UDP 來廣播和檢測我的網絡上的設備。

我有一個簡單的 UDP 廣播/發送/接收程序在我的筆記本電腦和台式機上運行,​​使用 UDP 和 SDL_Net,用 C++ 編碼。 我的台式機運行的是 Linux,而我的筆記本電腦運行的是 Windows。 Linux 機器可以接收所有 UDP 數據包,而 Windows 機器會丟棄它們。 我安裝了 Wireshark,並且機器確實收到了數據包 - 它們只是從來沒有進入我的應用程序:(

經過深思熟慮,我將問題縮小到 Base Filtering Engine 服務,當禁用該服務時,我的程序運行良好! 當服務被禁用時,所有 UDP 數據包(廣播或定向)都在兩台機器上接收。 雖然這對於測試目的來說很好,但它讓我想知道我的應用程序是否甚至可以與啟用了 BFE 的客戶端機器一起使用(我打賭 90% 的 Windows 計算機都啟用了)。

是否有替代的跨平台網絡堆棧可以用來緩解此問題? 是否有任何簡單的解決方案可以使用基本過濾引擎“注冊”我的應用程序?

您是否在發送查詢的同一端口上偵聽響應? 響應您的廣播查詢的機器是否將它們的響應發送到它們接收到的相同的源地址和端口號?

通常防火牆會自動允許您在發送數據的任何端口上接收數據,盡管我不確定這對廣播的效果如何。

還要記住,當您第一次在 Vista 或 7 下運行 EXE 時,可能會詢問您是否要允許該程序在網絡上進行通信。 如果您回答“允許”以外的任何內容(包括僅關閉對話框),則該 EXE 或任何其他使用相同路徑名的 EXE 將被永久阻止。

盡管您提到防火牆以某種方式被“移除”,但這顯然不是真的,因為 BFE 仍然存在:基本過濾引擎是 Windows 防火牆的一部分。 如果防火牆的某些部分丟失,例如詢問是否允許 EXE 的部分,則自動允許規則可能不起作用。

除了自動規則之外,為了接收傳入流量,您或您的用戶需要打開適當的防火牆端口。 如果您的程序以管理權限運行,您可以通過編程方式打開端口,但這並不容易,並且需要不同的 API,具體取決於您是在 XPSP2、Vista 還是 7 上運行。

一般來說,自 XPSP2 以來的 Windows 始終運行防火牆(即使用戶認為他們已禁用它),最佳實踐是通知用戶需要打開任何需要在安裝時打開的端口。

但首先要確保您在同一個 UDP 端口上發送和接收,並在一個全新的、未修改的 Windows 系統上進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM