就是关闭Nagle算法的操作。网上关于这个的文章很乱,懂的不懂的都在说我的代码如下:
if((m_Client=::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) ==INVALID_SOCKET)
{
return;
}
if (connect(m_Client,(sockaddr *)(&dest),sizeof(sockaddr)) ==SOCKET_ERROR)
{
return;
}
const char bNodelay = 1; 
int err=setsockopt(m_Client,IPPROTO_TCP,TCP_NODELAY,&bNodelay,sizeof(char));然后进行连续send操作,接收段仍然收到连在一起的数据。Debug的结果,err确实是0,也就是说setsockopt执行成功的。然后又有人说要把接收缓冲设为0。于是我又添加了如下代码: int bufsize=0;
err=setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char *)&bufsize,sizeof(bufsize));// s是服务器端的SOCKET结果还是不行原因在哪儿?还有没有其它因素可能会影响的?

解决方案 »

  1.   

    从TCP/IP协议底层去读
    你没理解透TCP/IP协议以及SOCKET的实现
    TCP是用IP层来实现的,光关闭NEDELAY有什么用?
    TCP是流!!!!!!
      

  2.   

    因为有人说可以实现,并且实现了。
    那这个人估计来自火星
    接收端接收什么,发送端是无法控制的[连续发送]
    除非约定接收包的大小或者指定结尾字符
    你自己看看 TCP-》IP-》TCP
    你说可能吗?
    就象两个闸门,上面的闸门每次放1吨水,每隔10秒放一次,
    你能保证下面的闸门每次接收的肯定是一吨?根本是扯淡吗,连续的流水怎么可能按每次一吨来接收?
    所以说实现的那个人来自火星