QT server服務端如何判斷客戶端斷開連接


在QT編程中有時會用到server服務端與客戶端進行TCP網絡通信,服務端部分代碼如下:

1、創建server用於監聽客戶端套接字

this->server = new QTcpServer(this);
this->server->listen(QHostAddress::Any,5001);
connect(this->server,SIGNAL(newConnection()),this,SLOT(newConnection()));

2、newConnection()函數

//信號槽函數--新的設備連接
void Widget::newConnection()
{
    //查詢空閑的套接字
    for(int i = 0; i<SOCKET_MAXNUM; i++)
    {
        if(!this->socketFlag[i])
        {
            this->socketIndex = i;
            break;
        }
    }
    this->socket[socketIndex] = this->server->nextPendingConnection();
    this->socketFlag[socketIndex] = SOCKET_FLAG_CONNECTED;
    connect(this->socket[socketIndex],SIGNAL(readyRead()),this,SLOT(readData()));
    scan_Device();
}

3、update_DeviceNetState()函數用於檢測更新socket狀態

//更新設備連接狀態,清理釋放過期的SOCKET
void Widget::update_DeviceNetState()
{
    int onlineDeviceNum = getChildItemCount(DEVICE_TB_ONLINE_DEVICE);
    qDebug()<<"Line-658 當前在線設備數量:"<<onlineDeviceNum;
    for(int i = 0;i<onlineDeviceNum;i++)
    {
        int socketID  = ui->DEVICE_TABLE->topLevelItem(DEVICE_TB_ONLINE_DEVICE)->child(i)->data(3,Qt::SocketIndex).toInt();
        bool netState = send_WakeHand(socket[socketID]);
        qDebug()<<"此設備在線? "<<netState;
        if(netState == STATE_OFFLINE)
        {
            clearSocket(socketID);
            deviceNetStateChange(i,DEVICE_TB_OFFLINE_DEVICE,DEVICE_TB_ONLINE_DEVICE,-1);
        }
    }
}

4、send_WakeHand(QTcpSocket *currSocket) 發送握手信號返回套接字返回值

//發送握手信號,判斷設備是否掉線
bool Widget::send_WakeHand(QTcpSocket *currSocket)
{
    int ret = currSocket->write("wake hands");
    qDebug()<<"ret ="<<ret;
    if(ret == -1)
        return STATE_OFFLINE;
    return STATE_ONLINE;
}

5、利用定時器QTimer定時檢查更新套接字狀態

QTimer *timer = new QTimer(this);
//定時檢查更新設備的網絡狀態    
connect(timer,SIGNAL(timeout()),this,SLOT(update_DeviceNetState()));
timer->start(1000);

代碼僅供學習參考,未經允許,禁止轉載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM