首先要说明的是UDP是一种不可靠协议,理解这一点的话一切都好理解了
没有明显的服务器和客户端的区别
一.发送
发送时只需要调用
writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)
即可,
第一个参数是数据,
第二个参数是地址,
第三个参数是端口
这个非常好理解,不可靠嘛,给我个地址我只管发,管你妹的成功与否,至此,发送完毕
二.接收
接收的话,有点像服务器了,需要"监听"一个地址和端口
当然这里的地址一般是任意值,或者指定的地址(貌似没啥意义)
bool bind(const QHostAddress &address, quint16 port = 0, BindMode mode = DefaultForPlatform);
bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform);
所以第一个函数在Qt的注释中说下个版本(Qt6中)被定义为虚函数,因为第一个参数根本就是废柴嘛,使用第二函数的话绑定端口即可(没看源码,可以肯定的是必定监听的是地址QHostAddress::Any)
接收数据的只需要连接好槽函数即可
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(recvData()));
即可,这里特别说明的一点是如果想获取谁给你发的数据,需要在readDatagram中制定最后两个参数(你想啊,本来你就是接收任意地址发来的数据,如果在没有手段知道谁给你发的那不是难受死了,而且可能要回复哦)
ps:
如果要双向通信比如聊天程序设计时,需要聊天双方都绑定即可
void recvData()
{
while (udpSocket>hasPendingDatagrams()) {
QByteArray data;
data.resize(udpSocket->bytesAvailable());
QHostAddress host;
quint16 port;
udpClient->readDatagram(data.data(), 1024, &host, &port);
}
}
}