通过套接字最简单的广告/听力安排

以下简单安排有什么问题。 我所做的就是创建一个多播消息的UDP广告商,以及一个加入多播组以接收此消息的侦听器,两者都在同一台机器上运行。

string Port = "54153"; HostName Host = new HostName("224.3.0.5"); //a multicast range address //listener var L = new DatagramSocket(); L.MessageReceived += (sender2, args) => { /*something*/ }; await L.BindServiceNameAsync(Port); L.JoinMulticastGroup(Host); //advertiser var AdvertiserSocket = new DatagramSocket(); AdvertiserSocket.Control.MulticastOnly = true; Stream outStream = (await AdvertiserSocket.GetOutputStreamAsync(Host, Port)).AsStreamForWrite(); using (var writer = new StreamWriter(outStream)) { await writer.WriteLineAsync("MESSAGE"); await writer.FlushAsync(); } 

监听器根本不接收任何内容(从未调用MessageReceived )。 我尝试了以下变化但没有成功:

  1. 在广告商上调用而不是调用BindServiceNameAsync()。
  2. 在广告商,听众或两者上使用MulticastOnly
  3. 在另一个之前创建一个对象后等待几秒钟。
  4. 使用255.255.255.255作为主机。

看起来广告商正确地组播数据(TCPView显示发送的数据包),但接收端口没有得到任何东西。

感谢您分享此问题。 我做了一个演示并做了一些测试。 我发现侦听器套接字在组中发送了一条消息之前不会收到任何消息。

所以,目前的解决方法是在注册后立即发送一条空消息:

 private async void btnListen_Click(object sender, RoutedEventArgs e) { socket = new DatagramSocket(); socket.MessageReceived += Socket_MessageReceived; socket.Control.MulticastOnly = true; await socket.BindServiceNameAsync(serverPort); socket.JoinMulticastGroup(serverHost); SendWithExistingSocket(socket, "");//send an empty message immediately } private async void SendWithExistingSocket(DatagramSocket socket, String text) { if (socket != null) { Stream stream = (await socket.GetOutputStreamAsync(serverHost, serverPort)).AsStreamForWrite(); using (var writer = new StreamWriter(stream)) { writer.WriteLine(text); await writer.FlushAsync(); } } } 

至于这个问题的根本原因,我会咨询相关团队,一旦得到回复,就会通知你。