【问题标题】:QUdpSocket doesn't emit readyRead() signalQUdpSocket 不发出 readyRead() 信号
【发布时间】:2014-03-11 13:55:42
【问题描述】:

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

Qt 5.1

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;
}

【问题讨论】:

    标签: c++ qt sockets qtnetwork qudpsocket


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我编译了这个例子并且它有效。此外,我使用 UdpReceiver 中的函数作为 readyRead() 插槽,但没有任何改变。而且,正如您在代码中看到的,插槽在 bind() 之前连接。仍然想知道为什么我的示例不起作用。我用的是Win7 32位
      • 这意味着您必须在连接插槽之前调用 bind 。你试过了吗?
      • 延迟 connect() 希望信号触发没有任何意义。
      • 连接前调用绑定。没有变化
      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      相关资源
      最近更新 更多