ioctlsocket()进行非阻塞接收数据包的过程中,偶然会出现数据在接受端阻塞10秒左右

时间:2021-03-23 23:56:43
       在windows 2000 sp4平台下进行TCP通信,发送端每秒7~8包,每包32字节进行发送,接收端使用winsock2.0的函数ioctlsocket()进行非阻塞接收数据包的过程中,偶然会出现数据在接受端阻塞10秒左右后,一下都收到了这10秒的数据,通过网络监视软件监测这10秒数据已经进入接收端网卡.请问这样的情况如何解释??通过查询windows 2000的升级记录,发现sp2中ioctlsocket有一个BUG在sp3中被修复,不知到是不是由于修复后潜在的bug没有被测试到?

      这种情况的发生非常偶然,偶的试验室在进行这项测试时仅仅出现一次!急切盼望得到高手指点!

9 个解决方案

#1


看测试环境.如果是非内网,在互联网上测试,这一点不奇怪.双方的通信在几秒内突然断开或持续上一会,或者双方通信速度突然变得很慢这些情况,也是常有出现的.

#2


补充一下,我的测试环境非常干净,收发节点通过三层交换机连接

#3


也许是交换机的问题

#4


在测试过程中,使用网络抓包软件进行了交换机端口抓包,并没有出现阻塞现象

#5


在测试过程中,使用网络抓包软件进行了交换机端口抓包,并没有出现阻塞现象

#6


在测试过程中,进行对交换机端口抓包,并没有出现堵塞的状况

#7


这种情况,一般情况不要找系统的原因,90%是你代码的问题,能查的地方有以下几个方面:
1,接受段的线程有无被阻塞的可能
2,接收段的速度是否足够快,是否是select一通知,就马上接了
3,你写log的时间跟你收到数据的时间是否一致。

#8


veldwolf 的分析不错,
ioctlsocket()之后,接受线程sleep(10),之后rev(),rev后立即写log,接受段的线程无被阻塞的代码,这项测试已经连续持续1个月,仅仅出现1次10秒左右的阻塞.我自己倾向于ioctlsocket()内部的情况

#9


写log如果是用接收线程直接向硬盘写文件,则这个接受线程在微观上就是阻塞的,因为写磁盘是比较慢的,比较常用的做法是,写log的线程和接受线程分开,任何情况下接受线程所能操作的都因该只是内存,这样保证接受足够的块,另外查看你在接受数据的时候,是否频繁的分配了内存,这里也是可以优化的地方

#1


看测试环境.如果是非内网,在互联网上测试,这一点不奇怪.双方的通信在几秒内突然断开或持续上一会,或者双方通信速度突然变得很慢这些情况,也是常有出现的.

#2


补充一下,我的测试环境非常干净,收发节点通过三层交换机连接

#3


也许是交换机的问题

#4


在测试过程中,使用网络抓包软件进行了交换机端口抓包,并没有出现阻塞现象

#5


在测试过程中,使用网络抓包软件进行了交换机端口抓包,并没有出现阻塞现象

#6


在测试过程中,进行对交换机端口抓包,并没有出现堵塞的状况

#7


这种情况,一般情况不要找系统的原因,90%是你代码的问题,能查的地方有以下几个方面:
1,接受段的线程有无被阻塞的可能
2,接收段的速度是否足够快,是否是select一通知,就马上接了
3,你写log的时间跟你收到数据的时间是否一致。

#8


veldwolf 的分析不错,
ioctlsocket()之后,接受线程sleep(10),之后rev(),rev后立即写log,接受段的线程无被阻塞的代码,这项测试已经连续持续1个月,仅仅出现1次10秒左右的阻塞.我自己倾向于ioctlsocket()内部的情况

#9


写log如果是用接收线程直接向硬盘写文件,则这个接受线程在微观上就是阻塞的,因为写磁盘是比较慢的,比较常用的做法是,写log的线程和接受线程分开,任何情况下接受线程所能操作的都因该只是内存,这样保证接受足够的块,另外查看你在接受数据的时候,是否频繁的分配了内存,这里也是可以优化的地方