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 小时前
关于C++中的placement new
数据结构·c++·算法
tankeven1 小时前
C++ 封装
c++
谭欣辰1 小时前
C++倍增算法详解
数据结构·c++·算法
Brilliantwxx2 小时前
【C++】认识 list(初步认识+模拟实现)
开发语言·数据结构·c++·笔记·算法·list
Hical_W2 小时前
Hical 踩坑实录五部曲(一):Boost.Asio 协程开发的 N 个坑
网络·c++·开源
春夜喜雨2 小时前
类型定义的使用差异using/typedef/define/constexpr
c++·typedef·using·constexpr·类型定义·define·常量声明
智者知已应修善业2 小时前
【51单片机流水灯中断嵌套,低优先级中断完成后如何返回主程序】2023-10-15
c++·经验分享·笔记·算法·51单片机
lihongli0002 小时前
关于c++中锁的种类与使用
java·开发语言·c++
凤凰院凶涛QAQ2 小时前
《C++转Java快速入手系列》继承与多态篇
java·c++