1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Qt 实例18 UDP单播/广播

Qt 实例18 UDP单播/广播

时间:2021-11-21 08:38:05

相关推荐

Qt 实例18 UDP单播/广播

本机运行两个实例需要绑定不同的端口,例如实例A绑定端口2000,实例B绑定端口3000,实例A向实例B发送数据时,需要指定实例B所在主机的IP地址、绑定端口作为目标地址和目标端口,这样实例B才能接收到数据报。如果在不同的计算机运行,则可以使用相同的端口。

要实现数据接收,必须先使用QUdpSocket::bind()绑定一个端口,用于监听传入的数据报。解除绑定则使用abort()函数。

writeDatagram()函数向一个目标用户发送消息时,需要指定目标地址和端口。

在广播消息时,只需要将目标地址更换为一个特殊地址,即广播地址QHostAddress::Broadcast,一般为255.255.255.255

发送的数据报是QByteArray类型的字节数组,数据报的长度一般不超过512字节,可以是文本,也可以是二进制数据。

接收到数据报后会发射readyRead()信号。

#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QUdpSocket>namespace Ui {class Widget;}class Widget : public QWidget{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private slots:void on_btnBind_clicked();void on_btnUnBind_clicked();void on_btnClear_clicked();void on_btnQuit_clicked();void on_btnSend_clicked();void on_btnBroadcast_clicked();void on_readyRead();private:Ui::Widget *ui;private:QUdpSocket *m_udpSocket = nullptr;};#endif // WIDGET_H

#include "widget.h"#include "ui_widget.h"#include <QHostInfo>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);//本地主机名QString hostName = QHostInfo::localHostName();//本机IP地址QHostInfo hostInfo = QHostInfo::fromName(hostName);//IP地址列表QList<QHostAddress> addrList = hostInfo.addresses();for(int i=0;i<addrList.count();i++){QHostAddress host = addrList.at(i);if(QAbstractSocket::IPv4Protocol == host.protocol()){QString ip = host.toString();ui->comboBox->addItem(ip);}}m_udpSocket = new QUdpSocket(this);connect(m_udpSocket,&QUdpSocket::readyRead,this,&Widget::on_readyRead);}Widget::~Widget(){delete ui;}void Widget::on_btnBind_clicked(){//本机UDP端口qint16 port = ui->spinBindPort->value();if(m_udpSocket->bind(port)){ui->plainTextEdit->appendPlainText("**已成功绑定");ui->plainTextEdit->appendPlainText("**绑定端口: "+QString::number(m_udpSocket->localPort()));ui->btnBind->setEnabled(false);ui->btnUnBind->setEnabled(true);}else{ui->plainTextEdit->appendPlainText("**绑定失败");}}void Widget::on_btnUnBind_clicked(){//解除绑定m_udpSocket->abort();ui->btnBind->setEnabled(true);ui->btnUnBind->setEnabled(false);ui->plainTextEdit->appendPlainText("**已解除绑定");}void Widget::on_btnClear_clicked(){ui->plainTextEdit->clear();}void Widget::on_btnQuit_clicked(){}void Widget::on_btnSend_clicked()//单播{//目标IPQString dstIp = ui->comboBox->currentText();QHostAddress dstAddr(dstIp);//目标端口quint16 dstPort = ui->spinDstPort->value();QString msg = ui->lineEdit->text();QByteArray str = msg.toUtf8();//发出数据报m_udpSocket->writeDatagram(str,dstAddr,dstPort);ui->plainTextEdit->appendPlainText("[out] "+msg);}void Widget::on_btnBroadcast_clicked()//广播{quint16 dstPort = ui->spinDstPort->value();QString msg = ui->lineEdit->text();QByteArray str = msg.toUtf8();//发出数据报m_udpSocket->writeDatagram(str,QHostAddress::Broadcast,dstPort);ui->plainTextEdit->appendPlainText("[Broadcast] "+msg);}void Widget::on_readyRead(){//是否还有待读取的传入数据报while(m_udpSocket->hasPendingDatagrams()){QByteArray data;//返回待读取的数据报的字节数data.resize(m_udpSocket->pendingDatagramSize());QHostAddress peerAddr;quint16 peerPort;//读取数据报的内容m_udpSocket->readDatagram(data.data(),data.size(),&peerAddr,&peerPort);QString str = data.data();QString peer = "[From ] +"+peerAddr.toString()+":"+QString::number(peerPort)+"] ";ui->plainTextEdit->appendPlainText(peer+str);}}

原文链接:/wzz95363/article/details/115101133

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。