问题描述
我正在尝试使用 UDP 多播设置自动发现,并且正在使用来自 Internet 的一些示例代码.当我在同一台机器上运行客户端和服务器时,这似乎可以正常工作,但是当我在不同的机器上运行它们时,无论是在我的机器(virtualBox)上的虚拟机中运行的机器还是在其他真实"机器上网络然后其他机器似乎永远不会收到正在广播的消息.
I am trying to set up auto discovery using UDP multicasting, and am using some sample code from the internet. this seems to work ok when I run the client and the server on the same machine, but when I run them on different machines, either with a machine running in a VM on my machine (virtualBox) or on other 'real' machines on the network then the other machines never seem to receive the messages being broadcast.
经过一番谷歌搜索,罪魁祸首似乎是路由器 (SpeedTouch 780),它可能会丢弃数据包.我如何检查是否是这种情况?我可以检查他们的其他事情以尝试追查问题吗?可能完全是另外一回事吗?
After some googling it seems the likely culprit would be the router (SpeedTouch 780) which might be dropping the packets. How can I check if this is the case? Are their other things which I can check to try and track down the problem? Might it be something else entirely?
编码:
服务器代码
using System;
using System.Net.Sockets;
using System.Text;
internal class StockPriceMulticaster
{
private static string[] symbols = {"ABCD", "EFGH", "IJKL", "MNOP"};
public static void Main ()
{
using (UdpClient publisher = new UdpClient ("230.0.0.1", 8899))
{
Console.WriteLine ("Publishing stock prices to 230.0.0.1:8899");
Random gen = new Random ();
while (true)
{
int i = gen.Next (0, symbols.Length);
double price = 400*gen.NextDouble () + 100;
string msg = String.Format ("{0} {1:#.00}", symbols, price);
byte[] sdata = Encoding.ASCII.GetBytes (msg);
publisher.Send (sdata, sdata.Length);
System.Threading.Thread.Sleep (5000);
}
}
}
}
和客户:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class StockPriceReceiver{
public static void Main(){
UdpClient subscriber = new UdpClient(8899);
IPAddress addr = IPAddress.Parse("230.0.0.1");
subscriber.JoinMulticastGroup(addr);
IPEndPoint ep = null;
for(int i=0; i<10;i++){
byte[] pdata = subscriber.Receive(ref ep);
string price = Encoding.ASCII.GetString(pdata);
Console.WriteLine(price);
}
subscriber.DropMulticastGroup(addr);
}
}
编辑
所以它似乎出于某种原因在仅 VirtualBox 主机的网络接口上发布 UDP 数据包,而不是所有机器都连接到的无线网络.只需要弄清楚如何让它不这样做......所以在答案中添加了解决方案......
So it seems that it is publishing the UDP packets on the VirtualBox host only network interface for some reason rather than the wireless network that all the machines are connected to. Just need to figure out how to make it not do that... So added the resolution in an answer instead...
推荐答案
所以问题是因为我有超过 1 个活动的网络连接,它选择了一个并使用它,这导致 UDP 数据包在客户端正在侦听的不同网络连接上发送.当我安装了 Virtual Box 时,它已经安装并激活了 VirtualBox Host-only 网络适配器,因此可以支持仅主机网络连接.当我将 VirtualBox 切换到仅主机模式时,开始接收数据包.禁用 VirtualBox 适配器并切换回桥接连接也有效.
So the issue turned out to be that as I had more than 1 active network connection it was choosing one and using that and that was causing the UDP packets to be sent out on a different network connection that the client was listening on. As i had installed Virtual box it had installed and activated the VirtualBox Host-only network adapter, so that host only network connections could be supported. When I switched VirtualBox over to host only mode the packets started to be received. Disabling the VirtualBox adapter and switching back to a bridged connection also worked.
这篇关于为什么我的 UDP 多播没有到达网络上的机器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!