=============tcp通讯的一个问题============ 包头FFFF,包尾就可以是EEEE 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 难道我理解错了,FFFF不是包头,只是包长度? 这肯定是不行的,别人随便发点什么,你的程序就可能跑飞了。 FFFF我只是举例,这部分是指后面的数据部分的长度是65535个字节。先不讨论攻击的问题。。 感觉不够安全啊。这不是包头和包尾。FFFF是指后面的数据部分的长度。因为任何16进制值都有可能出现,所以不可能加包头和包尾这样的特殊16进制来区分。。 TCP 不用做什么帧头 帧尾 只要做下面这三个 如果你还但心不完整,那就加个校验位PackIDPackLengthPackData校验位 我做的传输是将内容与附加信息一起传输,当然附加信息排在第一的位置。附加信息里面就有我这次传输的内容有多少个字节,如果没有达到字节而网络断开,我会抛弃数据包。我用的TCP,流式传输,我不担心数据包的错位问题。 完全可以参照HTTP协议,你觉得那个有处理坏包的情况吗 http协议都是以\r\n结尾的,但是我整个数据部分都是16进制,出现0x0d0a的可能性非常大。。如果将所有16进制转换到ascii,如果中间出现0d0a的数据的话,就会出现错误因为这个0d0a是数据,而不是报文边界。。 http协议都是以\r\n结尾的,但是我整个数据部分都是16进制,出现0x0d0a的可能性非常大。。如果将所有16进制转换到ascii,如果中间出现0d0a的数据的话,就会出现错误因为这个0d0a是数据,而不是报文边界。。问题不是处理坏包的情况吗,楼主是不还想加个校验?个人觉得没那个必要,你看http,ftp, smtp哪个有校验了? 首先,默认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 .... 63beginreceive回调解析时获取到长度为0xff,由于获取到的有效数据只有100,需要下一个包(继续beginreceive)由于socket已断开,下一次异步读取必然抛错,此时抛弃上面的包,dispose wcf 发布问题(iis 宿主) net 如何调用java的一个类呢 关于两个DataTable 合成一个DataTable的问题 问一个关于泛型的问题 C#用Webbrowser访问网站时如何修改JS中的函数内容? 在asp.net里如何显示数据库中的图片 asp.net(C#)如何实现无组件上传 c# 在winform中如何改变控件边框颜色;设置鼠标指针在控件(panel 或其他)中指定位置区域显示成指定形式(形状)。 事件问题? 属性控件的问题! C#如何判定服务器上指定的exe程序是否正在运行? WPF动态生成TreeView 之后点击树中的一个节点,触发事件问题
这肯定是不行的,别人随便发点什么,你的程序就可能跑飞了。
FFFF我只是举例,这部分是指后面的数据部分的长度是65535个字节。先不讨论攻击的问题。。
FFFF是指后面的数据部分的长度。
因为任何16进制值都有可能出现,所以不可能加包头和包尾这样的特殊16进制来区分。。
PackLength
PackData
校验位
附加信息里面就有我这次传输的内容有多少个字节,如果没有达到字节而网络断开,我会抛弃数据包。我用的TCP,流式传输,我不担心数据包的错位问题。
http协议都是以\r\n结尾的,但是我整个数据部分都是16进制,出现0x0d0a的可能性非常大。。如果将所有16进制转换到ascii,如果中间出现0d0a的数据的话,就会出现错误因为这个0d0a是数据,而不是报文边界。。
http协议都是以\r\n结尾的,但是我整个数据部分都是16进制,出现0x0d0a的可能性非常大。。如果将所有16进制转换到ascii,如果中间出现0d0a的数据的话,就会出现错误因为这个0d0a是数据,而不是报文边界。。问题不是处理坏包的情况吗,楼主是不还想加个校验?个人觉得没那个必要,你看http,ftp, smtp哪个有校验了?
举个例子,有效数据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