微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

recv没有时间从Win 7上的套接字接收所有的UDP数据包?

我正在为Windows XP和Seven开发一个networking应用程序。 应用程序通过UDP接收数据并使用阻塞套接字,select(不是WSAPoll)和recv函数

为了testing,我使用了两个相同的笔记本电脑安装了不同的操作系统:戴尔Latitude D630,酷睿2双核2.2GHz,4Gb内存,broadcom NetXtreme 57xx千兆控制器。 我有以下结果:

Windows XP Professional 32bit:networking监视器应用程序显示networking接口从LAN接收平均速度为35 MBytes / s的数据。 应用程序从平均速度为30 MBytes / s的套接字接收数据,检测到13%的损失。

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

WSAEventSelect()可以在多个线程中使用以增加套接字限制吗?

Python的UDP套接字半随机无法接收

SO_SNDBUF的影响

如何中断在Windows上select呼叫?

如何使用python和执行命令连接到远程Windows机器

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

Nodejs(sailsjs),Nginx和sails.io(socket.io)

python套接字中的端口无效

连接错误:“没有路由到主机”

当ai_socktype已经指定的时候,调用getaddrinfo()的时候,ai_protocol还有什么其他目的。

如何防止内核传递数据包到networking层?

我为处理这个或类似问题的任何人提供以下帮助,因为我在处理类似问题时遇到了这个帖子。 我希望这可以节省一些别人的时间。

我还要感谢@Roman R.上面的评论和@ Rom098跟进评论,指出缓冲区大小的改变也对他/她有帮助。

一个应用程序使用低数据速率UDP的Windows套接字在多个终端之间进行数据通信的应用程序在Windows XP下运行良好,但随着迁移到Windows 7,我们开始遇到网络消息被丢弃的问题。

其架构是客户端通过发送和接收一系列UDP消息来与服务器端进行通信,客户端维护自己的状态。 客户终端具有处理用户输入和向服务器终端发送和接收消息的线程(客户机线程)。 服务器终端有一个线程,服务器线程,处理来自其他终端的请求消息以及自己的客户端线程。 简单的消息序列如下所示:

客户端向服务器端发送请求消息

服务器终端响应确认消息

服务器端处理请求并向客户端发送响应消息

客户终端向服务器终端发送确认

查看上面的注释,我们使用调试器进行了检查,发现Windows 7的认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,(const PCHAR)(&iOpt),sizeof(iOpt)); if (error < 0) { error = WSAGetLastError(); } } iOptLen = sizeof(INT); error = getsockopt (iSocket,SO_SNDBUF,sizeof(iOpt)); if (error < 0) { error = WSAGetLastError(); } }

我们所做的第二个改变是,如果客户端线程正在等待确认,并且来自服务器终端的响应消息,则将响应消息作为确认和响应的组合来处理。 我们正在做的是假设确认消息在某个点被丢弃。

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

也可以看看

在Windows下更改使用Windows注册表更改的套接字缓冲区大小将认缓冲区大小从8K修改为其他。

Windows中套接字发送缓冲区的大小是多少? 这是关于TCP然而提供关于setsockopt()更多信息。

Winsock UDP数据包被丢弃? 其中讨论了与提供附加信息的许多答案类似的问题。

应用笔记:来自Innominate.com的高带宽网络的Windows 2000 / XP TCP调整有一些有趣的信息,虽然也许有些过时,据我所知,在Windows 7中网络层被重写。

迈克尔·潘(Michael Pan)在codeproject.com上通过UDP协议进行的实时通信有很多关于使用UDP的技术问题的细节。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐