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 无效、多余。
相关推荐
码匠许师傅7 小时前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
游戏开发爱好者87 小时前
网络连接排查指南,谁在电脑后台偷跑流量,哪些程序在联网
网络协议·计算机网络·网络安全·ios·adb·https·udp
啦啦啦啦啦zzzz8 小时前
Logger的组装(c++20)
c++·算法·c++20
繁星蓝雨9 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
蒸蒸yyyyzwd10 小时前
机试学习笔记
c++·求职招聘
handler0111 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存
郝学胜-神的一滴11 小时前
C++11 工程级应用 09:告别无谓拷贝,解锁高性能移动语义
开发语言·数据结构·c++·vscode·软件工程·visual studio
hetao173383713 小时前
校内场-提高组 ZYZSC-S-Round 4
c++·算法
stellanke14 小时前
Linux网络编程实战2:TCP Socket 基础与实践
linux·网络·c++
Littlehero_12114 小时前
QT自定义控件之电气接线图(源码开源)
开发语言·qt