當前工作是為設備上位機做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 }