Qt下的UDP通信

  • UDP(User Datagram Protocol,用户数据报协议)是轻量的、不可靠的、面向数据报、无连接的协议,它可以用于对可靠性要求不高的场合
  • 两个程序之间进行UDP通信无需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口。

UDP消息传送的三种模式:

单播模式(unicast):一个UDP客户端发送数据报到指定地址和端口的另一UDP客户端,是一对一的数据传输。

广播模式(broadcast):一个UDP客户端发出的数据报,在同一网络范围内其他所有的UDP客户端都可以收到。QUdpSocket支持IPv4广播。需要在数据报中指定接收端地址为QHostAddress::Broadcast,一般的广播地址是255.255.255.255。

组播模式(multicast):UDP客户端加入到另一个组播IP地址的多播组,成员向组播地址发送的数据报,其加入组播的所有成员都可以接收到,类似于QQ群功能。QUdpSocket::joinMulticastGroup()函数实现加入多播组的功能。

在单播、广播和多播模式下,UDP程序都是对等的,不像TCP通信分为客户端和服务端。
TCP通信只有单播模式。UDP通信虽然不能保证数据传输的准确性,但是具有灵活性,一般的即时通信软件都是基于UDP通信的。

QUdpSocket是从QIODevice间接继承的类,所以具有流读写的功能

QUdpSocket类的接口函数

--bool bind(quint16 port = 0) 为UDP通信绑定一个端口

--qint64 writeDatagram(QByteArray& datagram, QHostAddress& host, quint16 port) 向目标地址和端口的UDP客户端发送数据报,返回成功发送的字节数,数据报的长度一般不超过512字节。

--bool hasPendingDatagrams() 当至少有一个数据报需要读取时,返回true

--qint64 pendingDatagramSize() 返回第一个待读取的数据报的大小

--qint64 readDatagram(char* data, qint64 maxSize) 读取一个数据报,返回成功读取的字节数

--qint64 readDatagram(char* data, qint64 maxSize, QHostAddress* address, quint16* port) 读取一个数据报,返回成功读取的字节数。发送方的主机地址和端口存储在*address和*port中(除非指针为0)

--bool joinMulticastGroup(QHostAddress& groupAddress) 加入一个多播组

--bool leaveMulticastGroup(QHostAddress& groupAddress) 离开一个多播组

--void abort() 终止当前连接并重置套接字。通常在析构函数中写入。与disconnectFromHost()不同,该函数立即关闭套接字,丢弃写入缓冲区中的任何挂起数据。

 QUdpSocket类的信号

--void stateChanged(QAbstractSocket::SocketState socketState)当socket的状态变化时发射此信号,参数socketState表示了socket当前的状态

--void readyRead()当缓冲区有新数据需要读取时发射此信号,在此信号的槽函数里,读取缓冲区的数据。

UDP在Qt中的实现

在.pro文件中加入QT       += core gui network

常用接口

绑定端口:udpSocket->bind(port)

发送数据报:udpSocket->writeDatagram(str,targetAddr,targetPort);

判断是否有数据发送:udpSocket->hasPendingDatagrams()

返回第一个待读取数据报的大小用于resize:udpSocket->pendingDatagramSize()

读取一个数据报(一个一个读):

udpSocket->readDatagram(datagram.data(),datagram.size(),&peerAddress,&peerPort)

解除绑定:udpSocket->abort();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值