QTcpServer不能接收到Newconnection信号 (二)

本文介绍了一个名为MyCap的类,该类负责网络接口数据捕获和建立TCP服务器监听,用于将捕获的特定数据发送给客户端程序。通过使用QtConcurrent::run启动数据捕获线程,并设置定时器与槽函数实现数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写抓网口程序时,类名为

MyCap

这个类做两个事情,一个用来抓网卡数据,一个用来建立一个tcpserver监听把抓到的特定数据发给对应的客户端程序。

void MyCap::start()
{
    server->Start(this->serverIp,this->serverPort); //建立监听有对应的槽函数
    QtConcurrent::run(this,&MyCap::captureData); //抓网卡的数据,一直循环在抓取数据,调用一个回调函数来处理数据
    timer->start();
//    captureData(); //这里调用就导致调用槽函数了,应该是这个函数一直在循环吧。把它放到线程里就可以了。
}

 

`QTcpServer.nextPendingConnection()` 返回的是一个已经建立连接的 `QTcpSocket` 对象,因此不需要再发出 `QTcpSocket::connected` 信号。这个信号通常在异步连接过程中使用,例如当你调用 `connectToHost()` 方法后,连接尚未完成时会发出该信号。 当你调用 `nextPendingConnection()` 时,实际上你已经接收到客户端的连接请求,并且服务器已经接受了该连接。此时返回的 `QTcpSocket` 已经处于连接状态,因此不会触发 `connected` 信号。 ### 示例代码 以下是一个简单的例子,展示了如何使用 `QTcpServer` 和 `QTcpSocket`: ```cpp #include <QTcpServer> #include <QTcpSocket> #include <QDebug> class MyTcpServer : public QTcpServer { Q_OBJECT public: MyTcpServer(QObject *parent = nullptr) : QTcpServer(parent) {} protected: void incomingConnection(qintptr socketDescriptor) override { qDebug() << "New incoming connection:" << socketDescriptor; QTcpSocket *socket = new QTcpSocket(this); socket->setSocketDescriptor(socketDescriptor); // 直接处理已连接的 socket connect(socket, &QTcpSocket::readyRead, this, &MyTcpServer::onReadyRead); connect(socket, &QTcpSocket::disconnected, this, &MyTcpServer::onDisconnected); } private slots: void onReadyRead() { QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender()); if (socket) { QByteArray data = socket->readAll(); qDebug() << "Received data:" << data; } } void onDisconnected() { QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender()); if (socket) { qDebug() << "Client disconnected"; socket->deleteLater(); } } }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); MyTcpServer server; if (!server.listen(QHostAddress::Any, 12345)) { qDebug() << "Failed to start server:" << server.errorString(); return -1; } qDebug() << "Server started on port" << server.serverPort(); return app.exec(); } #include "main.moc" ``` ### 解释 1. **`incomingConnection`**: 当有新的客户端连接到服务器时,`QTcpServer` 的 `incomingConnection` 方法会被调用。在这个方法中,我们创建一个新的 `QTcpSocket` 并设置它的描述符。 2. **`readyRead` 信号**: 当客户端发送数据时,`QTcpSocket` 会发出 `readyRead` 信号。我们在槽函数 `onReadyRead` 中读取并处理这些数据。 3. **`disconnected` 信号**: 当客户端断开连接时,`QTcpSocket` 会发出 `disconnected` 信号。我们在槽函数 `onDisconnected` 中清理资源。 由于 `nextPendingConnection()` 返回的 `QTcpSocket` 已经处于连接状态,所以不会有 `connected` 信号被触发。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值