2011-11-10 32 views
1

我正在为Windows XP和Seven开发网络应用程序。应用程序通过UDP接收数据并使用阻塞套接字,选择(不是WSAPoll)和recv函数。recv()没有时间从Win 7上的套接字接收所有UDP数据包?

为了测试我使用的是不同的操作系统安装两个相同的笔记本电脑:戴尔Latitude D630酷睿2 2.2GHz的,4GB内存,Broadcom公司的NetXtreme千兆57XX控制器。我已经得到了以下结果:

Windows XP专业版32位:网络监控应用表明,该网络接口从LAN接收数据以平均时速35兆字节/秒。应用程序从平均速度为30 MBytes/s的套接字接收数据,并检测到13%的损失。

Windows 7 Enterprise 32bit:网络监视器应用程序显示网络接口从LAN接收平均速度为35 MBytes/s的数据。应用程序从平均速度为10 MBytes/s的套接字接收数据,并检测到65%的损失。

看起来应用程序没有足够的时间从Windows 7上的套接字接收所有数据包。但为什么结果与Win XP不同?

+2

不同的硬件驱动程序“MMCSS”会限制其他7个网络活动。我会检查增加接收缓冲区是否会合理降低两个系统中的丢失率。 –

+0

套接字创建后,我的接收缓冲区通过setsockopt设置为64K。感谢你的回答。我会检查你的assupmtions。 – Rom098

+1

是的,增加缓冲区大小使接收更稳定。结果不同的原因是Windows 7上的接收缓冲区大小应该比Win XP上的大。我将尺寸增加到了256KBytes,并且获得了35MBps的速度,两者都损失了3%。谢谢。 – Rom098

回答

0

对于处理这个或类似问题的任何人,我都会提供以下服务,因为我在处理类似问题时遇到了这篇文章。我希望这会在一段时间内拯救别人。

我也想感谢@Roman R.上面他的评论和@ Rom098用于指示评论跟进,在缓冲区大小的变化帮助他/她。

它使用与UDP Windows套接字在低数据率通信的多个终端之间的数据的应用程序工作正常的Windows XP,但与迁移到Windows 7,我们开始经历跌落与网络消息的问题。

的体系结构是一个客户机终端具有通过发送和接收与所述客户端维持其自身的状态的一系列UDP消息的服务器终端的对话。客户终端有一个线程,即客户线程,用于处理用户输入以及向服务器终端发送和接收消息。服务器终端有一个线程,即服务器线程,它处理来自其他终端的请求消息以及它自己的客户端线程。简单的消息序列看起来像:

  • 客户终端发送的请求消息发送到服务器终端
  • 服务器终端用确认消息
  • 服务器终端进程请求进行响应,并发送响应消息到客户端
  • 客户终端向服务器终端发送确认

查看上面的注释,我们使用调试器进行了检查,发现Windows 7有一个预设t WinSock接收并发送8K(8192字节)的缓冲区大小。纵观互联网,似乎Windows XP对网络流量的处理速度更高。

我们在处理通信的网络层中做了两处更改。

第一种方法是使用setsockopt()函数来使用以下代码的接收和发送缓冲区的大小的两倍。

iOptLen = sizeof(INT); 
error = getsockopt (iSocket, SOL_SOCKET, SO_RCVBUF, (PCHAR)(&iOpt), &iOptLen); 
if (error < 0) { 
    error = WSAGetLastError(); 
} else if (iOpt < 1024 * 16) { 
    iOpt = 1024 * 16; 
    error = setsockopt(iSocket, SOL_SOCKET, SO_RCVBUF, (const PCHAR)(&iOpt), sizeof(iOpt)); 
    if (error < 0) { 
     error = WSAGetLastError(); 
    } 
} 
iOptLen = sizeof(INT); 
error = getsockopt (iSocket, SOL_SOCKET, SO_SNDBUF, (PCHAR)(&iOpt), &iOptLen); 
if (error < 0) { 
    error = WSAGetLastError(); 
} else if (iOpt < 1024 * 16) { 
    iOpt = 1024 * 16; 
    error = setsockopt(iSocket, SOL_SOCKET, SO_SNDBUF, (const PCHAR)(&iOpt), sizeof(iOpt)); 
    if (error < 0) { 
     error = WSAGetLastError(); 
    } 
} 

我们所做的第二个变化是,如果客户线程等待确认和响应消息从所述服务器终端进来然后处理该响应消息作为确认和响应的组合。我们正在做的是假设确认消息在某个时候被丢弃了。

有了这两个更改,滞后不再显而易见,尽管我们的测量表明有时从服务器终端到客户端的确认消息仍在丢失。

又见

Change default socket buffer size under Windows它采用了Windows注册表的变化,从8K修改默认的缓冲区大小为别的东西。

What is the size of a socket send buffer in Windows?这是关于TCP,但提供了有关setsockopt()的其他信息。

Winsock UDP packets being dropped?它讨论了一系列提供附加信息的答案的类似问题。

Application Note: Windows 2000/XP TCP Tuning for High Bandwidth Networks来自Innominate.com有一些有趣的信息,虽然也许有点过时,据我所知,Windows 7的网络层被重写。

Real time communications over UDP protocol来自Michael Pan在codeproject.com上有很多关于使用UDP的技术问题的细节。

相关问题