2017-02-01 181 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