QUdpSocket 读取问题
QUdpSocket reading issue
我从 UDP 客户端接收数据时遇到问题。我使用的代码是:
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]
但是在我的应用程序的控制台输出中,我收到了这个中继数据:
Message from: "192.168.1.110"
Message port: 5001
Message: "X¿
Size: 20
Pending datagrams: false
"58bf80"
可以看到只收到了数据的第一部分“58bf80”。似乎数据报没有任何限制,套接字运行正常。我看不出发生了什么。
提前致谢。
截断可能发生在从 QByteArray
到 QString
的转换中,字符串在空终止符(值为 0 的字节)中被截断。
要正确地将 QByteArray
转换为十六进制编码的 QString
,请使用 toHex
函数,如下例所示:
QByteArray data; //The data you got!
QString str = QString(data.toHex()); //Perform the conversion to hex encoded and to string
我从 UDP 客户端接收数据时遇到问题。我使用的代码是:
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]
但是在我的应用程序的控制台输出中,我收到了这个中继数据:
Message from: "192.168.1.110"
Message port: 5001
Message: "X¿
Size: 20
Pending datagrams: false
"58bf80"
可以看到只收到了数据的第一部分“58bf80”。似乎数据报没有任何限制,套接字运行正常。我看不出发生了什么。
提前致谢。
截断可能发生在从 QByteArray
到 QString
的转换中,字符串在空终止符(值为 0 的字节)中被截断。
要正确地将 QByteArray
转换为十六进制编码的 QString
,请使用 toHex
函数,如下例所示:
QByteArray data; //The data you got!
QString str = QString(data.toHex()); //Perform the conversion to hex encoded and to string