QTcpSocket通信編程時阻塞與非阻塞的問題


目標,qt程序作為客戶端,windows下winsock作為服務器端,實現兩端通信。

開始時寫了一個小函數測試:

[cpp] view plain
copy

QTcpSocket tmpSock;  
tcpSock.connectToHost("59.64.159.87",7716);  
tcpSock.write(buf,strlen(buf)+1);  
msleep(3000);  
tcpSock.disconnect();  
 

測試結果發現客戶端只能連接到服務器端,而服務器端收不到客戶端的消息。

初步揣測也許是Qt的socket機制使得socket緩沖隊列沒有即時發送。

換另一方法:

[cpp:showcolumns] view plain
copy

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
QTcpSocket tmpSock;  
char* buf ="hello";  
tcpSock.connectToHost("59.64.159.87",7716);  
tcpSock.write(buf,strlen(buf)+1);  
msleep(3000);  
tcpSock.disconnect();  
 

運行后,發現結果仍然不對。開始思考Qtsocket通信機制。想到這有可能是因為Qtcpsocket是非阻塞的方式引起的。

在網上查找,發現了一些資料。

 QTcpSocket因為繼承自QAbstractSocket,所以如果不采取一些措施的話,他就處於非阻塞方式,也就是事件編程,這有個好處就是可以在一個線程中實現多路tcp鏈接,節省資源,但是這種方式的編程難度比較大。

 對於初涉這方面的朋友來說還不太適合,所有在滿足要求的情況下還是阻塞方式的socket編程比較容易理解,QAbstractSocket里面提供了幾個函數用於阻塞方式編程,利用好它就可以簡單的編寫出網絡應用了:

 
waitForConnected() 等待鏈接的建立
waitForReadyRead() 等待新數據的到來
waitForBytesWritten() 等待數據寫入socket
waitForDisconnected() 等待鏈接斷開

當接收數據時,我們有個模式可以遵循:

[c-sharp] view plain
copy

while (socket.bytesAvailable() < (int)nSize) {  
             if (!socket.waitForReadyRead(Timeout)) {  
                 emit error(socket.error(),  
socket.errorString());  
                 return;  
             }  
         }  
 

這段話的主要意思就是等待nSize個數的到來,這是個一定要遵守的接收數據模板,可以把它寫成一個內聯函數,如果段話滿足條件,就可以容read讀數了。

寫數的話調用write,之后調用waitForBytesWritten來確定數據是否寫完。

 

然后修改原來的代碼。

[c-sharp] view plain
copy

QTcpSocket tmpSock;  
char* buf ="hello";  
tcpSock.connectToHost("59.64.159.87",7716);  
tcpSock.write(buf,strlen(buf)+1);  
if(tcpSock.waitforreadyread(3000))  
   emit SockCondition("successful");  
else  
   emit SockCondition("failed");  
tcpSock.disconnect();  
 

運行測試成功

http://blog.csdn.net/itjobtxq/article/details/8203809


免責聲明!

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



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