通过套接字最简单的广告/收听安排 [英] Simplest possible advertise/listen arrangement through sockets

查看:24
本文介绍了通过套接字最简单的广告/收听安排的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下简单的安排有什么问题.我所做的就是创建一个多播消息的 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:

  1. 对广告客户调用和不调用 BindServiceNameAsync().
  2. 在广告商、听众或两者上使用 MulticastOnly
  3. 在创建一个对象之前等待几秒钟.
  4. 使用 255.255.255.255 作为主机.
  1. Calling and not calling BindServiceNameAsync() on advertiser.
  2. Using MulticastOnly on advertiser, listener or both
  3. Waiting for a few seconds after creating one object before the other.
  4. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆