UdpClient偶尔不会收到组播数据包

时间:2013-04-27 22:02:10

标签: multicast udpclient

我已经编写了一个服务器应用程序,它应该在几个指定的接口上发送和监听upnp数据包(但是当只有一个网卡时问题已经存在)。代码很简单,非常简单,但我面临着一种非常奇怪的行为。

我有一个应用程序应该监听的端点列表(接口的IP地址),然后使用以下代码为每个端点创建一个UdpClient:

private UdpClient c;
private IPEndPoint ep;
public MyClass(IPAddress ip)
{
    ep = new IPEndPoint(ip, 1900);
    c = new UdpClient(ep);
    c.JoinMulticastGroup(IPAddress.Parse("239.255.255.250"));
    c.BeginReceive(onReceive, null);
}

我发送数据包的每一分钟都没有任何问题

byte[] msg = System.Text.Encoding.ASCII.GetBytes(discoverMessage);
c.Send(msg, msg.Length, new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900));

客户回应此问题并调用我的接收函数。

 protected void onReceive(IAsyncResult r)
 {
     IPEndPoint rep = new IPEndPoint(IPAddress.Any, 0);
     string msg = Encoding.ASCII.GetString(c.EndReceive(r, ref rep));
     <-- do other things -->
     c.BeginReceive(onReceive, null);
 }

但有时它只是没有收到任何数据包,即我的接收函数根本没有被触发,虽然它们肯定会进来(我可以通过wireshark看到它们,我知道客户端将它们发送到网络)

&#34;解决方法&#34;解决这个问题然后重新启动应用程序,禁用/启用接口,重新启动(来宾)计算机,更改端点列表(例如包括0.0.0.0) - 老实说,我还没有找到解决方案/解决方法但是这样的组合似乎解决了这个问题。一旦它再次工作,我可以复制旧的配置,一切都像以前一样工作(所以配置很好,imho)。

我在Windows Server 2012上使用.NET 4.5,在Windows 8上运行Hyper-V来宾,atm有2个虚拟网卡,一个连接内部用于管理,并连接到我的物理网卡,这是不与主机共享并连接到客户端网络。

有没有人遇到过类似的问题?我在想是否Wireshark或winpcap可能会导致问题,因为当我使用它们追踪任何问题时有时会发生这种情况。或者这可能是Hyper-V虚拟网卡的问题?或者,我更喜欢的是,我在代码中做错了什么?

2 个答案:

答案 0 :(得分:0)

UDP意味着“有损”协议。 See here。如果您需要可靠性,您需要实现错误控制或切换到具有内置的TCP / IP

答案 1 :(得分:0)

如果你有多个网卡,igmp加入请求会进入什么网络?

您可能希望使用JoinMulticastGroup方法的两个参数版本,以便可以包含要在其上查找多播流量的特定本地接口IP地址。这在机器具有多个物理NIC的情况下尤其相关,从而提供对多个网络的访问。