socket tcp通讯中,如果对方发送来的数据已经错位怎么办。

tuoluofo 2009-07-30 10:16:10
socket tcp通讯中,如果对方发送来的数据已经错位怎么办。

比如对方发生错误,少发了2个字节,如果我这边不做任何检查处理,那么以后的数据就全部都是错误的。


都是字节流,我这边应该做什么检查才能检测出这种错误呢,顶多就是检查一下应该是数字的几个字节是不是数字?

这种情况,挺恐怖的。
...全文
577 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuoluofo 2009-07-30
  • 打赏
  • 举报
回复
哦,这样做。行。

但是这么做,通讯层就依赖协议本身了。

如果我想实现通讯层跟协议层分离的,比如通讯层只负责接收数据流(并做一些跟协议尽量无关的验证),

协议层负责组解析数据流成为有意义的字段。
socoola 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tuoluofo 的回复:]
纯流方式的,发现错误包,肯定要断的,这个我清楚。


但是,到底怎么判断是错误包呢? 我问的就是这个。
[/Quote]
看了一下cmpp协议,第一个字段是长度,长度合理值有个范围,如果不在这个范围,就可以判定出错;
第二个字段是command id,一般也只有几个取值,不在这些取值范围内,肯定出错
.....
tuoluofo 2009-07-30
  • 打赏
  • 举报
回复
纯流方式的,发现错误包,肯定要断的,这个我清楚。




但是,到底怎么判断是错误包呢? 我问的就是这个。
qiangorqiang 2009-07-30
  • 打赏
  • 举报
回复
发现错误包直接把连接断了,让对端重新发过来。
tuoluofo 2009-07-30
  • 打赏
  • 举报
回复
无解。

继续等待。
socoola 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tuoluofo 的回复:]
直到接收到下一个报文开始字段再恢复正常处理
===========================
没有“报文开始字段”

哪个才算“报文开始字段”?


怎么检测“检测报文的格式”?

是不是就是我1楼说的那个,检测是否是数字,是否是字符串之类的?
[/Quote]
这个开始就要看你的协议具体规定了,一般会有特殊字符或字符串来做标识。
如果连这个都没有,这个协议需要规定双方一个交互方式,比如说我向服务器post一个数据包,服务器必须回我OK(数据完整)或者ERROR(数据不完整),或者没有回应,我就知道数据包已丢掉,那么会再发送报文过去.....
也就是说一个应用层协议应该会包含这些处理规则,如果连这些都没有,无可奈何
yemingwy 2009-07-30
  • 打赏
  • 举报
回复
发包要定包头的,最好有个长度,先确认要发送多少字节的数据
tuoluofo 2009-07-30
  • 打赏
  • 举报
回复
直到接收到下一个报文开始字段再恢复正常处理
===========================
没有“报文开始字段”

哪个才算“报文开始字段”?


怎么检测“检测报文的格式”?

是不是就是我1楼说的那个,检测是否是数字,是否是字符串之类的?
百事烟 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 socoola 的回复:]
按你的说法就不用检验,但是要进行差错恢复。
你检测报文的格式,发现不匹配,应该主动丢弃当前的数据,直到接收到下一个报文开始字段再恢复正常处理。
[/Quote]
就这个
socoola 2009-07-30
  • 打赏
  • 举报
回复
按你的说法就不用检验,但是要进行差错恢复。
你检测报文的格式,发现不匹配,应该主动丢弃当前的数据,直到接收到下一个报文开始字段再恢复正常处理。
tuoluofo 2009-07-30
  • 打赏
  • 举报
回复
而且还是定长的。
tuoluofo 2009-07-30
  • 打赏
  • 举报
回复
我正在考虑的是cmpp协议。

这个协议,只有从 n字节到m字节是什么字段,是字符串还是数字,的描述。

没有任何校验功能。

怎么校验。
socoola 2009-07-30
  • 打赏
  • 举报
回复
顶2L,你应该在TCP的基础上再做一个协议,这个协议规定报文的格式,比如说必须以XX开头,YY结束,出错就可以从检测标识符重新恢复
tuoluofo 2009-07-30
  • 打赏
  • 举报
回复
协议是别人定义的,早已经发布了。我只是按照协议接入别人的服务器收发数据。

拿到的协议文档只有字段描述,没有校验方法。

这种情况,怎么校验?
flyskytoday 2009-07-30
  • 打赏
  • 举报
回复
一般都要做校验的
上一次做的类似程序,做的加法校验,把前面N个char数相加,校验位放在最后一位,byte型,如果大于255就减255
这样能保证数据的正确性
用户 昵称 2009-07-30
  • 打赏
  • 举报
回复
tcp通讯你能收到错的,那表示他发错了,接收方如不做检查,就必须保证发送方正确,否则无法保证数据完整。

常规的检查都是加一些头,加一些校验。
vickler 2009-07-30
  • 打赏
  • 举报
回复
TCP你收错了,估计他发送那边知道吧,如果他不处理,那你也没办法
只有喊他重发

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧