我正在为Windows XP和7开发一个网络应用程序。应用程序通过UDP接收数据,并使用阻塞套接字、选择(而不是WSAPoll)和recv函数。
为了进行测试,我使用了两台安装了不同操作系统的相同笔记本电脑: Dell纬度D630,Core2Duo2.2GHz,4GBRAM,Broadcom NetXtreme 57xx Gigabit控制器。我得到了以下结果:
32位:网络监控应用程序显示,网络接口以平均速度35 MBytes/s从局域网接收数据,应用程序从平均速度为30 MBytes/s的套接字接收数据,并检测13%的损失。
Windows7Enterprise32bit:网络监控应用程序显示,网络接口以平均35 MBytes/s的速度从局域网接收数据,应用程序从平均速度为10 MBytes/s的套接字接收数据,检测65%的损失。
看起来,应用程序没有足够的时间从Windows 7上的套接字接收所有数据包。但是,为什么结果与Win XP不同呢?
发布于 2015-10-15 19:07:36
我提供给任何处理这个或类似的问题的人,因为我看到这个帖子,而处理一些类似的东西。我希望这能为其他人节省一些时间。
我还要感谢@Roman R.的上述评论和@Rom098的后续评论,指出缓冲区大小的改变也帮助了他/她。
一个应用程序在较低的数据速率下使用带有UDP的Windows套接字在多个终端之间进行数据通信,它在Windows中运行良好,但随着迁移到Windows 7,我们开始遇到网络消息被丢弃的问题。
该体系结构是客户端通过发送和接收一系列UDP消息与保持其自身状态的客户端进行与服务器端的会话。客户端具有一个线程,即客户端线程,用于处理用户输入和向服务器终端发送和接收消息。服务器终端有一个线程,即server,它处理来自其他终端的请求消息以及它自己的客户端线程。简单的消息序列如下所示:
查看上面的注释,我们使用调试器进行检查,发现Windows7的默认WinSock接收和发送缓冲区大小为8K (8192字节)。从互联网上看,Windows对网络流量的处理率似乎更高。
我们在处理通信的网络层中做了两个更改。
第一种方法是使用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();
}
}我们所做的第二个更改是,如果客户端线程正在等待确认,而响应消息来自服务器终端,则将响应消息作为确认和响应的组合处理。我们正在做的是假设确认消息在某个时候被删除了。
通过这两个更改,延迟不再明显,尽管我们的测量结果表明,有时从服务器终端到客户端的确认消息仍然被删除。
另请参阅
在Windows下更改默认套接字缓冲区大小使用Windows将默认缓冲区大小从8K修改为其他缓冲区。
然而,关于TCP的Windows中套接字发送缓冲区的大小是多少?提供了有关setsockopt()的其他信息。
被丢弃的Winsock UDP数据包?,它讨论了一个类似的问题,提供了许多答案,提供了更多的信息。
来自Innominate.com的Innominate.com提供了一些有趣的信息,尽管我了解到在Windows7中网络层被重写了,这可能有点过时了。
来自Michael codeproject.com的codeproject.com提供了很多关于使用UDP的技术问题的详细信息。
https://stackoverflow.com/questions/8079614
复制相似问题