QT-UDP网络编程
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连接通信
本文作者:NekoBlog
本文链接:https://www.cnblogs.com/NekoBlog/p/17751797.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步