2017-02-01 52 views
0

我從UDP客戶端接收數據時遇到問題。我使用的代碼是:QUdpSocket讀取問題

MyUDP::MyUDP(QObject *parent) : 
    QObject(parent) 
{ 
    socket = new QUdpSocket(this); 

    socket->bind(QHostAddress("192.168.1.10"),2000); 

    connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead())); 

    qDebug() << "Socket establert"; 
} 

void MyUDP::HelloUDP() 
{ 
    QByteArray Data; 
    Data.append("R"); 

    socket->writeDatagram(Data, QHostAddress("192.168.1.110"), 5001); 

    qDebug() << "Enviat datagrama"; 
} 

void MyUDP::readyRead() 
{ 
    QByteArray buffer; 

    buffer.resize(socket->pendingDatagramSize()); 

    QHostAddress sender; 
    quint16 senderPort; 

    socket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort); 

    qDebug() << "Message from: " << sender.toString(); 
    qDebug() << "Message port: " << senderPort; 
    qDebug() << "Message: " << buffer; 

    qDebug() << "Size: " << buffer.size(); 
    qDebug() << "Pending datagrams: " << socket->hasPendingDatagrams(); 

    QString str(buffer); 
    QString res = str.toAscii().toHex(); qDebug() << res; 
} 

的問題是,在Wireshark的我收到這個數據(所有數據):

Internet Protocol Version 4, Src: 192.168.1.110, Dst: 192.168.1.10 
User Datagram Protocol, Src Port: 5001, Dst Port: 2000 
Data (20 bytes) 
    Data: 58bf80000059bf800000410000000053bf800000 
    [Length: 20] 

但在我的應用程序的控制檯輸出我收到此trunkated數據:

Message from: "192.168.1.110" 
Message port: 5001 
Message: "X¿ 
Size: 20 
Pending datagrams: false 
"58bf80" 

您可以看到只接收到第一部分數據「58bf80」。看來數據報沒有任何限制,並且套接字運行良好。我不明白可能發生了什麼。

在此先感謝。

回答

0

截斷可能發生在從QByteArrayQString的轉換中,字符串在空終止符(值爲0的字節)中被截斷。

爲了正確地從QByteArray轉換爲十六進制編碼的QString使用toHex功能,如在下面的例子:

QByteArray data; //The data you got! 
QString str = QString(data.toHex()); //Perform the conversion to hex encoded and to string