我试图通过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下我将所有响应写到Console,只在Linux / Mono下从Source = 10.0.23.XXX响应的那些以及10.0.23.255中的那些似乎被过滤掉了(我在Wireshark中仔细比较了这些消息,无论我的代码是在Win还是Linux / Mono上运行,它们都是一样的) .