【问题标题】:Qt QUdpSocket readyRead() signal is not triggeringQt QUdpSocket readyRead() 信号未触发
【发布时间】:2011-09-28 02:26:39
【问题描述】:

我正在尝试编写一个小型 UDP 服务器应用程序。

我有一个客户端传输到这个应用程序套接字,我已经使用一个小型 UDP 回显程序(它将端口上接收到的数据回显到屏幕)验证了这发送正常,而且,我可以看到在 wireshark 中接收到的数据包.

我正在使用 QUdpSocket,它似乎在设置时绑定正常 - 但 readyRead() 信号似乎从未被触发。

我在下面包含了我的一些代码 - 目前我只是试图模拟小回声程序。

只是为以下代码提供一些上下文 - 在 UI 上按下按钮会调用在 UI 上键入的端口上的“setupNewSocket”。

#include "sockethandler.h"

SocketHandler::SocketHandler(QObject *parent) :
QObject(parent)
{
    udpSocket = new QUdpSocket(this);

    connect( &w, SIGNAL(openNewUDPSocket(quint16)), this, SLOT(setupNewSocket(quint16)) );
    connect( this, SIGNAL(printOnUI(QString,QString,QString)), &w, SLOT(updateUI(QString,QString,QString)) );

    w.show();
}

void SocketHandler::readPendingDatagrams()
{
     while (udpSocket->hasPendingDatagrams())
     {
         QByteArray datagram;
         datagram.resize(udpSocket->pendingDatagramSize());
         QHostAddress sender;
         quint16 senderPort;

         udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);

         QString data = QString( datagram.data() );
         QString sender_address = sender.toString();
         QString sender_port = QString("%1").arg(senderPort);

         emit printOnUI(data, sender_address, sender_port);

    }

}
void SocketHandler::setupNewSocket(quint16 port)
{
    if( udpSocket->bind(QHostAddress::LocalHost, port) )
    {
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
    }
    else
    {
    // bind has failed
    }

}

【问题讨论】:

    标签: qt networking udp


    【解决方案1】:

    QHostAddress::LocalHost 绑定到 127.0.0.1 。

    您可能需要使用绑定到 0.0.0.0 的 QHostAddress::Any。

    【讨论】:

    • 谢谢 - 我大约在 7 分钟前就意识到了这一点,但由于我只有 50 点信用,它不会让我在 8 小时过去之前回答我自己的问题。我向你致敬!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多