關於使用QTcpSocket的一些總結


QTcpSocket類的方法connectToHost會泄露內存,即使把調用這個方法的QTcpSocket實例delete掉,內存也不會釋放!反復connectToHost會導致段錯誤,十分危險。必須控制connectToHost的使用次數!

  1. 連接服務器 
    m_tcpSocket->connectToHost(“127.0.0.1”, 9877); 
    connected = m_tcpSocket->waitForConnected(); 
    只有使用waitForConnected()后,QTcpSocket才真正嘗試連接服務器,並返回是否連接的結果。

  2. 寫數據 
    m_tcpSocket->write(str.toStdString().c_str(), strlen(str.toStdString().c_str())); 
    m_tcpSocket->waitForBytesWritten(); 
    當使用waitForBytesWritten()后,QTcpSocket才真正發送數據。 
    m_tcpSocket->write(str1.toStdString().c_str(), strlen(str1.toStdString().c_str())); 
    m_tcpSocket->write(str2.toStdString().c_str(), strlen(str2.toStdString().c_str())); 
    的結果是發送了str1str2

  3. 斷開與服務器的連接 
    m_tcpSocket->disconnectFromHost() 
    m_tcpSocket->waitForDisconnected()

  4. 善於使用QTcpSocket的SIGNAL:connected(),disconnected(),error(QAbstractSocket::SocketError) 
    配合自定義私有開關變量bool connected,QTimer可以實現自動重連接等邏輯。(注意:如果一個線程有多個連接的話,由於QTimer是中斷當前線程的事件消息,故會影響其他連接,且重連接費時,故不太適用)

QTcpSocket調試經驗分享

這久在寫一個基於TCP的通信程序,Server端用WinCE實現,而Client端用Qt實現,之前已寫了一個VC的Client端,能正確向Server發送數據。

將Client端改用Qt實現后connectToHost()后,server端已能正確accept(),但就是write()后server的read函數無法響應。調試了半天沒有成功,火大呀!今天試着輸出socket的狀態后得到如下: 
bool TcpClient::newConnect(const QString &iAddr, quint16 iPort) 

mSocket = newQTcpSocket(this); 
mSocket->connectToHost(iAddr,iPort); 
qDebug(“State:%d\n”,mSocket->state()); // State: 2; 2代表ConnectingState,正確的應該為3(ConnectedState)

connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);

}

qint64 TcpClient::write(const QByteArray &iData) 

qint64len = mSocket->write(iData); 
qDebug(“State:%d\n”,mSocket->state()); // State: 2; 2代表ConnectingState,正確的應該為3(ConnectedState)

msleep(200);
return(len);


通過輸出狀態,已經找到問題的所在,哎!都是業務不熟害的呀! 
socket的連接是異步的,所以必須等連接建立完成才能使用,所以分別加入waitForConnected()和waitForBytesWritten()后調試通過。 
bool TcpClient::newConnect(const QString &iAddr, quint16 iPort) 

mSocket = newQTcpSocket(this); 
mSocket->connectToHost(iAddr, iPort); 
qDebug(“State:%d\n”,mSocket->state()); // State: 2; 2代表ConnectingState,正確的應該為3(ConnectedState)

constintTimeout=5*1000;
if(!mSocket->waitForConnected(Timeout))
{
    return(false);
}
qDebug("State:%d\n",mSocket>state()); // State: 3(ConnectedState)正確

connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);

}

qint64 TcpClient::write(const QByteArray &iData) 

qint64len = mSocket->write(iData); 
mSocket->waitForBytesWritten(300); 
qDebug(“State:%d\n”,mSocket->state()); // State: 3(ConnectedState)正確

msleep(200);
return(len);

}

 

轉自:http://blog.csdn.net/u011125673/article/details/50474491


免責聲明!

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



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