QTcpSocket waitForReadyRead()等函數用法——客戶端開關讀寫應用筆記

當前工作是爲設備上位機做TCP通信,所以只需要寫客戶端程序,環境是Qt5.12 MinGW,用QTcpSocket類。以下是基本的開關讀寫遇到的溝溝坎坎。

開關代碼:

myClass()
{
    QHostAddress ip;
    quint16 port;
    ip = QHoseAddress("192.168.10.76");              //服務器IP
    port = 8800;                                     //用服務器開放的端口號去連接服務器。
}

/***************************開**************************/
int myClass::Open()
{
    m_tcpClient->connectToHost(ip,port);             //用目標服務器IP/port執行連接動作
    if(m_tcpClient->waitForConnected())              //等待連接返回
    {
        return 0;
    }
    return -3;
}

/***************************關**************************/
int myClass::Close()
{
    m_tcpClient->disconnectFromHost();
    if(m_tcpClient->state() == QAbstractSocket::UnconnectedState
        || m_tcpClient->waitForDisconnected())       //多了個條件
    {
        return 0;
    }
    return -3;
}

 讀:


/***************************讀**************************/
//讀我目前實現兩種
//1、這是我最先實現的 定義信號和槽,qiodevice.h中的readyRead()信號觸發槽函數進行讀取數據。

myClass()
{
    connect(tcpClient,SIGNAL(readyRead()),this,SLOT(ReadData()));
    //頭文件要聲明SLOT,這裏不寫了
    //出現connect報錯:"use of undeclared identifier 'connect'"
    //解決方案:增加基類public QObject
    //我的是這樣寫class tcpComm:public ibasecomm,public QObject
}

void myClass::ReadData()
{
    //當有數據進來,槽函數激活,沒有過多測試激活時機等等,這種不是我需要的。
}

//2、由上層調用我的讀寫函數,利用waitForReadyRead()函數阻塞進程,等待數據,函數默認參數爲等待時長=30000ms,超時返回false

int myClass::read(void * buffer, int len)
{
//嘗試在waitForReadyRead()函數之前有數據過來,當執行wait函數時,會直接返回true。
//在阻塞期間來數據,會返回true。
//阻塞默認參數30000ms,超時返回false。
    if(m__tcpClient->waitForReadyRead())
    {
        buffer = (void*)m_bRead.data_ptr();
        return m_bRead.size();
    }
}
//代碼功能不完整,主要是實現讀取數據功能。


/***************************寫**************************/
int myClass::Write(const void * buffer, int len)
{
    const char * data = (char *)buffer;
    qint64 nRes = m_tcpClient->write(data,len);
    return (int)nRes;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章