找回密码
 立即注册
收起左侧

UDP接收的数据中的提取遇到的奇怪问题……

11
回复
11350
查看
[复制链接]
累计签到:87 天
连续签到:1 天
来源: 2013-5-23 16:32:35 显示全部楼层 |阅读模式
1Qter豆
小弟最近做了个UDP接收一串数据的小程序。

其大致格式 是  AAxxxxBByyyyCCzzzzzDD……不断发送……

这种的,其中xyz啥的都是数字。

然后我遇到AA,让一个label1显示AA,遇到BB让另个label2显示BB这种的。

于是我是这么实现的。

首先UDP得到的数据temp

QString stauts =temp

int x=0
while(x<status.size()){
if(status.indxOf(AA,x)!=-1){
u->label1->setText("AA");
}
else if(status.indxOf(BB,x)!=-1){
ui->label2->setText("BB')
}
else if(status.indxOf(CC,x)!=-1){
ui->label3_setText("CC");
}
x++;
}
然后我写了个UDP发送的程序
temp接收的是AAxxxxBByyyyCCzzzzzDD

但是有时候会全部显示,有时候则会漏掉AA/BB/CC/DD中的某一个,有时候换一下发送顺序比如BBxxxxAAyyyyDDzzzzzCC又好了。。但是有时候又是坏的,总之时好时坏。我看了temp接收没有漏,那么到底是啥问题啊郁闷的,请大侠指点!!!谢谢!!


最佳答案

查看完整内容

不断发送是会发生问题的。即便一次发送很大的数据,也可能会出问题的,不要超过512字节。
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2013-5-23 16:32:36 显示全部楼层
不断发送是会发生问题的。即便一次发送很大的数据,也可能会出问题的,不要超过512字节。
回复

使用道具 举报

累计签到:87 天
连续签到:1 天
2013-5-25 00:37:48 显示全部楼层
yafeilinux 发表于 2013-5-24 22:46
不断发送是会发生问题的。即便一次发送很大的数据,也可能会出问题的,不要超过512字节。 ...

那前辈,我这段代码有错不?
回复

使用道具 举报

尚未签到

2013-5-25 01:39:40 显示全部楼层
能确定不丢包的话那就不是UDP了。。。
UDP本身设计的就是允许丢包的
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2013-5-25 13:56:20 显示全部楼层
20030969 发表于 2013-5-25 00:37
那前辈,我这段代码有错不?

没有什么语法错误
回复

使用道具 举报

累计签到:87 天
连续签到:1 天
2013-5-26 21:07:53 显示全部楼层
yafeilinux 发表于 2013-5-25 13:56
没有什么语法错误

哦 ,也就是说数据量不大的话这样写是可以实现功能吧?

那么如果需要1天24小时,每隔1分钟接收一组大约60字节的数据,我还需要考虑什么问题呢?缓存区占满吗?
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2013-5-26 22:15:43 显示全部楼层
20030969 发表于 2013-5-26 21:07
哦 ,也就是说数据量不大的话这样写是可以实现功能吧?

那么如果需要1天24小时,每隔1分钟接收一组大约6 ...

如果是每一分钟发一次的话就没有什么问题,只是不要连续大量发送就好。
回复

使用道具 举报

累计签到:87 天
连续签到:1 天
2013-5-26 23:54:19 显示全部楼层
yafeilinux 发表于 2013-5-26 22:15
如果是每一分钟发一次的话就没有什么问题,只是不要连续大量发送就好。 ...

了解了,谢谢!这个如果不关一直开着,不会溢出什么的吗?如果会,应该怎么处理呢?
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2013-5-27 22:27:53 显示全部楼层
20030969 发表于 2013-5-26 23:54
了解了,谢谢!这个如果不关一直开着,不会溢出什么的吗?如果会,应该怎么处理呢? ...

那要看你怎么实现了。如果每次都使用一个临时变量接受,处理完后这个临时变量就销毁了,是不会溢出的。
回复

使用道具 举报

尚未签到

2013-5-30 11:09:17 显示全部楼层
你的DD没有进行设置啊?还有你的status的size是多大,你的x++明显不合理啊。你这样,你将你这个字符串用QString拼接一下,比如AA*BB*CC*DD   然后Qstring有个section函数非常好用,你可以查下助手,接下来,用DebugView的工具调试下看看,没有就下载一个。很容易就能确定问题的所在。
回复

使用道具 举报

累计签到:87 天
连续签到:1 天
2013-5-30 11:33:11 显示全部楼层
xul 发表于 2013-5-30 11:09
你的DD没有进行设置啊?还有你的status的size是多大,你的x++明显不合理啊。你这样,你将你这个字符串用QSt ...

DD被我简化了。。
这边UDP收到数据是一组一组的,每组只包含唯一的AA BB CC DD 这样子。把收到的数据写入temp,
我的size取得就是status的啊……QString stauts =temp status.size(),然后从第x=0位开始
依次查询AA,BB,CC等等,查询数据位长度的次数,每查询一次,indexOf的查询开始的位置也加1,这样避开收到第二组又出现AA BB 没有CC的话,如果还从第0位开始查询就会把第一组中的CC查到,造成错误结果。
++x问题在哪了?告诉详细点,我是菜鸟啊……
回复

使用道具 举报

尚未签到

2013-5-30 15:31:51 显示全部楼层
没什么错误,我的意思是你其实不需要这样做,直接用QString将你要发送的数据拼接,然后收到后用section函数去取值,分别放在label上面,不需要循环啊。。。而且调试的时候也能看的清楚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了