UDP是一种无连接协议,因此它不保证数据包的顺序或可靠传递。
1.包含头文件#include <QUdpSocket>
2.在窗口中创建udpSocket对象
QUdpSocket *udpSocket = new QUdpSocket(this);
//this通常指向你的Qt窗口或对话框类
3. 连接信号和槽
QUdpSocket
有多个信号,如readyRead()
,当有新数据可读时会发出此信号。你可以连接这个信号到一个槽函数,以便在接收到数据时进行处理。
connect(udpSocket, &QUdpSocket::readyRead, this,
&YourClass::readPendingDatagrams);
4. 发送数据
使用writeDatagram()
函数发送数据。这个函数需要数据、目标地址和端口作为参数。
QByteArray datagram = "Hello, UDP!";
QHostAddress address("127.0.0.1"); // 假设你正在向本地机器发送数据
quint16 port = 12345; // 目标端口
udpSocket->writeDatagram(datagram, address, port);
5.接收数据
使用pendingDatagramSize()
和readDatagram()
函数来读取接收到的数据。
void YourClass::readPendingDatagrams()
{
//hasPendingDatagrams()返回一个布尔值判断是否有消息等待接收
while (udpSocket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
// 在这里处理接收到的数据
qDebug() << "Received datagram:" << datagram << "from" << sender.toString() << ":" << senderPort;
}
}
6.bind()函数
值得注意的是,UDP是无连接的协议,因此bind
函数只与接收数据相关,而与发送数据无关。
QUdpSocket *udpSocket = new QUdpSocket(this);
QHostAddress address(QHostAddress::Any); // 监听所有网络接口
quint16 port = 12345; // 监听12345端口
udpSocket->bind(address, port);
若bind函数已经绑定了ip和端口则readDatagram()就不需要再绑定
另外,bind(),readDatagram()等函数还有多个重载版本,根据情况使用