我有一个应用程序,接收udp数据并将其发送到其他地址和端口。应用程序必须将一个数据包发送到自身,但我无法使其正常工作(尽管所有其他数据包都可以正常工作)。 数据包已发送,但是当我尝试接收它时,我只得到一个空的数据报(我不发送,据我所知,此时此刻什么也没有发送)。永远不会收到正确的数据包。
我尝试通过一个套接字同时管理发送和接收,如果正确,我不确定。这是我的代码。
myClass::myClass(QObject *parent):
QObject (parent)
{
///....
//some code
my_socket = new QUdpSocket(this);
connect(my_socket, SIGNAL(readyRead()), this, SLOT(readMyDatagram()));
///....
//some other code
}
void myClass::restartListening(quint16 _port)
{
if (my_socket->state() != QAbstractSocket::UnconnectedState)
{
my_socket->abort();
}
if(!my_socket->bind(QHostAddress::Any, _port))
{
auto error = my_socket->errorString();
return;
}
}
void myClass::sendMyDatagram(const QByteArray& packet)
{
if (my_socket->writeDatagram(packet, myadress, myport) == -1)
{
qWarning() << my_socket->errorString();
}
}
void TheClass::readMyDatagram()
{
QByteArray datagram;
QHostAddress sender;
quint16 senderPort;
if (my_socket->hasPendingDatagrams())
{
while (my_socket->hasPendingDatagrams())
{
datagram.resize(my_socket->pendingDatagramSize());
my_socket->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
}
}
if (datagram.size() == 0)
{
qWarning() << my_socket->errorString();
}
else
{
emit newDatagram(datagram);
}
}
因此,当更改要侦听的端口时,将调用restartListening()。我通过sendMyDatagram()发送数据包。发送的数据包在函数中不为空,然后正确调用readMyDatagram(),但始终为空(在datagram.resize(..)之后出现,我仔细检查了一下,所有端口都不同。做错了吗?