QUdpSocket 不发出 readyRead() 信号

QUdpSocket doesn't emit readyRead() signal

本文关键字:信号 readyRead QUdpSocket      更新时间:2023-10-16

我遇到了QUdpSocket的问题。信号readyRead()似乎永远不会发出。因此,我决定创建QTimer并检查套接字读队列的状态。这样,我确保套接字正常工作(bytesAvailable()显示字节数)和信号/插槽机制也在工作(timeout()信号发生)。但是为什么readyRead()不排放呢?谢谢。

5.1 Qt
QString EthernetListener::listen()
{
     udp_socket = new QUdpSocket(this);
     connect(udp_socket, SIGNAL(readyRead()), this, SLOT(process_messages()));
     QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(dummy_slot()));
     timer->start(1000);
     bool res = udp_socket->bind(QHostAddress::Any, 1947, QUdpSocket::ShareAddress);
     if (!res)
         return QString("Не удалось подключиться к хосту").toUtf8();
     return QString("Идет прослушка сети. Хост: ");
}
void EthernetListener::dummy_slot()
{
    int test = udp_socket->bytesAvailable();
}
void EthernetListener::process_messages()
{
     bool bp = true;
}

如果在处理第一个数据报的同时有更多的数据可用,则可能发生此问题。将它添加到插槽中,它应该可以正常工作:

int readCount;
while (udpSock->hasPendingDatagrams())
{
    readCount = udpSock->readDatagram(buffer, 4096);
    cout << "readCount = " << readCount << endl;
}

您可以尝试使用这个实现基本接收器:Udp接收器
可能您没有正确地从插槽读取,所以看起来信号没有发出。或者您在连接槽后调用bind:可能您应该在连接槽之前调用bind