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.