我最近做一个点对点的socket异步通讯,就是在5ms内传一个浮点数,可是无论如何,都不能保证一个一个传输过去,当我将定时一点一点的增大,如果在120ms左右,就能保证
将再服务器断产生的每个数据都传输过去。我问了别的做过sokcket通讯的人,他们也说
socket通讯最低传输时间就是几时毫秒级。
但是当我从一个浮点数增加到几十个浮点数一起传输的时候,还和上述情况一样,在120ms仍就能将每个数据都传输过去。传输时间并没有受到影响。
所以我觉得基于socket通讯的本身是有一个延迟的,大约在50ms到100ms,我想或许与winows的操作系统有关,因为windows编程是基于消息机制的。剩下的传输时间其实就由
你网络的带宽决定了。也就是总时间=socket的延迟+(传送的字节数)/网速。
所以当我在120ms的情况下增加字节的时候,传输时间并没有很大的变化。因为以10M/s的局域网,2k的字节才需用到约2ms,相对于100ms还是很小的。
不知道是不是这样,请各位大虾近来讨论一下。
将再服务器断产生的每个数据都传输过去。我问了别的做过sokcket通讯的人,他们也说
socket通讯最低传输时间就是几时毫秒级。
但是当我从一个浮点数增加到几十个浮点数一起传输的时候,还和上述情况一样,在120ms仍就能将每个数据都传输过去。传输时间并没有受到影响。
所以我觉得基于socket通讯的本身是有一个延迟的,大约在50ms到100ms,我想或许与winows的操作系统有关,因为windows编程是基于消息机制的。剩下的传输时间其实就由
你网络的带宽决定了。也就是总时间=socket的延迟+(传送的字节数)/网速。
所以当我在120ms的情况下增加字节的时候,传输时间并没有很大的变化。因为以10M/s的局域网,2k的字节才需用到约2ms,相对于100ms还是很小的。
不知道是不是这样,请各位大虾近来讨论一下。
你的程序发送请求-》WIDNOWS系统-》网卡-》发送接收网卡-》WINDOWS系统-》接收程序WINDOWS任务切换时间片一般是50ms,
因此总延时为120ms就很正常了。
这是楼主看到现象的主要原因,和其它的基本上关系不大
当然这个优化也可以关掉,通过setsockopt关掉neagle算法
我觉得在不同的计算机上的不同进程间数据传送肯定会有延迟了,我比较同意rtdb(东临碣石)的看法。
如果你真的了解tcp协议,你就应该知道那120ms毫无意义>> WINDOWS任务切换时间片一般是50ms,
>> 因此总延时为120ms就很正常了。
这种解释,缘木求鱼了
—————————————————————————————————
Let your soul guide you upon your way
my qq is :131780
愿闻其详。TO 楼主:
只一条语句而已, 请加上并测试一下。long optval = TRUE ;
setsockopt(
SOCKET s,
IPPROTO_TCP1, //int level,
TCP_NODELAY, //int optname,
(char*)&optval,
sizeof(optval)) ;
rtdb(东临碣石) :
我已经试过了 成功了。
基本可以做到实时。而且数据都传过去了,但是我不知道这种对传送大的数据包时候
会不会有所影响?
TCP/IP协议规定了一个数据包的最大长度(MSS)。如果客户连续发送大量的小数据,则将这些数据拼成一个往往比分割成多个小包要好,因为数据包的封装需要一定开销。Nagle的原理主要就是在缓冲区中的数据少于MSS的时候(可能是上一次发包时留下的尾巴,也可能是应用程序就发了这么点数据),内核会等到上一个数据包被对方确认了之后,才能发出(主要是希望这段时间里应用程序能多发一些数据,凑成一个大包一起发出)。
1。检查你的SOCKET程序是否异步
2。发送和数据是否分开
3。是否用了内核对象,如事件等
肯定可以实现,我做的一个项目ICMP包.在四台机器间往返,用时不到20ms。
现在我这套装置基本能够实现局域网内的实时控制。但至于效果,可能还不能算完善。