Pourquoi mon application ne peut-elle pas recevoir de paquets UDP lorsque le service du moteur de filtrage de base Windows est activé?

Avant de commencer, je tiens simplement à dire que cette situation fonctionne parfaitement avec TCP, sans aucun problème. Le problème est que je souhaite détecter automatiquement les périphériques de mon réseau, ce qui fait que j’ai toujours besoin du protocole UDP pour diffuser et détecter des périphériques sur mon réseau.

J’ai un programme de diffusion / envoi / réception UDP simple, exécuté sur mon ordinateur portable et mon ordinateur de bureau, utilisant UDP et SDL_Net, codé en C ++. Mon ordinateur fonctionne sous Linux, alors que mon ordinateur portable est sous Windows. La machine Linux peut recevoir tous les paquets UDP, tandis que la machine Windows les abandonne. J’ai installé Wireshark, et la machine reçoit les paquets – ils ne parviennent jamais à mon application 🙁

Après de longues délibérations, j’ai limité le problème au service de moteur de filtrage de base, qui, lorsqu’il est désactivé, mon programme fonctionne parfaitement! Tous les paquets UDP (diffusés ou dirigés) sont reçus sur les deux ordinateurs lorsque le service est désactivé. Bien que ce soit correct à des fins de test, je me demande si mon application fonctionnera même avec des ordinateurs clients avec le mode BFE activé (90% des ordinateurs Windows sont activés).

Existe-t-il une autre stack réseau multiplateforme que je peux utiliser pour résoudre ce problème? Existe-t-il une solution simple pour “enregistrer” mon application avec le moteur de filtrage de base?

Etes-vous à l’écoute des réponses sur le même port que celui sur lequel vous avez envoyé la requête? Les machines qui répondent à votre requête de diffusion envoient-elles leurs réponses à la même adresse source et au même numéro de port qu’elles l’ont reçue?

Habituellement, le pare-feu vous autorisera automatiquement à recevoir des données quel que soit le port sur lequel vous avez envoyé des données, bien que je ne sache pas si cela fonctionne bien pour la diffusion.

N’oubliez pas non plus que lorsque vous exécutez un fichier EXE sous Vista ou 7 pour la première fois, il peut vous être demandé si vous souhaitez autoriser ce programme à communiquer sur le réseau. Si vous répondez à autre chose que “Autoriser” (y compris simplement en fermant la boîte de dialog), alors cet EXE ou tout autre EXE utilisant le même nom de chemin sera définitivement bloqué.

Bien que vous mentionniez que le pare-feu a été “supprimé” d’une manière ou d’une autre, ce n’est évidemment pas le cas puisque BFE est toujours là: le moteur de filtrage de base fait partie du pare-feu Windows. Si une partie du pare-feu est manquante, par exemple la partie qui demande si un fichier EXE doit être autorisé, les règles d’autorisation automatique risquent de ne pas fonctionner.

Outre les règles automatiques, pour recevoir le trafic entrant, vous ou vos utilisateurs devrez ouvrir le port de pare-feu approprié. Si votre programme est exécuté avec des privilèges d’administrateur, vous pouvez ouvrir le port par programmation, mais ce n’est pas facile et requirejs des API différentes selon que vous utilisez XPSP2, Vista ou 7.

De manière générale, Windows depuis XPSP2 utilise toujours un pare-feu (même si l’utilisateur pense l’avoir désactivé) et la meilleure pratique consiste à l’informer de la nécessité d’ouvrir les ports devant être ouverts au moment de l’installation.

Mais assurez-vous d’abord que vous envoyez et recevez sur le même port UDP et effectuez un test sur un système Windows non modifié et récent.