1. 程式人生 > >Qt入門之小心read()給你設下的陷阱

Qt入門之小心read()給你設下的陷阱

最近幫學長寫了個Qt Tcpsocket客戶端的應用程式,被一個問題困擾了許久.因為以前沒有用Qt 寫過socket的客戶端程式

加上時間比較緊,都沒能好好的檢視些資料就急忙的寫程式碼,看了一些別人的程式碼,差不多都是相同的,但是我就出現了收資料

不全的問題..

最後查出原因是我在接受伺服器端的資料時使用了read()這個函式,接收的是個結構體,這裡順便說下怎麼在Qt 下收發結構體

發:

clientsocket->write((char *)&CardInfo, sizeof(CardInfo))
收:
clientsocket->read((char *)&CardInfo, sizeof(CardInfo));
要對結構體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));

}
主要也就遇到這個問題.其他的都沒什麼了.