我最近做一个点对点的socket异步通讯,就是在5ms内传一个浮点数,可是无论如何,都不能保证一个一个传输过去,当我将定时一点一点的增大,如果在120ms左右,就能保证
将再服务器断产生的每个数据都传输过去。我问了别的做过sokcket通讯的人,他们也说
socket通讯最低传输时间就是几时毫秒级。
 但是当我从一个浮点数增加到几十个浮点数一起传输的时候,还和上述情况一样,在120ms仍就能将每个数据都传输过去。传输时间并没有受到影响。
 所以我觉得基于socket通讯的本身是有一个延迟的,大约在50ms到100ms,我想或许与winows的操作系统有关,因为windows编程是基于消息机制的。剩下的传输时间其实就由
你网络的带宽决定了。也就是总时间=socket的延迟+(传送的字节数)/网速。
 所以当我在120ms的情况下增加字节的时候,传输时间并没有很大的变化。因为以10M/s的局域网,2k的字节才需用到约2ms,相对于100ms还是很小的。
 不知道是不是这样,请各位大虾近来讨论一下。

解决方案 »

  1.   

    当然有延时了。
    你的程序发送请求-》WIDNOWS系统-》网卡-》发送接收网卡-》WINDOWS系统-》接收程序WINDOWS任务切换时间片一般是50ms,
    因此总延时为120ms就很正常了。
      

  2.   

    yes, I send a file about 5M use 1.5s, another file 200k use 1.2s
      

  3.   

    tcp实现时有个优化措施,待发的数据不会立即发送
    这是楼主看到现象的主要原因,和其它的基本上关系不大
    当然这个优化也可以关掉,通过setsockopt关掉neagle算法
      

  4.   

    如果关掉这个优化措施,对传输会有什么影响?
      我觉得在不同的计算机上的不同进程间数据传送肯定会有延迟了,我比较同意rtdb(东临碣石)的看法。
      

  5.   

    你应该去从原理上理解传输协议,而不是你认为怎样
    如果你真的了解tcp协议,你就应该知道那120ms毫无意义>> WINDOWS任务切换时间片一般是50ms,
    >> 因此总延时为120ms就很正常了。
    这种解释,缘木求鱼了
      

  6.   

    试试将你发送的BUFFER直接作为socket的发送buffer
    —————————————————————————————————
    Let your soul guide you upon your way
    my qq is :131780
      

  7.   

    TO: core(酒载青山) 
    愿闻其详。TO 楼主:
    只一条语句而已, 请加上并测试一下。long optval = TRUE ;
    setsockopt(
      SOCKET s,                 
      IPPROTO_TCP1, //int level,                
      TCP_NODELAY, //int optname,              
      (char*)&optval, 
    sizeof(optval)) ;
      

  8.   

    TCP_NODELAY 取消Nagle算法(RFC896),Nagle算法用来减少主机的小包发送数量,它通过缓冲未确认的发送数据知道能够发送一个全长度的包来做到这一点,然而,对某些应用程序来说,此算法可能妨碍性能。
      

  9.   

    care(酒载青山):
      rtdb(东临碣石) :
      我已经试过了 成功了。
      基本可以做到实时。而且数据都传过去了,但是我不知道这种对传送大的数据包时候
      会不会有所影响?
      

  10.   

    Nagle算法的原理:
    TCP/IP协议规定了一个数据包的最大长度(MSS)。如果客户连续发送大量的小数据,则将这些数据拼成一个往往比分割成多个小包要好,因为数据包的封装需要一定开销。Nagle的原理主要就是在缓冲区中的数据少于MSS的时候(可能是上一次发包时留下的尾巴,也可能是应用程序就发了这么点数据),内核会等到上一个数据包被对方确认了之后,才能发出(主要是希望这段时间里应用程序能多发一些数据,凑成一个大包一起发出)。
      

  11.   

    5毫秒内决定可以
    1。检查你的SOCKET程序是否异步
    2。发送和数据是否分开
    3。是否用了内核对象,如事件等
    肯定可以实现,我做的一个项目ICMP包.在四台机器间往返,用时不到20ms。
      

  12.   

    我是用的异步传送方式,因为我是将控制一个机械手采样到的数据实时传送给服务器端,所以说是一边控制,一边发送。所以我如果用同步的话,如果出现阻塞,我的控制就没有办法进行。然后服务器端就将控制结果以web网页的形式发布,并绘制出实时曲线。
       现在我这套装置基本能够实现局域网内的实时控制。但至于效果,可能还不能算完善。
      

  13.   

    多嘴说一句:很多网络游戏外挂能关闭本机的Nagle算法,令玩家在PK能占到优势。TCP_NODELAY不犯法,只是违反网络道德,因为它令网络上的数据碎片增多了,加重internet负担。
      

  14.   

    为什么当sock接收缓冲区没数据时用select找可用的sock特慢啊?
      

  15.   

    我觉得5ms不能保证,原因和最开始rtdb(东临碣石)的理由相似。因为windows不是实时操作系统,你的指令有可能因为种种原因被其他高优先级中断抢先。