QT-UDP网络编程

发布时间 2023-10-09 15:14:14作者: Neko_Code

QT_UDP网络编程

用户数据报协议(UDP,User Datagram Protocol );

轻量的,不可靠,无连接,面向数据报的传输协议


与TCP,特征:

UDP通信在本质上不需要区分客户端和服务端,拥有socket的一方本身具有发送和接收数据报的能力.

QUdpSocket继承于父类的QAbstractSocket,没有QTcpSocket的流功能函数

在通信方式上不同于TCP的连接,UDP通信分为单播,广播,组播.

单播与建立连接的TCP的一对端类似,是一对一的通信,需要知晓双方的网络ip和port才能交换数据.

广播在同一互联网域(一般为局域网)内,当绑定的ip内有广播数据报,所有端都可以接收数据报内容.

组播类似群聊,在互联网域内进行分组,只有同一个分组的端能够发送和接收数据报内容.


连接方式/步骤:

//进入UDP通信环节的整体步骤
{
	QUdpsocket *udpsocket = new QUdpsocket(this);	//创建已窗体类本身为父类的socket

	connect(udpsocket,&QUdpsocket::stateChanged,this,&MainWindow::do_stateChanged);	//绑定该socket与窗体类状态改变信号的槽函数
	connect(udpsocket,SIGNAL(readyRead()),this,SLOT(do_socketReadyRead()));	//readyRead信号在socket确认有数据传入时发送,绑定do_socketReadyRead函数处理
}

{
    //绑定该客户端窗口监听的本地端口号
    udpsocket->bind(port);
    
    //本地客户端解绑方式
    udpsocket->absort();
    
}

{
    //单播方式的消息发送流程
    QHostAddress targetAddress(targetIP);	//目标通信对象的IP地址(QString)转换为QHostAddress格式
    
    QByteArray msg_to_send = msg.toUtf8();	//需要交换的数据报信息,此处为字符信息,转换为utf8的bytearray
    
    udpsocket.writeDatagram(msg_to_send,targetAddress,targetPort);	//socket单播方式发送数据报
}

{
    //广播方式的消息发送流程
    QByteArray msg_to_send = msg.toUtf8();
    
    udpsocket.writeDatagram(msg_to_send,QHostAddress::Broadcast,targetPort);	//socket广播方式发送数据报,无需指定targetAddress
}

do_ReadyRead
{
    //单播与广播的消息接收流程
    while(udpsocket->hasPendingDatagram())
    {
		QByteArray datagram;	//创建数据接收载体
        datagram.resize(udpsocket->pendingDatagramSize());	//根据数据大小调整载体大小
        QHostAddress peerAddr;	//对方地址
        quint16 peerPort;	//对方端口
        udpsocket->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort);	//指定必需的数据内容存放处及其大小供写入,接收可选参数对方地址和端口.
        QString data = datagram.data();	//获取存放的信息数据
    }
}

//省略 do_stateChanged() 函数编写部分

//组播方式变更的地方
{
	udpsocket = new QUdpsocket(this);
    //↓
    udpsocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);//设置udp通信方式为组播且ttl(生存周期)为一个路由器跳转内,实现局域网组播通信
    
    //加入组播的方式
    if(udpsocket->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::ShareAddress))//绑定局域网内任何IPv4协议的网络地址,port为组播的统一端口,ShareAddress允许其他服务使用这个地址和端口,是该模式下mode的必填项
    {
		udpsocket->joinMulticastGroup(groupAddress);	//加入组播组
        
        udpsocket->leaveMulticastGroup(groupAddress);	//离开组播组
    }
    
    //发送信息的参数填写
    udpsocket->writeDatagram(datagram,groupAddress,groupPort);
    //读取信息代码与单播和广播一致
}

与TCP相同的信号绑定部分,总体来说先学习UDP通信会更便于理解TCP连接通信