1、在pro文件中添加
QT += network
2、在头文件中添加类的前置声明,再声明一个类对象
class QUdpSocket;
QUdpSocket *sender;
3、使用writeDatagram()函数来发送数据
sender->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45454);
writeDatagram()函数模型如下
qint64 QUdpSocket::writeDatagram(const char* data, qint64 size, const QHostAddress& address,quint16 port)
// 1、发送大小为size大小的数据报data到地址为address的port端口
// 2、QHostAddress::Broadcast 用于广播的地址
// 3、如果发送成功,返回发送成功的字节数;如果发送失败,则返回-1
4、接收数据
QUdpSocket* receiver;
receiver = new QUdpSocket(this);
receiver->bind(45454,QUdpSocket::ShareAddress);
connect(receiver,&QUdpSocket::readyRead,this,&Sender::sltOnReceiver);
// 使用bind()函数绑定了IP地址和端口号
// 这里使用的是bind()函数的一个重载形式,它不需要指定IP地址,默认支持所有IPv4的IP地址;
// 其中,指定的端口号就是前面发送端使用的端口号。
// 最后的一个参数是绑定模式,程序中使用QUdpSock::ShareAddress表明允许其他服务器绑定到相同的地址和端口上
// 每当有数据报到来时,QUdpSocket都会发射readyRead()信号,这样就可以在自定义的槽中读取数据了
void Sender::sltOnReceiver()
{
// 拥有等待的数据报
while (receiver->hasPendingDatagrams())
{
QByteArray datagram;
// 让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
datagram.resize(receiver->pendingDatagramSize());
// 接收数据报,将其存放到datagram中
receiver->readDatagram(datagram.data(),datagram.size());
qDebug()<< datagram;
}
}
// hasPendingDatagrams()函数用来判断是否还有等待读取的数据报
// pendingDatagramSize()函数可以用来获取当前数据报的大小
// readDatagram(datagram.data(),datagram.size())函数用来接收不大于指定大小的数据报,并将其存储到QByteArray变量中