如果网速过慢,客户端两次发送的数据可能会被服务端一次就全部接收。
那么这种情况下要如何分清服务端接收到的数据包是客户端几次发送的呢!
有一种方法是给每次发送的数据包加上数据包的长度,可是这仲做法如果网上出现丢包怎么办呀!

解决方案 »

  1.   

    http://www.xiaozhou.net/ReadNews.asp?NewsID=240
      

  2.   

    一般来说,TCP的可靠性是应该充分相信的。
      

  3.   

    我想用下面的方法实现分包每一个数据包在发送时定义如下格式
    数据包长度|数据包序号|数据包内容可是上面的形式在一定的情况下是错误的
    就是如果在客户端一份数据被自动分成两个数据包发送,而且第二个数据包在途中丢失,那么数据就不能完整的到达服务端了。大家谁有TCP报头的数据格式资料啊!
      

  4.   

    是的,这样的情况你必须定义你的数据包的格式,包头-信息类别-长度等,必要时需要加校验位和结束字符.
    但是TCP报文是可靠的.
      

  5.   

    同意 karllere ,不过序号不需要,因为 TCP 不会乱序
      

  6.   

    请看下面的这两组数据报头 | 报文
    10     ABCDEFGHIJ
    8      ABCDEFGH假设以上报文的第一组被操作系统分成两次发送
    第一次为 10ABCD
    第二次为 EFGHIJ
    如果第二次的数据丢失,下一组数据8ABCDEFGH又到达了。
    那么在缓冲区中就会有这样的形式10ABCD8ABCDEFGH
    根据数据格式定义,在一次读取数据时就会取出10ABCD8ABCDE
    如果出现以上情况的话就会造成所有后续发来的数据包全部读取错误。
      

  7.   

    MFC中的CSocket类内部会自动处理粘包和丢包的问题吗?
      

  8.   

    tcp的协议层给你处理了丢包,所以你都不需要考虑丢包的问题。你把收到的数据放倒一个buffer里,从里面找header,然后解析出数据就ok了。如果udp的话会乱序,tcp都不需要考虑这些的。
      

  9.   

    可以使用如下的方法接收数据:需要循环调用Receive的 知道你实际接收的字节数== 你本来打算接收的字节数下面是我的程序中的一段代码BOOL MyReceiveData(CSocket *psocket,char *data,DWORD len)
    {
    DWORD left,idx,ret;
    left=len;
    idx=0;
     
    while(left>0)
    {
    ret = psocket->Receive(&data[idx],left,0 );
    if( ret == SOCKET_ERROR)
    {
    return FALSE;
    }
    left-=ret;
    idx+=ret;
    }return (idx==len)?TRUE:FALSE;
    }
      

  10.   

    老问题,这东西还是使用自己定义的协议。说明你的数据包的大小。使用那个socket的控件就爽多了。
      

  11.   

    CSocketFile 是完成什么优化工作的呢!
    在MFC的示例中总是说要将CSocket、CSocketFile和CArchive联合使用来完成信息的收发工作。
    可是我感觉这样还不如真接用CAsyncSocket::Receive方便呢!
    我就在想...
    CSocketFile是不是内部有处理粘包的机制啊!还有就是对于Socket的一切猜想都需要一个测试工具来验证,那么谁有好的测试工具呢!
    能不能给我提供一个呀!
      

  12.   

    MFC的CSocketFile有毛病的,千万别用。在粘包时经常出问题,最后我放弃用它,就好了。
    用CAsyncSocket::Receive接收下来以后,自己处理吧。