如何在 C# 中跨本地网络进行 UDP 多播?
Posted
技术标签:
【中文标题】如何在 C# 中跨本地网络进行 UDP 多播?【英文标题】:How to do a UDP multicast across the local network in c#? 【发布时间】:2010-10-20 12:20:04 【问题描述】:我正在尝试在我的本地网络上进行一些简单的 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 地址(即不是多播),它就可以工作。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:您的本地网络硬件是否支持IGMP?
您的交换机可能支持多播,但如果禁用 IGMP,它不会注意到任何连接的硬件是否订阅了特定的多播组,因此它不会转发这些数据包。
要对此进行测试,请暂时使用交叉电缆将两台机器直接连接在一起。这应该(AFAICR)始终有效。
此外,它应该是向JoinMulticastGroup()
提供 TTL 参数的代码的 服务器 部分,而不是客户端部分。
【讨论】:
【参考方案2】:我刚刚在类似的事情上花了 4 个小时(我认为),我的解决方案是:
client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT));
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First());
client.MulticastLoopback = true;
使用多播组上的特定(第一个外部)IP 地址。
【讨论】:
我也无法让它在局域网上工作。在调用 JoinMulticastGroup() 时,如果没有要监听的显式 IP 地址的第二个参数,它只是随意选择我作为 Docker/Hyper-V 的一部分安装的一些虚拟以太网驱动程序,并将其加入多播组而不是我的真实以太网适配器。如果您有多个网络适配器,则需要使用将 IP 地址作为第二个参数的方法重载来显式指定要加入多播组的 IP 地址。 什么是IP
?我没有看到其他人在这个问题中提到名为 IP
的变量,因此您的变量名称非常混乱,似乎缺少一些上下文。【参考方案3】:
我在代码中的任何地方都看不到TTL。请记住,TTL 最初的意思是单位秒,但现在变成了单位跃点。这意味着通过使用巧妙的 TTL,您可以避免通过路由器。我机器上的默认 TTL 是 32 - 我认为这应该绰绰有余;但如果您的系统经历了任何形式的安全锁定,您的实际上可能会有所不同 (UdpClient.Ttl)。
我不能推荐你需要的 TTL - 因为我个人需要做很多实验。
如果这不起作用,您可以看看这些文章:
OSIX Article CodeProject Article总而言之,使用 Sockets 而不是 UdpClients 似乎取得了成功。
您选择的多播组也可以是本地的。 Try another one.
您的物理网络层也可能导致问题。我会冒险质疑开关和直接(x-over)连接。集线器和所有更智能的应该可以很好地处理它们。然而,我没有任何文献支持这一点。
【讨论】:
以上是关于如何在 C# 中跨本地网络进行 UDP 多播?的主要内容,如果未能解决你的问题,请参考以下文章