通过套接字最简单的广告/收听安排 [英] Simplest possible advertise/listen arrangement through sockets
问题描述
以下简单的安排有什么问题.我所做的就是创建一个多播消息的 UDP 广告程序,以及一个加入多播组以接收此消息的侦听器,两者都运行在同一台机器上.
What's wrong with the following simple arrangement. All I'm doing is to create a UDP advertiser that multicasts a message, and a listener that joins the multicast group to receive this message, both running on the same machine.
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
从未被调用).我尝试了以下变体但没有成功:
The listener doesn't receive anything at all (MessageReceived
never invoked). I have tried the following variations without success:
- 对广告客户调用和不调用 BindServiceNameAsync().
- 在广告商、听众或两者上使用
MulticastOnly
- 在创建一个对象之前等待几秒钟.
- 使用
255.255.255.255
作为主机.
- Calling and not calling BindServiceNameAsync() on advertiser.
- Using
MulticastOnly
on advertiser, listener or both - Waiting for a few seconds after creating one object before the other.
- Using
255.255.255.255
as host.
推荐答案
似乎广告商正确地多播数据(TCPView 显示发送的数据包),但接收端口没有收到任何东西.
It seems like the advertiser is multicasting data correctly (TCPView shows sent packets), but the receiving port is not getting anything.
感谢您分享这个问题.我做了一个演示并做了一些测试.我发现侦听器套接字在组中发送一条消息之前不会收到任何消息.
Thank you for sharing this problem. I made a demo and did some tests. I found out the listener socket won't receive any message until it has sent one message in the group.
因此,目前的解决方法是在注册收听后立即发送一条空消息:
So, currently the workaround is to send an empty message immediately after register for listening:
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();
}
}
}
至于这个问题的根本原因,我会咨询相关团队,一旦我得到回应,就会告诉你.
As for the root cause of this problem, I'll consult with related team and let you know once I got response.
这篇关于通过套接字最简单的广告/收听安排的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!