如何在c#中通过本地网络进行UDP组播?

我试图在我的本地网络上进行一些简单的UDP通信。

我想要做的就是对网络上的所有机器进行多播

这是我的发送代码

public void SendMessage(string message) { var data = Encoding.Default.GetBytes(message); using (var udpClient = new UdpClient(AddressFamily.InterNetwork)) { var address = IPAddress.Parse("224.100.0.1"); var ipEndPoint = new IPEndPoint(address, 8088); udpClient.JoinMulticastGroup(address); udpClient.Send(data, data.Length, ipEndPoint); udpClient.Close(); } } 

这是我的接收代码

  public void Start() { udpClient = new UdpClient(8088); udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50); receiveThread = new Thread(Receive); receiveThread.Start(); } public void Receive() { while (true) { var ipEndPoint = new IPEndPoint(IPAddress.Any, 0); var data = udpClient.Receive(ref ipEndPoint); Message = Encoding.Default.GetString(data); // Raise the AfterReceive event if (AfterReceive != null) { AfterReceive(this, new EventArgs()); } } } 

它在我的本地计算机上完美运行,但不能通过网络运行。

– 似乎不是防火墙。 我在两台机器上都禁用了它,但它仍然无效。

– 如果我直接发送到客户端机器的硬编码IP地址(即不是多播),它可以工作。

任何帮助,将不胜感激。

您的本地网络硬件是否支持IGMP ?

您的交换机可能是多播感知的,但如果IGMP被禁用,它将不会注意到任何连接的硬件是否订阅了特定的多播组,因此它不会转发这些数据包。

要对此进行测试,请使用交叉电缆将两台机器直接连接在一起。 应该(AFAICR)始终有效。

此外,它应该是具有提供给JoinMulticastGroup()的TTL参数的代码的服务器的一半,而不是客户端的一半。

我刚刚在类似的东西上花了4个小时(我想),我的解决方案是:

 client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT)); client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First()); client.MulticastLoopback = true; 

使用组播组上的特定(第一个外部)IP地址。

我看不到代码中任何地方指定的TTL 。 请记住,TTL本来是以单位秒为单位,但已成为单位跳跃。 这意味着通过使用聪明的TTL,您可以消除通过路由器。 我的机器上的默认TTL是32 – 我认为这应该是足够的; 但是如果您的系统已经通过任何forms的安全锁定,那么您的实际可能会有所不同(UdpClient.Ttl)。

我不能推荐你需要的TTL – 因为我个人需要做很多实验。

如果这不起作用,你可以看看这些文章:

  • OSIX文章
  • CodeProject文章

总而言之,使用套接字而不是UdpClients看起来已经取得了成功。

您选择的多播组也可以是仅本地的。 尝试另一个。

您的物理网络层也可能导致问题。 我冒昧地质疑交换机和直接(x-over)连接。 集线器和所有更智能的应该处理它们。 但是,我没有任何文献可以支持。