Почему мое приложение не может получать пакеты UDP, когда включена служба ядра базовой фильтрации Windows? - PullRequest
1 голос
/ 07 марта 2012

Прежде чем начать, я просто хочу сказать, что эта ситуация работает отлично с использованием TCP, без каких-либо проблем - проблема в том, что я хочу автоматически обнаруживать устройства в моей сети, поэтому мне все еще нужен UDP транслировать и обнаруживать устройства в моей сети.

У меня есть простая программа широковещательной передачи / отправки / получения UDP, работающая на моем ноутбуке и настольном компьютере с использованием UDP и SDL_Net, написанная на C ++. Мой рабочий стол работает под управлением Linux, а мой ноутбук работает под управлением Windows. Машина Linux может принимать все пакеты UDP, в то время как машина Windows отбрасывает их. Я установил Wireshark, и машина получает пакеты - они просто не попадают в мое приложение: (

После долгих размышлений я сузил проблему до службы Base Filtering Engine, которая при отключении моей программы работает отлично! Все UDP-пакеты (широковещательные или направленные) принимаются на обеих машинах, когда служба отключена. Хотя это хорошо для целей тестирования, я задаюсь вопросом, будет ли мое приложение работать даже на клиентских компьютерах с включенным BFE (на что, я уверен, 90% компьютеров с Windows).

Существует ли альтернативный кроссплатформенный сетевой стек, который я могу использовать для смягчения этой проблемы? Есть ли какое-нибудь простое решение, чтобы «зарегистрировать» мое приложение с базовым механизмом фильтрации?

1 Ответ

0 голосов
/ 08 марта 2012

Вы слушаете ответы на тот же порт, на который отправили запрос? Машины, отвечающие на ваш широковещательный запрос, отправляют свои ответы на тот же адрес источника и номер порта, с которого они его получили?

Обычно брандмауэр автоматически позволяет вам получать данные на любой порт, на который вы отправили данные, хотя я не уверен, насколько хорошо это работает для широковещательной передачи.

Также имейте в виду, что при первом запуске EXE под Vista или 7 вас могут спросить, хотите ли вы разрешить этой программе обмениваться данными в сети. Если вы ответите на что-либо, кроме «Разрешить» (включая просто закрытие диалогового окна), то этот EXE-файл или любой другой EXE-файл, использующий то же имя пути, будет навсегда заблокирован.

Хотя вы упоминаете, что брандмауэр был каким-то образом «удален», это, очевидно, неверно, поскольку BFE все еще существует: базовый механизм фильтрации является частью брандмауэра Windows. Если какая-то часть брандмауэра отсутствует, например, часть, которая спрашивает, разрешать ли EXE, то автоматические правила разрешения могут не работать.

За исключением автоматических правил, для получения входящего трафика вам или вашим пользователям необходимо открыть соответствующий порт брандмауэра. Если ваша программа запускается с правами администратора, вы можете открыть порт программным способом, но это нелегко и требует разных API в зависимости от того, работаете ли вы на XPSP2, Vista или 7.

Вообще говоря, Windows, поскольку XPSP2 всегда запускает брандмауэр (даже если пользователь считает, что он отключил его), и лучше всего информировать пользователя о необходимости открывать все порты, которые необходимо открыть во время установки.

Но сначала убедитесь, что вы отправляете и получаете по одному и тому же порту UDP, и проводите тестирование на новой неизмененной системе Windows.

...