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

UDP接收问题

2
回复
7520
查看
[复制链接]
累计签到:4 天
连续签到:1 天
来源: 2013-10-5 19:27:27 显示全部楼层 |阅读模式
1Qter豆
我想问一下既然readyRead()信号已经和processPendingdatagram()连接了,那么只要有数据到来,就会进入这个槽函数。我有三个问题,(1)每来一个数据包就会触发一个readyRead()信号吗?(2)万一某一时刻正在执行这个槽函数里面的this->file->write(datagram),就来一个readyRead()信号怎么办?(3)我在单步调试的时候发现,一旦进入这个槽函数,不怎么触发readyRead()信号,而是基本在while里面,难得跳出去。不是应该有数据来就会触发readyRead()信号的嘛,那么qDebug()会打印好多次的。
  1. void Widget::processPendingdatagram()
  2. { qDebug()<<i++;
  3.     while(this->receiver->hasPendingDatagrams())
  4.     {
  5.         QByteArray datagram;
  6.         datagram.resize(this->receiver->pendingDatagramSize());
  7.         this->receiver->readDatagram(datagram.data(),datagram.size());

  8.             this->name->write(datagram);
  9.             datagram.resize(0);
  10.         }

  11. }
复制代码

最佳答案

查看完整内容

其实编写这种应用程序最好不要去抠底层实现细节,那样你会思维混乱的。到底低层是怎么实现的,可以去了解,不过只要知道它们都有自己的协议,一般不会出现数据丢失即可。 你这里主要想知道为什么readyRead()信号不再触发,那是因为信号是事件驱动的,现在在while循环里出不去,所以不会获得信号。 还有,一次发送的数据,都可以使用hasPendingDatagrams()函数检测到,所以一次就读完了。等读完以后才跳出该函数。重新进入事件循 ...
回复

使用道具 举报

累计签到:1569 天
连续签到:1 天
2013-10-5 19:27:28 显示全部楼层
其实编写这种应用程序最好不要去抠底层实现细节,那样你会思维混乱的。到底低层是怎么实现的,可以去了解,不过只要知道它们都有自己的协议,一般不会出现数据丢失即可。

你这里主要想知道为什么readyRead()信号不再触发,那是因为信号是事件驱动的,现在在while循环里出不去,所以不会获得信号。

还有,一次发送的数据,都可以使用hasPendingDatagrams()函数检测到,所以一次就读完了。等读完以后才跳出该函数。重新进入事件循环。


细节还是不要深入思考了,只要程序可以实现自己的功能即可。

点评

发表于 2013-10-5 20:30
参与人数 1人气 +2 收起 理由
pursue + 2 对我帮助很大!

查看全部评分总评分 : 人气 +2

回复

使用道具 举报

累计签到:4 天
连续签到:1 天
2013-10-5 20:29:54 显示全部楼层
yafeilinux 发表于 2013-10-5 19:27
其实编写这种应用程序最好不要去抠底层实现细节,那样你会思维混乱的。到底低层是怎么实现的,可以去了解, ...

谢谢yafei老师,我会记住的
回复

使用道具 举报

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

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