本帖最后由 VisualEleven 于 2010-12-30 09:10:01 编辑

解决方案 »

  1.   


    是这样的,我也是这么想的。但是如果出现问题,那么只要中间有一个包解析错了,那后面的肯定全错。
    照理说tcp是基于连接的,传来的数据应该不会有问题。 那么有没有程序跑偏了的可能。使得出现中间某个包解析错误。
      

  2.   

    recv的时候对返回值做个判断,recv的参数是接收缓冲区的长度,返回值是实际接收的长度,实际接收的可能小于缓冲区的长度。这时候要判断有没有收完,没有收完继续收。
      

  3.   


    1、加帧头
       比如:0xEE 0xEE 0xEE 0xEE
    2、数据长度
       紧跟着帧头如果觉得还不够安全,可以在数据包的末端加帧尾或者校验信息
    收到数据后放到缓存里,然后开始查找帧头;找到帧头后按照数据长度信息查找帧尾或者校验,如果都符合了就处理数据包。这儿要限制“长度”大小,防止在找错帧头的情况下出现长时间等待。
      

  4.   

    大哥
    你难道不会看已经有的协议吗?
    HTTP协议不是很好吗? 人家都跑几十年了
    就是加长度,TCP自己会保证数据完整有序的
    如果你怕你程序跑偏了,那就是把正确的数据读错了撒,那就是你自己程序问题了
    只有自己解决了
      

  5.   

    啥粘包?没搞懂你们说啥啊。TCP是面向字节的流式传输,至于每个TCP segment的数据长度和内容界定,都需要应用层自己定义的。你这里如果需要判断接收的数据字节长度,当然需要自己定义一个格式了。HEAD + DATA是必须的方式。HEAD内包含有对data长度和类型的说明。接收时候按照这个格式解析即可。啥粘包不粘包的,在通信领域没有这个术语,不知道是哪位programmer发明的?!误人子弟啊。
      

  6.   

    用第一种,然后在包里面的数据有数据头啊,数据头如果错了就close socket让客户端断掉.
    就不会有太大问题啦.
      

  7.   

    再补充一点,TCP是可靠传输协议,可以保证"接收到"的数据是不会出现和发出方不一致的。所以你的所谓的HCS校验想法完全没有必要!这是TCP协议干的事情。
      

  8.   

    TNND
    TCP粘包,我去
    这个提法不知道那个垃圾说出来的
    以前也被它耽误过其实楼主你直接看看HTTP协议的报文格式会死吗?
      

  9.   

    第一种方式一般用于TCP/IP这类的网络应用。
    第二种方式也很常见,用于嵌入式或者比较低端的非WINDOWS编程,在这种情况下,包与包之间的标识符一般是由硬件产生的,不用人去处理。转义也是由硬件来进行的。