我正在尝试在我的本地网络上进行一些简单的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地址(即不是多播),它可以工作。
任何帮助都将不胜感激。
答案 0 :(得分:7)
您的本地网络硬件是否支持IGMP?
您的交换机可能是多播感知的,但如果IGMP被禁用,它将不会注意到任何连接的硬件是否订阅了特定的多播组,因此它不会转发这些数据包。
要对此进行测试,请使用交叉电缆将两台机器直接连接在一起。应该(AFAICR)始终有效。
此外,它应该是 server 代码的一半,其中TTL参数提供给JoinMulticastGroup()
,而不是客户端的一半。
答案 1 :(得分:2)
我刚刚花了4个小时做类似的事情(我想),我的解决方案是:
client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT));
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First());
client.MulticastLoopback = true;
在组播组上使用特定(第一个外部)IP地址。
答案 2 :(得分:0)
我无法在代码中的任何位置看到TTL。请记住,TTL原本是以单位秒为单位,但已成为单位跳跃。这意味着通过使用聪明的TTL,您可以消除通过路由器。我的机器上的默认TTL是32 - 我认为这应该是足够的;但如果您的系统已经通过任何形式的安全锁定,那么您的实际可能会有所不同(UdpClient.Ttl)。
我不能推荐你需要的TTL - 因为我个人需要做很多实验。
如果这不起作用,你可以查看这些文章:
总而言之,看起来使用Sockets而不是UdpClients取得了成功。
您选择的多播组也可以是仅限本地的。 Try another one.
您的物理网络层也可能导致问题。我冒昧地质疑开关和直接(x-over)连接。集线器和所有更智能的应该处理它们。但是,我没有任何文献可以支持。