Qt QTcpServer类一个类(线程)listen监听连接,另一个类(线程)收发数据。
Qt规定,QTcpSocket不能作为参数传递。如果做参数传递,编译时就会报错提示。
用server端获取到连接QTcpSocket对象后如果要另一个线程收发数据。连接线程中新连接信号QTcpServer::newConnection的自定义槽函数中 ,通过QTcpServer::nextPendingConnection()返回获取到QTcpSocket对象,然后通过QTcpSocket::socketDescriptor()获取到socketDescriptor后,发信号传递给另一个线程中建立QTcpSocket对象,再setSocketDescriptor(),就获得了这个QTcpSocket对象。并且可以通过它获取到连接双方ip、port等信息。接收线程槽函数如下:
void CommCtrl::slotSocketConncet(qintptr socketDescriptor)
{
QTcpSocket* pTcpSocket = new QTcpSocket(this);
m_socketList.append(pTcpSocket);//添加到QTcpSocket*的列表,方便管理
pTcpSocket->setSocketDescriptor(socketDescriptor);
connect(pTcpSocket, &QTcpSocket::readyRead, this, &CommCtrl::slotNetReadReady); //有可读的信息,触发读槽函数
connect(pTcpSocket, &QTcpSocket::disconnected, this, &CommCtrl::slotSocketDisconnect);
qDebug() << "connect" <

博客讲述了在Qt环境中使用QTcpServer进行网络编程时,如何处理QTcpSocket不能作为参数传递的问题。通过在主线程中监听连接,在新线程中处理数据收发,避免了QSocketNotifier的多重注册警告。文章介绍了创建自定义QTcpServer子类并重写incomingConnection方法来传递socketDescriptor,确保线程安全地进行通信。
最低0.47元/天 解锁文章
1224





