MONO - C#UdpClient没有从本地广播ip

时间:2018-06-18 14:38:39

标签: c# mono broadcast multicast udpclient

我正在尝试通过UDP进行发现,我的代码发送多播消息,网络上的其他设备回复给我。我在.NET 4.5.2上使用UdpClient,将其绑定在随机端口上并将我的消息发送到设备正在侦听的多播地址(例如233.255.255.237:8003)。设备从多播端口8003回复我,但是一些回复来自他们自己的ip(例如10.0.23.66),一些回复来自本地广播ip(例如10.0.23.255)。 这在Windows上运行得很好,我可以看到来自所有设备的回复,但是当在Mono(版本5.2.0.224)上运行时,我只能看到从不使用本地广播ip的设备发送的消息。

当我执行tcpdump并在Wireshark中打开它时,我可以清楚地看到UDP消息到达我,即使那些Source = 10.0.23.255他们有正确的目标IP和端口(我的随机端口),但代码永远不会选择它们向上...

我搜索了SO和网络并在过去2天内尝试了所有内容,不同的UdpClient构造函数,同一端口上的2个UdpClients(否则没有回复,接收代码必须在与发送相同的端口上进行侦听代码正在使用) - 一个用于发送,一个用于接收,使用普通套接字进行接收,设置EnableBroadcast = true,绑定到特定端口(多播端口和其他),使用JoinMulticastGroup(尽管如此,我只是发送消息到多播地址,没有收到,回复直接到我的本地和点),然后一些,但没有任何作用,我在我的智慧结束... 也许有单声道的bug /不同的行为,或者可以使用的一些神秘的设置,我将不胜感激任何帮助。

以下是我的代码的样子(在处理时省略清理等部分):

client = new UdpClient { MulticastLoopback = false, EnableBroadcast = true };
client.Client.Bind(new IPEndPoint(IPAddress.Any, 0));
client.BeginReceive(EndReceive, null);

private void EndReceive(IAsyncResult ar)
{
try
   {
      var source = new IPEndPoint(IPAddress.Any, 0);
      var data = client.EndReceive(ar, ref source);
      Console.WriteLine("{0} received msg:\r\n{1}", source.Address, Encoding.UTF8.GetString(data));
   }
   catch (Exception e)
   {
       Console.WriteLine(e);
   }
   client.BeginReceive(EndReceive, null);
}

为了发送多播消息,我在try catch中也使用了client.Send(),这些消息肯定已经发送,客户端正在响应,就像在Wireshark上看到的那样,就在Windows下我将所有响应写入到控制台,在Linux下/ Mono只响应来自Source = 10.0.23.XXX和10.0.23.255的那些似乎被过滤掉了(我在Wireshark中仔细比较了这些消息,无论我的代码是在Win还是Linux /上运行,它们都是一样的单声道)。

0 个答案:

没有答案