brief of gali 2024-05-27 17:47 采纳率: 0%
浏览 63

如何销毁服务器端的QTcpSocket对象?

客户端通过QTcpSocket连上QTcpServer后,客户端断开服务器连接(disconnectFromHost()方法),服务器这边删除对应的QTcpSocket对象后崩溃

客户端关键代码

void Widget::closeEvent(QCloseEvent *e)
{
    if(tcpSocket->state() != tcpSocket->ClosingState)
    {
        tcpSocket->disconnectFromHost();
    }
}

服务器中的QRunnable

void SocketThread::do_socket_disconnected()
{
    QString info = QString("%1 [%2:%3]离线了").arg(NOW).arg(ipStr).arg(port);
    qCInfo(category)<<info;
    delete this->socket;
}

void SocketThread::do_socket_disconnected()
{
    QString info = QString("%1 [%2:%3]离线了").arg(NOW).arg(ipStr).arg(port);
    qCInfo(category)<<info;
    delete this->socket;
}

服务器主线程关键代码

void TcpService::do_new_connection()
{
    QTcpSocket* socket = tcpServer->nextPendingConnection();
    QString info = QString("%1 [%2:%3]上线了").arg(NOW).
                   arg(socket->peerAddress().toString()).arg(socket->peerPort());
    qCInfo(category) << info;
    pool->setExpiryTimeout(1000);
    thread = new SocketThread(socket);
    // connect(thread,&SocketThread::finished,this,&TcpService::do_work_finished);
    bool res = pool->tryStart(thread);
    qCInfo(category)<<NOW<<"addr:"<<thread;
    QString threadStartInfo = QString("%1 [%2:%3]%4").arg(NOW).
                              arg(socket->peerAddress().toString()).
                              arg(socket->peerPort()).
                              arg(res?"线程启动成功":"线程启动失败");
    qCInfo(category)<<threadStartInfo;
}

客户端代码:https://github.com/gali-like-like/TcpClient.git
服务器代码:https://github.com/gali-like-like/TcpServer.git

  • 写回答

4条回答 默认 最新

  • brief of gali 2024-05-27 17:49
    关注

    重写QRunnable::run()方法

    void SocketThread::run()
    {
        qCInfo(category)<<NOW<<" "<<QThread::currentThreadId()<<"开始负责"<<ipStr<<":"<<port;
        QAbstractSocket::connect(socket,&QTcpSocket::readyRead,this,&SocketThread::do_socket_readyRead);
        QAbstractSocket::connect(socket,&QTcpSocket::disconnected,this,&SocketThread::do_socket_disconnected);
        while(this->socket->state() !=QAbstractSocket::SocketState::ClosingState)
        {
    
        }
        // emit this->finished();
    }
    
    评论

报告相同问题?

问题事件

  • 修改了问题 5月28日
  • 创建了问题 5月27日