Winsock的Nagle算法将降低小数据报的发送速度,而系统默认是使用Nagle算法,使用 int setsockopt( SOCKET s, int level, int optname, const char FAR *optval, int optlen );函数关闭它 例子: SOCKET sConnect; sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); int bNodelay = 1; int err; err = setsockopt( sConnect, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));//不采用延时算法 if (err != NO_ERROR) TRACE ("setsockopt failed for some reason ");;
第二 本身TCP IP网络的数据传输就具有不确定性。有多条通路时 很可能数据走的路线是不一样的
1.网络的时延是存在的,所以数据到达的时间和数据产生端的时间间隔是不可能绝对保持一致的。
2.Nagle算法对小包的聚集也会产生延迟,如果你使用TCP协议的化。参考:
http://blog.csdn.net/windcsn/archive/2005/07/18/428166.aspx
3.你的应该程序一定要设计成这种时间间隔的方式吗?尽量避免这个方式
4.如果非要设计如此,请考虑在接收端自行处理,而不能根据网络事件。但这样也不是很准确,且最后得到的结果可能和你想要的结果不太一样。
我想最大的原因应该是在接收延迟,可以你接受第N个包在对其处理之前,第N+1个包已经到达客户机了,并被网卡驱动缓冲起来了。所有,很正常。建议将服务器端每隔 0.1 秒发一帧数据设置为
服务器端每隔 5~10 秒发一帧数据,应该就差不多是一样的啦。
1.对于网络应用程序来说,数据在网络上的传说时间绝对大于数据在接收端的接收时间.SOCKET吸收数据是很快的。如果接收端应用程序不是处理大量的事情,对到达的数据很能很快的吸收。
2.Nagle算法有200ms(0.2s)的延迟,当然对于0.1s的时间间隔是不理想的;明显你的数据很小,肯定被Nagle算法挡在那里了。
建议:
1.修改发送间隔时间(至少>0.2s),如果一定要同步间隔,但这并不能保证一定可以同步
2.接收端采用多线程,保证数据接收不被你的应用程序运算组塞住,而让你的数据在SOCKET没有取而可能导致SOCKET区被FILL满,再导致发送端不能发送。
你用的阻塞方式,也可能导致时间的等待
还有Nagle算法对于包的处理,需要等待另一端的返回,才继续发送...
感谢诸位的帮助和指教!