Qt网络编程之搭建Udp通信【单播、组播、广播】

简介: Qt网络编程之搭建Udp通信【单播、组播、广播】

UDP概念

UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。UDP不提供可靠性,也不提供报文到达确认、排序以及流量控制等功能。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。


UDP传输方式

UDP有单播、广播、组播

只有UDP有广播和多播, TCP只能进行点对点的单播, 多播的重点是高效的把同一个包尽可能多的发送到不同的,甚至可能是未知的设备。但是TCP连接是一对一明确的,只能单播。


文中涉及到所有的代码下载地址

代码下载。这里有文章中所有的代码。如果没有积分可以私聊我发你。

单播

服务端(发送者)

服务器端不需要绑定。只需要在发送时指定对方IP以及端口即可。


m_sender->writeDatagram(dataGram.data(),// 发送内容
                        dataGram.size(),// 发送长度
                        QHostAddress("192.168.0.108"),  // 对方IP
                        6666);//对方端口


客户端(接收者)

客户端需要提前将本地IP和对应的端口进行绑定。然后关联readyRead信号。进行对应的实时读取。

下面这段代码是提前进行绑定和对应的信号槽关联

    groupAddress = QHostAddress("192.168.0.112");     // 本地地址
    int port1 = 6666;                         // 本地端口
    bool ret = m_receiver->bind(groupAddress,port1,QUdpSocket::ShareAddress);
    if(ret == false)
    {
        QMessageBox::warning(this,"error", "绑定失败");
    }
    //当接收端接收到数据时,就会发送readRead信号
    connect(m_receiver,&QUdpSocket::readyRead,this,&ReceiverWidget::processData);


下面这段代码是槽函数的一个实时读取并显示在标签上。

void ReceiverWidget::processData()
{
    QString strData;
    //有未处理的数据报
    while(m_receiver->hasPendingDatagrams())
    {
        QByteArray dataGram;
        //读取的数据报大小
        dataGram.resize(m_receiver->pendingDatagramSize());
        m_receiver->readDatagram(dataGram.data(),dataGram.size());
        ui->textBrowser->insertPlainText(dataGram);   //将接收到的数据显示到标签上
        ui->textBrowser->insertPlainText("\n");   //将接收到的数据显示到标签上
    }
}


效果图


组播

组播相当于是在广播的基础上在加入组播。

服务端(发送者)

服务器端不需要绑定。只需要在发送时指定对方IP以及端口即可。

    m_sender=new QUdpSocket(this);
    QByteArray dataGram= ui->lineEdit->text().toUtf8();
    QHostAddress appaddr;
    m_sender->writeDatagram(dataGram.data(),
                            dataGram.size(),
                            QHostAddress("224.0.0.0"),// 组播地址
                            7755);


客户端(接收者)

客户端需要对应的端口进行绑定。并加入到组播地址中,然后关联readyRead信号。进行对应的实时读取。

下面这段代码是提前进行绑定、加入组并关联信号和槽

    groupAddress = QHostAddress("224.0.0.0");     // 组播地址
    port = 7755;
    m_receiver = new QUdpSocket(this);
    bool aa = m_receiver->bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
    if(false == aa)
    {
        qDebug() << "绑定失败!";
    }
    // 加入组播
    bool cc = m_receiver->joinMulticastGroup(groupAddress);
    if(false == cc)
    {
        qDebug() << "加入组播失败!";
    }
    //当接收端接收到数据时,就会发送readRead信号
    connect(m_receiver, &QUdpSocket::readyRead, this, &ReceiverWidget::processData);


下面这段代码是槽函数的一个实时读取并显示在标签上。

void ReceiverWidget::processData()
{
    QString strData;
    //有未处理的数据报
    while(m_receiver->hasPendingDatagrams())
    {
        QByteArray dataGram;
        //读取的数据报大小
        dataGram.resize(m_receiver->pendingDatagramSize());
        m_receiver->readDatagram(dataGram.data(),dataGram.size());
        ui->textBrowser->insertPlainText(dataGram);   //将接收到的数据显示到标签上
        ui->textBrowser->insertPlainText("\n");   //将接收到的数据显示到标签上
    }
}


效果图

广播

广播只需要绑定端口即可。

服务器(发送者)

不需要绑定。发送时仅确定端口即可。

QByteArray dataGram= ui->lineEdit->text().toUtf8();
m_sender->writeDatagram(dataGram.data(),
                            dataGram.size(),
                            QHostAddress::Broadcast,
                            7755);


客户端(接收者)

需要绑定所有的Ip地址(AnyIPv4)以及对应的端口。然后关联readyRead信号。进行对应的实时读取。

下面这段代码是提前进行绑定和对应的信号槽关联。

下面这段代码是提前进行绑定和对应的信号槽关联

    port = 7755;
    m_receiver = new QUdpSocket(this);
    bool aa = m_receiver->bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
    if(false == aa)
    {
        qDebug() << "绑定失败!";
    }
    //当接收端接收到数据时,就会发送readRead信号
    connect(m_receiver, &QUdpSocket::readyRead, this, &ReceiverWidget::processData);


下面这段代码是槽函数的一个实时读取并显示在标签上。

void ReceiverWidget::processData()
{
    QString strData;
    //有未处理的数据报
    while(m_receiver->hasPendingDatagrams())
    {
        QByteArray dataGram;
        //读取的数据报大小
        dataGram.resize(m_receiver->pendingDatagramSize());
        m_receiver->readDatagram(dataGram.data(),dataGram.size());
        ui->textBrowser->insertPlainText(dataGram);   //将接收到的数据显示到标签上
        ui->textBrowser->insertPlainText("\n");   //将接收到的数据显示到标签上
    }
}


效果图

目录
相关文章
|
4月前
|
监控 编译器 Windows
Qt5实现Windows平台串口通信
Qt5实现Windows平台串口通信
|
网络协议 算法 安全
Go语言的网络编程与TCP_UDP
Go语言由Google开发,旨在简单、高效和可扩展。本文深入探讨Go语言的网络编程,涵盖TCP/UDP的基本概念、核心算法(如滑动窗口、流量控制等)、最佳实践及应用场景。通过代码示例展示了TCP和UDP的实现,并讨论了其在HTTP、DNS等协议中的应用。最后,总结了Go语言网络编程的未来发展趋势与挑战,推荐了相关工具和资源。
385 5
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
442 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
12月前
|
缓存 网络协议 安全
即时通讯初学者必知必会的20个网络编程和通信安全知识点
即时通讯IM应用开发的初学者很容易迷失在网络编程的复杂性以及通信安全的各种概念里,本文不涉及深度理论知识,尽量通过一句话或几句话让你快速了解20个相关的网络编程和通信安全知识点,希望能助你愉快地开始即时通讯应用开发。
496 0
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
587 3
|
Web App开发 缓存 网络协议
不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
熟悉网络编程的(尤其搞实时音视频聊天技术的)同学们都有个约定俗成的主观论调,一提起UDP和TCP,马上想到的是UDP没有TCP可靠,但UDP肯定比TCP高效。说到UDP比TCP高效,理由是什么呢?事实真是这样吗?跟着本文咱们一探究竟!
655 10
|
存储 网络协议 Java
【网络】UDP回显服务器和客户端的构造,以及连接流程
【网络】UDP回显服务器和客户端的构造,以及连接流程
316 3
|
存储 网络协议 Java
【网络】UDP和TCP之间的差别和回显服务器
【网络】UDP和TCP之间的差别和回显服务器
211 1
|
网络协议 Unix C语言
C语言 网络编程(十六)广播和组播
广播和组播是网络通信的重要方式。广播允许一台主机向子网内所有主机发送数据包,常用于局域网内的消息传播;组播则将数据包发送给特定的一组主机,适用于视频会议等应用场景。广播地址如 `192.168.1.255` 用于同一子网的所有主机。组播地址如 `224.0.0.0` 至 `239.255.255.255` 标识特定主机群。C语言示例展示了如何通过 UDP 实现广播和组播通信。此外,UNIX域套接字用于同一机器上进程间的高效通信。
1070 14
|
C语言 C++ Windows
QT多插件通信框架CTK编译记录
本文记录了编译QT多插件通信框架CTK的过程,包括编译结果截图、部署配置、Log4Qt编译配置、参考链接和拓展资料。文中提供了详细的编译步骤和配置文件示例,以及相关的资源链接。
705 0
QT多插件通信框架CTK编译记录

热门文章

最新文章

推荐镜像

更多
  • qt