包头FFFF,包尾就可以是EEEE
 

解决方案 »

  1.   

    难道我理解错了,FFFF不是包头,只是包长度? 
    这肯定是不行的,别人随便发点什么,你的程序就可能跑飞了。
      

  2.   


    FFFF我只是举例,这部分是指后面的数据部分的长度是65535个字节。先不讨论攻击的问题。。
      

  3.   

    感觉不够安全啊。这不是包头和包尾。
    FFFF是指后面的数据部分的长度。
    因为任何16进制值都有可能出现,所以不可能加包头和包尾这样的特殊16进制来区分。。
      

  4.   

    TCP 不用做什么帧头 帧尾 只要做下面这三个 如果你还但心不完整,那就加个校验位PackID
    PackLength
    PackData
    校验位
      

  5.   

    我做的传输是将内容与附加信息一起传输,当然附加信息排在第一的位置。
    附加信息里面就有我这次传输的内容有多少个字节,如果没有达到字节而网络断开,我会抛弃数据包。我用的TCP,流式传输,我不担心数据包的错位问题。
      

  6.   

    完全可以参照HTTP协议,你觉得那个有处理坏包的情况吗
      

  7.   


    http协议都是以\r\n结尾的,但是我整个数据部分都是16进制,出现0x0d0a的可能性非常大。。如果将所有16进制转换到ascii,如果中间出现0d0a的数据的话,就会出现错误因为这个0d0a是数据,而不是报文边界。。
      

  8.   


    http协议都是以\r\n结尾的,但是我整个数据部分都是16进制,出现0x0d0a的可能性非常大。。如果将所有16进制转换到ascii,如果中间出现0d0a的数据的话,就会出现错误因为这个0d0a是数据,而不是报文边界。。问题不是处理坏包的情况吗,楼主是不还想加个校验?个人觉得没那个必要,你看http,ftp, smtp哪个有校验了?
      

  9.   

    首先,默认TCP底层每200毫秒清空缓冲区并发送一遍,所以有时会自己分包。200字节可能拆成N个包(例如三个64一个8等),所以服务器不处理必然会崩溃
    举个例子,有效数据255字节,分别为00-ff,按照2字节长度,n字节内容,4字节校验组包为:
    ff  00 00 01 02 ..... ff XX XX XX XX
    假设异步读取102字节后,客户端断开,获取到的数据为
    ff 00 00 01 02 .... 63
    beginreceive回调解析时获取到长度为0xff,由于获取到的有效数据只有100,需要下一个包(继续beginreceive)
    由于socket已断开,下一次异步读取必然抛错,此时抛弃上面的包,dispose