在 Qt 中,您可以使用 QUdpSocket
类来实现广播功能。以下是一个简单的例子,演示如何使用 Qt C++ 发送和接收 UDP 广播消息。
广播发送端
#include <QCoreApplication>
#include <QUdpSocket>
#include <QHostAddress>
#include <QString>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QUdpSocket udpSocket;
// 启用广播
udpSocket.setBroadcast(true);
QString message = "Hello Broadcast!";
QByteArray datagram = message.toUtf8();
// 广播地址和端口号
QHostAddress broadcastAddress = QHostAddress::Broadcast;
quint16 port = 12345;
// 发送广播消息
qint64 bytesWritten = udpSocket.writeDatagram(datagram, broadcastAddress, port);
if (bytesWritten == -1) {
qDebug() << "Error sending broadcast:" << udpSocket.errorString();
return 1;
}
qDebug() << "Broadcast message sent!";
return a.exec();
}
广播接收端
#include <QCoreApplication>
#include <QUdpSocket>
#include <QHostAddress>
#include <QString>
#include <QObject>
class UdpReceiver : public QObject {
Q_OBJECT
public:
UdpReceiver(QObject *parent = nullptr) : QObject(parent) {
udpSocket.bind(QHostAddress::Any, 12345); // 绑定到指定端口
connect(&udpSocket, &QUdpSocket::readyRead, this, &UdpReceiver::processPendingDatagrams);
qDebug() << "Listening for broadcasts...";
}
private slots:
void processPendingDatagrams() {
while (udpSocket.hasPendingDatagrams()) {
QByteArray buffer;
buffer.resize(udpSocket.pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpSocket.readDatagram(buffer.data(), buffer.size(), &sender, &senderPort);
QString message = QString::fromUtf8(buffer);
qDebug() << "Received broadcast from" << sender.toString() << ":" << senderPort << "-" << message;
}
}
private:
QUdpSocket udpSocket;
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
UdpReceiver receiver;
return a.exec();
}
#include "main.moc"
编译与运行
确保您已经安装了 Qt 开发环境,并按以下步骤操作:
- 创建 Qt 项目:在 Qt Creator 中创建一个新的 Console Application 项目。
- 添加代码:将上述发送端和接收端的代码分别放入
.cpp
文件中。例如,可以将发送端放入sender.cpp
,接收端放入receiver.cpp
。 - 更新项目文件(
.pro
):确保在项目文件中包含必要的模块:QT += core CONFIG += c++11
- 编译和运行:
- 首先,运行接收器程序,它会开始监听来自网络的广播。
- 然后,在另一个终端或程序实例中运行发送器程序,它会发送广播消息。
注意事项
- 确保您的防火墙允许 UDP 流量通过指定的端口(在这里是
12345
)。 - 在不同的设备上测试时,请确保它们处于同一网络下以便能够收到广播消息。
内容由零声教学AI助手提供,问题来源于学员提问