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


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

開關代碼:

 1 myClass()  2 {  3  QHostAddress ip;  4  quint16 port;  5     ip = QHoseAddress("192.168.10.76");              //服務器IP
 6     port = 8800;                                     //用服務器開放的端口號去連接服務器。
 7 }  8  
 9 /***************************開**************************/
10 int myClass::Open() 11 { 12     m_tcpClient->connectToHost(ip,port);             //用目標服務器IP/port執行連接動作
13     if(m_tcpClient->waitForConnected())              //等待連接返回
14  { 15         return 0; 16  } 17     return -3; 18 } 19  
20 /***************************關**************************/
21 int myClass::Close() 22 { 23     m_tcpClient->disconnectFromHost(); 24     if(m_tcpClient->state() == QAbstractSocket::UnconnectedState 25         || m_tcpClient->waitForDisconnected())       //多了個條件
26  { 27         return 0; 28  } 29     return -3; 30 }

讀:

 1 /***************************讀**************************/
 2 //讀我目前實現兩種  3 //1、這是我最先實現的 定義信號和槽,qiodevice.h中的readyRead()信號觸發槽函數進行讀取數據。
 4  
 5 myClass()  6 {  7     connect(tcpClient,SIGNAL(readyRead()),this,SLOT(ReadData()));  8     //頭文件要聲明SLOT,這里不寫了  9     //出現connect報錯:"use of undeclared identifier 'connect'" 10     //解決方案:增加基類public QObject 11     //我的是這樣寫class tcpComm:public ibasecomm,public QObject
12 } 13  
14 void myClass::ReadData() 15 { 16     //當有數據進來,槽函數激活,沒有過多測試激活時機等等,這種不是我需要的。
17 } 18  
19 //2、由上層調用我的讀寫函數,利用waitForReadyRead()函數阻塞進程,等待數據,函數默認參數為等待時長=30000ms,超時返回false
20  
21 int myClass::read(void * buffer, int len) 22 { 23 //嘗試在waitForReadyRead()函數之前有數據過來,當執行wait函數時,會直接返回true。 24 //在阻塞期間來數據,會返回true。 25 //阻塞默認參數30000ms,超時返回false。
26     if(m__tcpClient->waitForReadyRead()) 27  { 28         buffer = (void*)m_bRead.data_ptr(); 29         return m_bRead.size(); 30  } 31 } 32 //代碼功能不完整,主要是實現讀取數據功能。
33  
34  
35 /***************************寫**************************/
36 int myClass::Write(const void * buffer, int len) 37 { 38     const char * data = (char *)buffer; 39     qint64 nRes = m_tcpClient->write(data,len); 40     return (int)nRes; 41 }

 


免責聲明!

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



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