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 无效、多余。
相关推荐
旖旎夜光1 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
程与留2 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci2 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
Littlehero_1214 小时前
QT自定义控件之热换站系统(源码开源)
开发语言·qt
_Narcissus_5 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
法哥20127 小时前
用 C++ 控制 CMW100,到底在干什么?
开发语言·c++
_Narcissus_7 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
冻柠檬飞冰走茶8 小时前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list
Brilliantwxx8 小时前
【C++】 高阶数据结构图(1)并查集
开发语言·数据结构·c++
Quz8 小时前
QML MouseArea 鼠标拖拽与滚轮缩放
qt