QTcpSocket 对象的可工作线程

QTcpSocket 对象的可工作线程:

QTcpSocket 对象创建成功,并设置好底层socket描述符后;在qt中只能在一个线程中工作【即收发网络数据】这个线程就是创建这个QTcpSocket对象的线程,原理上这就与这个对象依附线程是同一个线程;但是注意的是使用 movetothread 可以改变对象的依附线程;但是这个QTcpSocket的对象的可工作线程不会因此而改变【qt的细节不做深究】

QTcpServer::incomingConnection函数的行为:

当有socket链接并成功可用时,其实首先调用的是incomingConnection虚函数;默认实现是在其中创建QTcpSocket并调用SocketDescriptor设置其底层socket描述符;然后讲这个创建的QTcpSocket对象添加到内部维护的list链表中,使其参与qt链接机制;最后emit newConnection信号;后面在其处理函数中调用的QTcpServer::nextPendingConnection返回的就是这个list中保存的对象;=>可知默认行为这个QTcpSocket对象的可工作线程应该是调用incomingConnection函数的线程,而这个函数是被qt框架调用;理论上应该也是QTcpServer对象的所依附线程【可以认为是GUI线程】=>这样这个QTcpSocket对象就不能被其他子线程使用了;【详见qt文档】

重新实现此函数以在连接可用时更改服务器的行为。

如果此服务器使用的是QNetworkProxy,则socketDescriptor可能无法与本机套接字函数一起使用,而应仅与QTcpSocket::setSocketDescriptor()一起使用。【即此时socketDescriptort并不是真正的底层socket无法被本机套接字API使用,只能被封装为QTcpSocket对象使用】

重写注意点:

1.如果在此方法的重新实现中创建了另一个套接字,则需要通过调用addPendingConnection()将其添加到挂起的连接机制中。【这种方法增加了QTcpSocket的子类灵活性,但是对象还是只能在GUI线程中工作】

2.如果希望将传入的连接作为另一个线程中的新QTcpSocket对象处理,则必须将socketDescriptor传递给另一个线程,并在那里创建QTcpSocket对象并使用其setSocketDescriptor()方法。【即重写实现里面只需要把socketDescriptor信息转发给另一个线程】【真正创建QTcpSocket对象的操作在另一个线程里面完成并设置底层socketDescriptor;就可以在另一个线程里面利用这个QTcpSocket对象进行网络IO操作了】

相关推荐
edjxj8 小时前
Qt图片资源导入
开发语言·qt
qq_25929724738 小时前
QT-事件
开发语言·qt
DreamLife☼8 小时前
Qt 中的 Q_OBJECT 宏详解 —— 从源码到底层机制的全面剖析
qt·信号·qml·q_object··rtti·运行时类型信息
歪歪1009 小时前
qt creator新手入门以及结合sql server数据库开发
c语言·开发语言·后端·qt·数据库开发
ajassi200011 小时前
开源 C++ QT Widget 开发(十三)IPC通讯--本地套接字 (Local Socket)
linux·c++·qt·开源
kyle~12 小时前
Qt---对话框QDialog
数据库·qt·microsoft
滴滴滴嘟嘟嘟.13 小时前
Qt动画功能学习
开发语言·qt·学习
FPGAI1 天前
Qt编程之信号与槽
开发语言·qt
只因在人海中多看了你一眼1 天前
B.50.10.09-RPC核心原理与电商应用
qt·网络协议·rpc
yudiandian20141 天前
【QT 5.12.12 下载 Windows 版本】
开发语言·qt