QT C++ UDP通信

0. UDP概述

UDP通信时轻量的、不可靠的、面向数据报、无连接的协议,用于对可靠性要求不高的场合。与TCP通信不同,两个程序之间进行UDP通信无需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口。

UDP消息传输有单播、广播和组播三种模式。

1. QT准备工作

.pro文件添加 QT += network

.h和.cpp文件添加#include <QtNetwork>

QUdpSocket *udpSocket;

udpSocket = new QUdpSocket();

connect(udpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

2. 第一种通信 单播

cpp 复制代码
//绑定本地端口号  连接
bool ok = udpSocket->bind(Local_Port);

//绑定远端的端口和IP 连接
//QHostAddress   Target_IP = QHostAddress(Target_IP_1);
//quint16 Target_Port = Target_Port_1.toUShort();
udpSocket->connectToHost(Target_IP,Target_Port);

//直接发送数据 而且只能给指定的端口和IP发送
udpSocket->write("connectToHost");

//断开两种都可以
udpSocket->disconnectFromHost();
//udpSocket->abort();

//槽函数
void onSocketReadyRead()
{
    Return_QByteArray.clear();

    //读取收到的数据报
    while(udpSocket->hasPendingDatagrams())
    {
          Return_QByteArray = udpSocket->readAll();    
          //Return_QByteArray = udpSocket->readLine();//数据中有/r/n或则/r或者/n系统崩溃
    }
}

3.第二种通信 单播

cpp 复制代码
//绑定本地端口号  连接
bool ok = udpSocket->bind(Local_Port);

//发出数据报 带远端的端口和IP 连接 
//变量是QString  Target_Port_1,Send_data_str
//QHostAddress   Target_IP = QHostAddress(Target_IP_1);
//quint16 Target_Port = Target_Port_1.toUShort();
 udpSocket->writeDatagram(Send_data_str.toLatin1(),Target_IP,Target_Port); 

//断开
udpSocket->abort();

//槽函数
void onSocketReadyRead()
{
    Return_QByteArray.clear();

    //读取收到的数据报
    while(udpSocket->hasPendingDatagrams())
    {
       Return_QByteArray.resize(udpSocket->pendingDatagramSize());
       QHostAddress    peerAddr;
       quint16 peerPort;
       udpSocket->readDatagram(Return_QByteArray.data(),Return_QByteArray.size(),&peerAddr,&peerPort);
    }
}

4.广播

cpp 复制代码
//绑定本地端口号  连接
bool ok = udpSocket->bind(Local_Port);

//广播
udpSocket->writeDatagram(str,QHostAddress::Broadcast,targetPort);

//槽函数
void onSocketReadyRead()
{
    Return_QByteArray.clear();

    //读取收到的数据报
    while(udpSocket->hasPendingDatagrams())
    {
       Return_QByteArray.resize(udpSocket->pendingDatagramSize());
       QHostAddress    peerAddr;
       quint16 peerPort;
       udpSocket->readDatagram(Return_QByteArray.data(),Return_QByteArray.size(),&peerAddr,&peerPort);
    }
}

5. Flush()函数

  • 不需要 flush()

原因:

  1. UDP 是数据报直接发内核缓冲区,write() 调用完立刻交给系统网络栈,没有 Qt 内部缓冲需要刷出去;
  2. flush() 是给 QFile、QTcpSocket 阻塞模式 用的,用来把内部缓存强制落盘 / 发出去;QUdpSocket 根本不靠流式缓冲,所以 flush 对 UDP 无效、多余。
相关推荐
_upupup9 分钟前
智能指针的原理及简单模拟实现(C++)
开发语言·c++
l1t11 分钟前
DeepSeek总结的OpenZL压缩变换器
c++·算法
郝学胜-神的一滴26 分钟前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建
坤坤子吖34 分钟前
算法学习——高精度加减乘除
c++·笔记·学习·算法
朝朝辞暮i1 小时前
C++ 第 14 课:引用 &
开发语言·c++·算法
白山编程大哥1 小时前
适合初学者练习的 C/C++ 开源项目推荐
c语言·c++·开源
C++ 老炮儿的技术栈1 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
个 人 练 习 生2 小时前
C++:模板初阶详解
开发语言·c++·经验分享·学习
知识分享小能手2 小时前
C++ 学习教程,从入门到精通,C++类继承 — 完整知识点详解(13)
开发语言·c++·学习
YYRAN_ZZU2 小时前
如何编一个gcc的交叉工具链
linux·c++