2013-04-27 29 views
0

我已经编写了一个服务器应用程序,该应用程序应该在几个指定的接口上发送和监听upnp数据包(但问题在只有一个网卡时已经存在)。代码很简单,很简单,但我正面临一个非常奇怪的行为。UdpClient偶尔不会收到组播数据包

我有端点的列表(接口的IPAddresses)应用程序应该监听和发送消息,然后创建一个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,我知道客户端发送他们到网络)。

解决此问题的“解决方法”是重新启动应用程序,禁用/启用接口,重新启动(guest)机器,更改端点列表(例如,包括0.0.0.0) - 老实说我还没有找到解决方案/解决方法,但这种组合似乎解决了这个问题。一旦它再次工作,我可以复制旧的配置,一切工作如前(所以配置很好,恕我直言)。

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

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

回答

0

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

+0

这就是为什么客户端发送两次数据包的原因:)但根据wireshark UDP Pakets到达机器,这不是问题。 – user2327792 2013-04-27 22:15:13

+0

嗯...现在它成为一个有趣的问题。你在源机器还是目标机器上检查这个? – 2013-04-27 22:16:57

+0

问题不在于某些数据包丢失,当问题开始时,所有数据包都会在几小时内“丢失”(意味着它们在wireshark中可见,但接收函数未被调用)。 – user2327792 2013-04-27 22:17:28

0

如果你有多个NIC,igmp加入请求将连接到什么网络?

您可能需要使用JoinMulticastGroup方法的两个参数版本,以便您可以包含要在其中查找多播通信的特定本地接口IP地址。这在机器具有多个物理网卡的情况下特别有用,它提供对多个网络的访问。