- 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();