我使用UdpClient
来接收和发送多播流量,但是当应用程序启动并运行时新的网络接口开始运行时,我遇到了问题。
当接口运行时,我的应用程序中创建UdpClient
(插入网络电缆引发NetworkChange.NetworkAddressChanged),它绑定到接口的静态IP,并且可以看到预期的IGMP数据包该接口上的wireshark,但UdpClient
实例从不报告有任何数据可用。
如果在连接电缆之前创建UdpClient
,问题似乎也会出现。
我已尝试设置SocketOptionName.MulticastInterface
,但这只会涉及发送多播流量,而不是接收...此处的示例:https://support.microsoft.com/en-us/kb/318911
这是一个展示此问题的控制台应用。当这个应用程序运行时,我连接以太网电缆,Wireshark显示来自此应用程序的IGMP加入组数据包,以及来自另一台计算机的传入多播流量。如果我已经插入电缆并启动应用程序,它将收到我期望的所有流量。
class Program
{
static UdpClient udpClient;
static IPAddress bindAddress = IPAddress.Parse("192.168.101.220");
static IPAddress groupListenAddress = IPAddress.Parse("239.255.0.1");
static int port = 9999;
static bool shouldRun = true;
static Thread thread;
static void Main(string[] args)
{
udpClient = new UdpClient();
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);
IPEndPoint localEndPoint = new IPEndPoint(bindAddress, port);
udpClient.Client.Bind(localEndPoint);
udpClient.JoinMulticastGroup(groupListenAddress);
thread = new Thread(runThread);
thread.Start();
Console.WriteLine("Press Enter to exit.");
Console.ReadLine();
shouldRun = false;
thread.Join(100);
}
private static void runThread(object obj)
{
while (shouldRun)
{
if (udpClient.Available > 0)
{
IPEndPoint endPoint = null;
byte[] buffer = udpClient.Receive(ref endPoint);
Console.WriteLine("Received Message from: {0} Length: {1}", endPoint, buffer.Length);
}
Thread.Sleep(10);
}
}
}
答案 0 :(得分:1)