Qt UDP单播、组播、广播简单了解

本文详细介绍了UDP(用户数据包协议),它是Internet协议集中的无连接传输协议,提供了简单不可靠的信息传递服务。文章通过Qt库展示了如何进行UDP的单播、组播和广播收发消息,并给出了获取本机IP地址的示例代码。
摘要由CSDN通过智能技术生成

前言

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据包协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事

UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

如需了解UDP与TCP对比,可点击了解UDP和TCP对比
下面简单介绍下UDP的几种用法。

首先需要在.pro文件中加入

QT       +=network

然后需要的头文件

#include <QUdpSocket>
#include <QNetworkDatagram>

单播接收息

    m_qudpSocket = new QUdpSocket(this);
    m_qudpSocket->bind(QHostAddress::AnyIPv4,8888);//绑定端口号
    connect(m_qudpSocket,SIGNAL(readyRead()),this,SLOT(dealReadyRead()));//接收信号槽函数

槽函数接收信号
接收时有两种处理方法

void Widget::readPendingDatagrams()
{
/*法一*/
    QUdpSocket *udpSocket = dynamic_cast<QUdpSocket *>(sender());
    
    while (udpSocket->hasPendingDatagrams()) {
        QNetworkDatagram datagram = udpSocket->receiveDatagram();
        qDebug()<<QString(datagram.data())<<","<<datagram.senderAddress()<<datagram.senderPort();
        
		/*datagram.data() :  是读取的消息内容
		*datagram.senderAddress() : 是发送端的ip地址
		*datagram.senderPort() : 是发送端端口号
		*/
    }
    
/*法二*/

//   QUdpSocket *udpSocket = dynamic_cast<QUdpSocket *>(sender());
//    while(udpSocket->hasPendingDatagrams()){
//        QHostAddress address;
//        quint16 port = 0;
//        QByteArray datagram;
//        datagram.resize(udpSocket->pendingDatagramSize());
//        udpSocket->readDatagram(datagram.data(),datagram.size(),&address,&port);
//        qDebug()<<QString(datagram.data())<<address.toString()<<port;
//    }

单播发送消息

    QUdpSocket udpSocket;
    QByteArray array = QString("mssage").toLatin1();
    //向ip地址为 m_ip 的 发送消息 mssage 
    udpSocket.writeDatagram(array,array.size(),QHostAddress(m_ip),8888);

组播接收消息

    m_qudpSocket = new QUdpSocket(this);
    m_qudpSocket->bind(QHostAddress::AnyIPv4,8888,QUdpSocket::ShareAddress);//绑定所有ip来接收组播组信息
    m_qudpSocket->joinMulticastGroup(QHostAddress("224.0.0.10")); //加入组播ip:224.0.0.10
    connect(m_qudpSocket,SIGNAL(readyRead()),this,SLOT(dealReadyRead()));//接收信号槽函数

接收信息槽函数同单播

组播发消息,也和单播差不多,只是ip地址换成组播地址,加入改组播的都可以收到

    QUdpSocket udpSocket;
    QByteArray array = QString("mssage").toLatin1();
    //向组播地址为 m_groupIp 的 发送消息 mssage 
    udpSocket.writeDatagram(array,array.size(),QHostAddress(m_groupIp),8888);

广播发消息

关键在于 QHostAddress::Broadcast

    QUdpSocket udpSocket;
    QByteArray array = QString("#ok").toLatin1();
    udpSocket.writeDatagram(array,array.size(),QHostAddress::Broadcast,8888);

获取本机ip地址


//注:需加头文件 #include <QNetworkInterface>
	QString myIp;
    QList<QHostAddress> AddressList = QNetworkInterface::allAddresses();
    foreach(QHostAddress address, AddressList){
        if(address.protocol() == QAbstractSocket::IPv4Protocol &&
                address != QHostAddress::Null &&
                address != QHostAddress::LocalHost){
            if (address.toString().contains("127.0.")){
                continue;
            }
            myIp = address.toString();
            break;
        }
    }

    qDebug()<<"myIp:"<<myIp;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值