Qt UDP 读取错误



我试着写一个小的客户端-服务器程序。客户端应检测在同一 LAN 中运行的所有服务器。我尝试使用 qt 实现 UDP 广播,但我的读取函数始终返回 -1。如果我在套接字上调用 dataAvailable() 函数,它说有 4 个字节可供读取,但由于某种原因它无法读取它们。

现在我正在尝试在同一台机器和同一程序中接收广播

这是我的主要内容:

#include <iostream>
#include <QString>
#include <QThread>
#include "../include/network.h"
using namespace std;
using namespace network;
int main () {
    Network *n = new Network ();
    n->broadcast("test");
    if (n->dataAvailable()) {
        cout << "Data available: ";
        cout << n->getData().toStdString() << std::endl;
    } else {
        cout << "No data" << endl;
    }
    delete n;
}

和我的网络类:

#ifndef NETWORK
#define NETWORK
#include <QObject>
#include <QUdpSocket>
#include <iostream>
namespace network {
    class Network : public QObject {
        Q_OBJECT
    public:
        const static int BROADCAST_PORT = 52433;
        explicit Network(QObject *parent = 0) {
            socket = new QUdpSocket ();
            socket->bind (QHostAddress::Any, BROADCAST_PORT);
        }
        ~Network () {
            delete socket;
        }
        bool dataAvailable () {
            return socket->hasPendingDatagrams();
        }
        QString getData () {
            if (!dataAvailable()) {
                return "";
            }
            char *data = 0;
            std::cout << socket->pendingDatagramSize() << std::endl;
            std::cout << QString("recv: %1")
                    .arg(socket->readDatagram(data,
                                 socket->pendingDatagramSize())).toStdString();
            return QString(data);
        }
        void broadcast(QString data) {
            QUdpSocket *broadcast = new QUdpSocket ();
            broadcast->connectToHost(QHostAddress::Broadcast, BROADCAST_PORT);
            std::cout << broadcast->write(data.toStdString().c_str())
                      << std::endl << std::endl;
            delete broadcast;
        }
    private:
        QUdpSocket *socket;
    };
}
#endif // NETWORK

输出如下:

4
Data available: 4
recv -1

这意味着

  1. 4 字节从广播发送
  2. 套接字检测到 4 个字节可用
  3. 尝试读取 4 个字节失败
  4. getData()返回的 QString 为空

不幸的是,我找不到任何可能获得有关该错误的更多信息

您肯定需要分配内存来读取数据报。现在您尝试将其写入空指针。

// char *data = 0;
std::cout << socket->pendingDatagramSize() << std::endl;
QVector<char> buffer(socket->pendingDatagramSize()); // create buffer
std::cout << QString("recv: %1")
        .arg(socket->readDatagram(buffer.data(),
                socket->pendingDatagramSize())).toStdString();

相关内容

  • 没有找到相关文章

最新更新