Qt 给用户提供了网络编程的接口,包括TCP、UDP、HTTP三种协议的API以及各种类,可以了解一下。
而在 QT 中想要使用网络编程,必须在pro文件中添加 network 模块,否则无法包含网络编程所需的头文件。
UDP
UDP是传输层的协议,该协议是无输出,不可靠,面向数据包,全双工的通信协议。
QT为 UDP 协议专门设置了两个类:QUdpSocket 以及 QNetworkDatagram 。
QUdpSocket类
该类是专门用于 Udp 的类,包含 Udp 协议所需的绑定、接收数据包、发送数据包等API。
bind(const QHostAddress&,quint16) | 函数 | 绑定端口号 | 类似linux中的bind |
receiveDatagram() | 函数 | 返回一个 QNetworkDatagram类型的数据包 | 类似linux中的recvfrom |
writeDatagram() | 函数 | 发送一个QNetworkDatagram类型的数据包 | 类型linux中的sendto |
readyRead | 信号 | 当一个端口号可以读取时即可触发该信号 | 类似linux中的多路转接:select、poll和epoll等 |
QNetworkDatagram
该类表明一个数据包,可以从该类所实例化的对象中读取所需的数据、发送端的端口号和 ip 地址
QNetworkDatagram(const QByteArray&,const QHostAddress&,quint16) | 方法 | QNetworkDatagram的构造函数,用于创建一个对象 |
data() | 方法 | 获取数据包中的数据,返回一个 QByteArray 对象 |
sederAddress() | 方法 | 获取数据包发送者的 IP 地址 |
sederPort() | 方法 | 获取数据包发送者的 端口号 |
和Linux不同的是,linux的接收和发送函数:recvfrom 和 sendto ,它们都需要一个 sockaddr 的结构体对象来获取发送端的 IP 地址和端口号,而QT则是将其拆开,数据包中直接包含对端的IP地址和端口号
UDP回显服务器
首先写服务器的代码,在 pro 文件添加 network 模块后,即可使用上述API。
在服务器一侧我们使用 listWidget 控件,用来显示所有接收的数据。
然后在头文件中添加 QUdpSocket 对象,用来后续接收客户端的消息。