忘了全名怎么写,是N开头的,算法大意是组合小的数据,当成一个包发出去,我现在要禁止他,用SETSOCKETOPT()好象不行,各位谁弄过给讲一下

解决方案 »

  1.   

    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\n");
      

  2.   

    to topgrassstar(俺是爷们儿):这只是针对发送吗?如果接收的时候指定的接收缓冲区大于收到的数据会怎么样?
      

  3.   

    http://idoor.xiloo.com 有篇文章,TCP/IP Winsock编程要点 蒋勇 2002.5.23   利用Winsock编程由同步和异步方式,同步方式逻辑清晰,编程专注于应用,在抢先式的多任务操作系统中(WinNt、Win2K)采用多线程方式效率基本达到异步方式的水平,应此以下为同步方式编程要点。 1、快速通信 Winsock的Nagle算法将降低小数据报的发送速度,而系统默认是使用Nagle算法,使用 ......
      

  4.   

    同意 topgrassstar(俺是爷们儿):也针对接收,对于TCP,系统接收到数据后,会向发送端发送ACK确认收到消息。如果采用了Nagle算法,那么系统不会立即发送ACK,而是等待一定时间,看看是否有数据需要发送给发送端,如果有,则随这些数据将ACK一并发给发送端。
    《Windows网络编程技术》上面说得很清楚。(第九章)
    刚看到的,呵呵!
      

  5.   

    找到了,贴出来给大家看看:    为减少网络通信的开销,提升性能以及吞吐速度,系统默认采用N a g l e 算法。若应用程序请求发送一批数据(量较大),那么系统在接收了那些数据之后,可能会稍候一段时间,等其他数据累积进来,最后统一发送出去。但假如在一段规定的时间内,并无新数据加入,那么原先那些数据当然也会不管三七二十一地发送出去。这样造成的一个好结果便是:在单独一个T C P 包内,数据量增大了。与之相反的则是:使用多个T C P 包,但每个包携带的数据量比较少。如果是后一种情况,那么必然会涉及的一项“开销”在于,对每个包来说,其T C P 头都必须占据2 0 个字节的长度。例如,假定在此只发送2 个字节,那么2 0 个字节的头便显得有点儿多余。因此,在采用了N a g l e 算法后,可以更有效地利用数据包的可用空间。该算法的另一个功能是收到确认消息的延迟发送。系统收到T C P 数据之后,必须向对方反馈回一条A C K (收到确认)消息。但采用了该算法后,主机会暂时等待一段时间,看看是否有需要发给对方的数据,以便能随那些数据一道,将A C K 消息反馈回去,从而节省一个数据包的通信量(这又是一项开销)。
        本选项的目的便是禁止采用N a g l e 算法,因为在某些情况下,它的行为反而会产生不利的影响。若网络应用通常只需发送数量相当少的数据,同时要求能得到极其迅速的响应,那么再使用这种算法,反而会影响性能。Te l n e t 便是这样的一个典型例子。Te l n e t 的本质是一种“交互式”或“互动式”应用,用户可通过它登录至一台远程机器,然后向其传送命令。通常,用户每秒钟只会进行少量的键击。若N a g l e 在此仍要不知好歹地“发挥作用”,便会造成响应的迟钝,甚至造成对方主机不予应答的错觉。