4 votes

Plusieurs programmes/instances utilisant le même port UDP en C#

Je suis aux prises avec un peu de magie de réseau et j'espérais que quelqu'un pourrait m'expliquer ce qui se passe.

J'essaie de réutiliser les ports udp. Ainsi, si j'ai plusieurs programmes qui écoutent sur le même port udp, je veux que les deux applications reçoivent les données envoyées par un périphérique différent.

En utilisant le code suivant, j'y parviens :

            IPEndPoint localEndoint = new IPEndPoint(IPAddress.Any, 67);    //the local endpoint used to listen to port 67
            //Create a new UDP Client and bind it to port 67
            DhcpSniffer = new UdpClient();
            DhcpSniffer.ExclusiveAddressUse = false;    //Allow multible clients to connect to the same socket
            DhcpSniffer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); // Connect even if socket/port is in use
            DhcpSniffer.Client.Bind(localEndoint);
            DhcpSniffer.Client.ReceiveTimeout = Timeout;
            //receive on port 67 
            dhcpPacket = DhcpSniffer.Receive(ref localEndoint);

Mes deux programmes peuvent écouter les messages DHCP sur le réseau et ne se bloquent pas l'un l'autre. Je veux maintenant faire la même chose avec le port 15120 où un flux vidéo RTP est diffusé. Cependant, cela ne fonctionne pas. J'utilise le même code mais sans succès, seule une application à la fois peut recevoir le flux, l'autre s'exécutera dans un délai d'attente.

            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, port);
            //Create a new UDP Client and bind it to port 15120
            udpReceiver = new UdpClient();
            udpReceiver.ExclusiveAddressUse = false;    //this is an attempt to receive the stream on mutlible instances...this works for DHCP but not for RTP for some reason....
            udpReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); // Connect even if socket/port is in use
            udpReceiver.Client.ReceiveTimeout = timeout;    //set the sockete timeout
            udpReceiver.Client.Bind(RemoteIpEndPoint);      //bind to the port from any IP
            //receive packets on port 15120
            Byte[] receiveBytes = udpReceiver.Receive(ref RemoteIpEndPoint);

J'espère que quelqu'un pourra éclairer ma confusion.

Mise à jour : J'ai découvert qu'il fonctionne avec DHCP parce qu'il est envoyé à l'IP de diffusion (255.255.255.255). Maintenant je dois trouver comment je peux changer le comportement de la socket pour traiter mon flux RTP comme s'il était diffusé afin que je puisse le voir dans deux applications en même temps. (Oui, je pourrais configurer ma source de flux pour qu'elle soit diffusée, mais ce n'est pas le but recherché). Le but est de reconfigurer la socket pour qu'elle se comporte comme expliqué. Il ne s'agit pas de sauvegarder le flux sur un disque dur ou de le rediriger en utilisant l'hôte local.

1voto

Alex Boutin Points 52

Tout d'abord, il n'est pas possible d'avoir plusieurs programmes qui écoutent sur le même port (pour autant que je sache, c'est un gros conflit de sécurité).

Ce que vous pouvez faire est d'utiliser un NetworkManager qui écoute sur votre port (appelons-le port 8080) qui redirigera ensuite l'information vers les ports de vos applications (App1 pourrait utiliser le port 8081 et App2 le port 8082). Soit vous écrivez votre propre gestionnaire, soit vous utilisez Flask pour écouter sur le port 8080 et rediriger le paquet vers localhost:8081 et localhost:8082, ce qui peut être une solution simple et rapide.

Cela vous aidera à sécuriser le réseau et vous pourrez rediriger vers autant de ports que nécessaire, de la même manière qu'un essaim docker équilibrerait le réseau entrant vers son cluster.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X