Qt C++ UDP通信
时间: 2025-06-18 13:02:09 浏览: 17
### Qt 和 C++ 实现 UDP 通信的示例代码
以下是基于提供的引用以及相关知识整理的一份完整的 Qt 和 C++ 实现 UDP 通信的教程和示例代码。
#### 示例代码说明
下面是一个简单的客户端和服务端的 UDP 通信示例,展示了如何通过 `QUdpSocket` 进行数据收发操作。服务端绑定到指定地址并监听传入的数据报;客户端向目标地址发送消息,并等待响应。
---
#### 客户端实现 (`client.cpp`)
```cpp
#include <QCoreApplication>
#include <QUdpSocket>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QUdpSocket udpSocket;
QByteArray data = "Hello from client!";
// 发送数据给服务器
bool sent = udpSocket.writeDatagram(data, QHostAddress("127.0.0.1"), 7755);
if (!sent) {
qDebug() << "Failed to send datagram.";
}
// 接收来自服务器的回复
while (true) {
if (udpSocket.hasPendingDatagrams()) {
QNetworkDatagram datagram = udpSocket.receiveDatagram();
qDebug() << "Received:" << datagram.data();
break;
}
}
return app.exec();
}
```
此部分实现了客户端的功能,它会尝试连接至本地主机上的特定端口(此处为 7755),并向其发送一条字符串消息[^3]。
---
#### 服务端实现 (`server.cpp`)
```cpp
#include <QCoreApplication>
#include <QUdpSocket>
#include <QDebug>
class UdpServer : public QObject
{
Q_OBJECT
public:
explicit UdpServer(QObject *parent = nullptr) : QObject(parent), udpSocket(new QUdpSocket(this))
{
// 绑定到本机 IP 地址及端口号
if (!udpSocket->bind(QHostAddress::LocalHost, 7755)) {
qCritical() << "Unable to bind!";
exit(-1);
}
connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::processPendingDatagrams);
}
private slots:
void processPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams()) {
QNetworkDatagram datagram = udpSocket->receiveDatagram();
qDebug() << "Message received:" << datagram.data();
// 将接收到的消息回显给客户端
udpSocket->writeDatagram(datagram.data(), datagram.senderAddress(), datagram.senderPort());
}
}
private:
QUdpSocket *udpSocket;
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
UdpServer server;
return app.exec();
}
#include "main.moc"
```
这段程序创建了一个继承自 `QObject` 的类来管理所有的 UDP 数据包读取逻辑。当检测到来自外部设备的新数据时触发槽函数执行进一步处理动作[^4]。
---
### 关键知识点解析
1. **QUdpSocket 类的作用**
- 提供了用于发送和接收 UDP 数据报的方法。
- 不像 TCP 那样需要建立可靠的连接,在某些场景下可以提供更低延迟的服务[^3]。
2. **基本方法介绍**
- `bind()` 方法用来关联某个具体的网络接口及其对应的端口号以便于接受外界请求。
- `writeDatagram()` 可以直接把字节数组形式的内容传递出去而无需关心底层细节。
- 当有新的可用数据到达之后就会发出信号通知调用者去获取这些新内容[`^4`]。
3. **错误处理机制**
虽然相比起流式的协议来说较为简化但仍需注意可能出现的各种异常情况比如内存不足等问题[^3].
---
###
阅读全文
相关推荐

















