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