QUdpSocket收不到回复及分析
来源:互联网 发布:js window监听事件 编辑:程序博客网 时间:2024/05/27 00:49
QT中使用QUdpSocket发送数据给服务器,然后通过readyread信号读取回复。
init:udp=new QUDPSocket()connect(udp,SIGNAL(readyread()),this,SLOT(processread()));work:udp->writedatagram
实际情况是:数据能够发送出去,服务器返回的数据却无法触发readyread信号。
实验后,如下代码能够正常接收
init:udp=new QUDPSocket()connect(udp,SIGNAL(readyread()),this,SLOT(processread()));udp->connectToHost()work:udp->write
或者
init:udp=new QUDPSocket()connect(udp,SIGNAL(readyread()),this,SLOT(processread()));udp->bind()work:udp->writeDataGram
按照帮助文档,The most common way to use this class is to bind to an address and port using bind(), then call writeDatagram() and readDatagram() to transfer data. If you just want to send datagrams, you don’t need to call bind().
也就是说一般需要绑定,若只是发送数据不需要接收,则可以不绑定。
分析源码:
QT的编码风格是,每个可导出的类都有一个隐藏的实现类,例如QUDPSocket有一个实现类QUDPSocketPrivate,大部分的代码逻辑都是在隐藏类中实现的。
QUDPSocket继承关系:QUDPSocket->QAbstractSocket->QIODevice,QAbstractSocketEngineReceiver
QUDPSocketPrivate继承关系:QUDPSocketPrivate->QAbstractSocketPrivate->QIODevicePrivate,QAbstractSocketEngineReceiver.
其中QAbstractSocketPrivate中有一个重要的元素,QAbstractSocketEngine engine,不同的平台有不同的实现,例如linux平台实现类为QNativeSocketEngine_unix。 engine实现的逻辑就是调用像connect, send, recv这样标准的socket编程接口。
QNativeSocketEngine中保存了一个QReadNotify成员(继承QSocketNofity)
void QNativeSocketEngine::setReadNotificationEnabled(bool enable){ ... d->readNotifier=new QReadNotifier(d->socketDescriptor,this); ...}
QReadNotifier继承QSocketNotifier检车SockAct事件(QWriteNotifier和QExceptionNotifier类似)
bool QReadNotifier::event(QEvent* e){ if(e->type()==QEvent::SockAct){ engine->readNofication(); } return QSocketNotifier::event(e);}
readNotification会告知QSocketEngineReceiver
void QAbstractSocketEngine::readNotification(){ receiver->readNotification();}
其中receiver是QSocketEngineReceiver类型,在QAbstractSocketEngine构造函数中被告知。readNotification是一个虚函数,在QAbstractSocketPrivate中定义,所以,实际上调用的是:
QAstractSocketPrivate::canReadNotification(){ ... emit q->readyRead(); ...}
q指向的QAbstractSocket导出类对象
为什么bind会影响数据的接收?
原因在于bind开启了ReadNotification
bool QUdpSocket::bind(..){ ... d_func()->socketEngine->setReadNotificationEnabled(true); ...}
- QUdpSocket收不到回复及分析
- Handler收不到消息分析
- Handle收不到消息的问题分析
- 应用程序收不到系统广播的分析
- 还原及回复数据库
- 为什么QUdpSocket只能收一次?原来是因为
- QUdpSocket Class
- 初识QUdpsocket
- [QT]QT教程之实例分析[九] 网络广播程序(QUdpSocket)
- QT类学习系列(4)- 01*-对QUdpSocket中的过程分析
- 技术记录---Handle收不到消息的问题分析
- 关于极光推送,部分手机收不到的分析
- EventBus activity收不到post的消息原因分析
- Android 6.0 BluetoothAdapter.startDiscovery()扫描不到蓝牙的问题分析及解决
- 验证码短信收不到的原因及解决办法
- 回复
- 回复
- 回复
- softmax回归
- C++:<sstream>头文件的应用
- pack布局
- iOS 视图控制器转场详解
- ONU
- QUdpSocket收不到回复及分析
- C#中枚举类型的使用
- 微信Android客户端架构演进之路
- 判断textView点击完成 回收键盘
- KivyMD安装详解以及可能遇到的坑
- RSync实现文件备份同步
- 自定义Toast显示归属地查询结果
- ScrollView嵌套GridView显示不全的解决办法
- UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout