gpt4 book ai didi

c++ - 如何在QT中接收正确的UDP数据包?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:59 24 4
gpt4 key购买 nike

我正在尝试编写一个 QT 程序来接收 UDP 数据包。我正在尝试从 Packet Sender 软件接收这是我的代码

    socket = new QUdpSocket(this);
bool result = socket->bind(QHostAddress("150.100.50.88"),45454);
qDebug() << result;
if(result)
{
qDebug << "PASS";
}
else
{
qDebug << "FAIL";
}
processPendingDatagrams();
connect(socket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()),Qt::QueuedConnection);


void UDP::processPendingDatagrams()
{
QHostAddress sender;
u_int16_t port;
while (socket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
socket->readDatagram(datagram.data(),datagram.size(),&sender,&port);
qDebug() <<"Message From :: " << sender.toString();
qDebug() <<"Port From :: "<< port;
qDebug() <<"Message :: " << datagram;
} //! [2]
}

UDP.h:

 class UDP : public QObject 
{
Q_OBJECT public:
explicit UDP(QObject *parent = 0);

signals:

public slots:
void SendDatagram(u_int8_t,u_int8_t,u_int8_t);

private slots:
void processPendingDatagrams();

private :
QUdpSocket *socket;
};

readReady 信号和相应的槽没有工作。我可以在 Wireshark 中看到数据包。如果我尝试在循环中连续接收数据包,我就能看到数据报。信号和槽不工作的原因可能是什么。发送操作运行良好。

最佳答案

这段代码对我有用。请尝试一下。

.pro:

#-------------------------------------------------
#
# Project created by QtCreator 2017-03-10T11:44:19
#
#-------------------------------------------------

QT += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test
TEMPLATE = app


SOURCES += main.cpp\
mainwindow.cpp

HEADERS += mainwindow.h

FORMS += mainwindow.ui

主窗口.cpp:

#include "mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
socket = new QUdpSocket(this);
bool result = socket->bind(QHostAddress::AnyIPv4, 45454);
qDebug() << result;
if(result)
{
qDebug() << "PASS";
}
else
{
qDebug() << "FAIL";
}
processPendingDatagrams();
connect(socket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()),Qt::QueuedConnection);
}

MainWindow::~MainWindow()
{
}

void MainWindow::processPendingDatagrams()
{
qDebug() << "in !";
QHostAddress sender;
u_int16_t port;
while (socket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(socket->pendingDatagramSize());
socket->readDatagram(datagram.data(),datagram.size(),&sender,&port);
qDebug() <<"Message From :: " << sender.toString();
qDebug() <<"Port From :: "<< port;
qDebug() <<"Message :: " << datagram;
}
}

主窗口.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUdpSocket>


class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void processPendingDatagrams();
private:
QUdpSocket *socket = nullptr;
};

#endif // MAINWINDOW_H

主要.cpp:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}

尝试使用 netcat 命令:

 netcat -u 127.0.0.1 45454

运行命令后,只需键入任何内容并按回车键即可。

关于c++ - 如何在QT中接收正确的UDP数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42714700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com