在SOCKET中Send两次,如果时间太近,则在服务器端Receive的时候一次就收下来了。我怎么能把它们分开呢?在线等,马上结。

解决方案 »

  1.   

    一般使用都要自己定义一个结构,如:开头为5字节"start",后面包长度,最后的为结尾符号等
    这样就可以在buf中找到开头,然后按长度读,最后再对比一下结尾符号就可以区分了。
      

  2.   

    TCP接收的次数跟发送的次数没有关系,也不是两次发送的时间太近就会一次接收完毕,是recv中的接收参数以及队列里的数据量决定的
      

  3.   

    看看下面的代码吧,对你很有用:
    http://www.vczx.com/article/show.php?id=1041
      

  4.   

    TCP是包含拥塞控制机制的 不该出现你的情况
      

  5.   

    TCP 是流协议,不是消息协议,因此粘包是很正常的
    通常是通过协议来区别两个包的
      

  6.   

    你可以禁用 Nagle 算法,不过最好还是在协议上保障
    setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
      

  7.   

    原因是Nagle算法会将多个小包集中成一个大包进行发送,你也可以增大包的大小,但这样对网络环境影响不好
      

  8.   

    用udptcp就会这样,或者一个大包拆成若干小包
      

  9.   

    谢谢大家,本来是准备下班前结帖的,
    结果没找到答案,明天早上上班试了过后,如果可以就结帖。估计可以试试qrlvls(空 气) 老大的禁用Nagle 算法的方法。我编的程序支持TCP和UDP。发的时候每个帧代表某些特定的命令或数据,其中头部有包含帧长度。本来以为收到的数据会是一帧一帧的,结果不是那么回事,希望能少改些代码,所以找可以减少修改代码的方法。
      

  10.   

    老老实实分析包头确定包长吧,这是正确的做法,不要走偏门.服务器端不能保证客户端都不使用negle算法.
    就算一次recv到多个包,难道你根据包头信息还不能解析出这些包吗?晕
      

  11.   

    qrlvls(空 气) 老大的方法可以,不过我在自己的电脑试的时候可以,在别人的电脑上试不行,
    setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
    是不是传进去的bNodelay要先设置值啊???
      

  12.   

    在MFC的CSocket类的子类里,构造函数中,设置:
    this->setsockopt(TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
    其中bNodelay=1;
    结果是有时候能粘包,有时候不粘。而以前是肯定粘。
      

  13.   

    知道的再给点意见,,就要出DEMO版本了。。
    快点啊。
      

  14.   

    唉,这个问题不用讨论了,答案=tcp自己带包头确定数据长度(接收方先收包头)
    包尾就不要了(Nagle算法只是说发送端协议栈不要攒包,如果不采用,哪怕一个字节,也立刻发出去,否则要等发送缓冲区里有一定数据或者过了一定时间才会发,因此它不会解决楼主的问题),呵呵,udp不会粘包,发一个,对方收一个(丢了就没有了,呵呵),因此不需要包头(唯一要注意的是不要超长,有很多讨论的,看看就知道了)