Qt入門之小心read()給你設下的陷阱
阿新 • • 發佈:2019-01-04
最近幫學長寫了個Qt Tcpsocket客戶端的應用程式,被一個問題困擾了許久.因為以前沒有用Qt 寫過socket的客戶端程式
加上時間比較緊,都沒能好好的檢視些資料就急忙的寫程式碼,看了一些別人的程式碼,差不多都是相同的,但是我就出現了收資料
不全的問題..
最後查出原因是我在接受伺服器端的資料時使用了read()這個函式,接收的是個結構體,這裡順便說下怎麼在Qt 下收發結構體
發:
clientsocket->write((char *)&CardInfo, sizeof(CardInfo))
收:要對結構體CardInfo進行強制型別轉換.clientsocket->read((char *)&CardInfo, sizeof(CardInfo));
開始我就用了clientsocket->read((char *)&CardInfo, sizeof(CardInfo)); 這個函式來接收資料.. 這裡就涉及到了read()的緩衝區問題了
起先我並不知道read()是從緩衝區裡區資料的.所以有時候我收資料的時候這能收到這結構體的一部分,所以會造成資料的丟失.
後來選擇了用readAll()函式,但用它就要考慮怎麼把QBytesArray轉換成結構體了. 糾結了許久, 直接用了memcpy函式來解決了
主要也就遇到這個問題.其他的都沒什麼了.void inputpanel::receive() { QByteArray data; data = clientsocket->readAll(); memcpy(&CardInfo, data, sizeof(CardInfo)); }