2012-03-22 29 views
2

我正在使用Socket从udp多播接收数据。 代码很简单:套接字:有时(很少)数据包在接收期间丢失

s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
.... 
while (true) 
{ 
    int count = 0; 
    try 
    { 
     count = socket.Receive(byteArray); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.Message); 
     return; 
    } 
    if (count > 0) 
    { 
     OnNewMessage(new NewMessageEventArgs(byteArray, count)); 
    } 
} 

的问题是,有时我失去的数据包。不经常,每2分钟〜一次。

我确定数据包已到达,因为我可以在另一个在同一台计算机上启动并配置为接收相同数据包的C++程序中看到它。

为什么我的程序无法捕获其他人可以访问的数据包?为什么我会丢包?计算机是否可能太慢(或太忙)无法接收数据包?

我每秒接收和使用至强E3处理器约2万用包,这应该是更加有足够的我想......

+1

也许是因为UDP不可靠。你会丢包,可能你根本没有收到任何消息。 – dowhilefor 2012-03-22 16:46:28

+0

@dowhilefor我写了这个消息不会丢失!因为我确实在另一个程序的同一台机器上看到它。所以消息被交给网卡驱动程序。此外,我的程序不断失去信息,当另一个程序不!所以问题不在UDP,程序问题。 – javapowered 2012-03-22 16:52:31

+1

@javapowered - 是的,是的。 – 2012-03-22 17:08:02

回答

3

如果你确定数据包到达(和:我必须强调,这是不是保证当使用UDP,并且1个数据包每两分钟下降2000个数据包时一秒是一个更好的接收率比你应该可能希望,即使对于两个相邻的机器也是如此),那么这个可能是意味着接收缓冲器在短时间内是满的。尝试增加ReceiveBufferSize

+0

谢谢马克,是的,我绝对相信这个数据包真的到了,因为我在Wireshark等网站上看到了它。另外,当收到第一个〜100个数据包后开始申请时,我会不断丢弃下一个〜1000个数据包!我会尽量增加这个缓冲区! – javapowered 2012-03-23 09:34:42

+0

Marc有帮助!非常感谢你! – javapowered 2012-03-23 09:44:18

0

我不不,如果是你的情况,但有时你可以得到更多的在socket.Receive(byteArray)的单个字节数组中包含一个数据包。这是由于套接字的优化。 检查是否属于您的情况,并检查您的解析方法。

+0

您所说的是针对msdn“如果您使用的是无连接套接字,Receive将从您在Connect方法中指定的目标地址读取第一个入队数据报。” – javapowered 2012-03-23 09:21:32

+0

好吧你是对的,我刚刚阅读msdn圣经..我有这个问题在TCP连接,我认为我是一个接收方法的问题。 – pluka 2012-03-23 16:22:39