QT udp单播和广播

该代码示例展示了如何使用Qt库中的QUdpSocket类进行UDP通信,包括绑定端口、发送和接收数据、处理socket状态变化等关键操作。通过点击按钮,用户可以实现本地UDP端口的绑定与解绑,发送单播和广播消息,并在文本编辑器中查看接收的响应。
摘要由CSDN通过智能技术生成

在这里插入图片描述
代码部分:
.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QUdpSocket>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void onSocketStateChange(QAbstractSocket::SocketState socketState);
    void onSocketReadyRead();//读取socket传入的数据

    void on_bindBtn_clicked();

    void on_stopBtn_clicked();

    void on_btnSend_clicked();

    void on_mulBtn_clicked();

    void on_clearBtn_clicked();

    void on_quitBtn_clicked();

private:
    Ui::MainWindow *ui;
    QLabel* LabSocketState;//socket状态显示标签
    QUdpSocket* udpSocket;
    QString getLocalIp();//获取本机IP地址

};

#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostInfo>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    LabSocketState = new QLabel("socket 状态");
    LabSocketState->setMinimumWidth(200);
    ui->statusBar->addWidget(LabSocketState);

//    QString localIP = getLocalIp();//获取本机IP
    QString localIP = "127.0.0.1";//获取本机IP
    this->setWindowTitle(this->windowTitle()+"----本机IP:"+localIP);
    ui->comboTargetIp->addItem(localIP);

    udpSocket = new QUdpSocket(this);
    connect(udpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    onSocketStateChange(udpSocket->state());
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_bindBtn_clicked()
{//绑定端口
    quint16 port = ui->spinBox->value();//本机UDP端口
    if(udpSocket->bind(port))
    {
        ui->plainTextEdit->appendPlainText("****已绑定成功");
        ui->plainTextEdit->appendPlainText("***绑定端口"+QString::number(udpSocket->localPort()));
        ui->bindBtn->setEnabled(false);
        ui->stopBtn->setEnabled(true);
    }
}

void MainWindow::on_stopBtn_clicked()
{//解除绑定
    udpSocket->abort();//解除绑定
    ui->bindBtn->setEnabled(true);
    ui->stopBtn->setEnabled(false);
    ui->plainTextEdit->appendPlainText("***已解除绑定");

}

void MainWindow::on_btnSend_clicked()
{//发送消息
    QString targetIP = ui->comboTargetIp->currentText();//目标IP
    QHostAddress targetAddr(targetIP);
    quint16 targetPort = ui->spinBox_3->value();//目标Port
    QString msg = ui->lineEdit->text();//发送的消息内容
    QByteArray str = msg.toUtf8();
    udpSocket->writeDatagram(str,targetAddr,targetPort);//发出数据包
    ui->plainTextEdit->appendPlainText("[out]"+msg);
    ui->lineEdit->clear();
    ui->lineEdit->setFocus();
}

void MainWindow::on_mulBtn_clicked()
{//广播消息按钮
    quint16 targetPort = ui->spinBox_3->value();//目标端口
    QString msg = ui->lineEdit->text();
    QByteArray str = msg.toUtf8();
    udpSocket->writeDatagram(str,QHostAddress::Broadcast,targetPort);
    ui->plainTextEdit->appendPlainText("[broadcast]"+msg);
    ui->lineEdit->clear();
    ui->lineEdit->clear();
}
void MainWindow::onSocketReadyRead()
{//读取socket传入的数据
    QByteArray datagram;
    datagram.resize(udpSocket->hasPendingDatagrams());
    QHostAddress peerAddr;
    quint16 peerPort;
    udpSocket->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort);
    QString str =datagram.data();
    QString peer = "[From "+peerAddr.toString()+":"+QString::number(peerPort)+"]";
    ui->plainTextEdit->appendPlainText(peer+str);
}
void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{//socket状态变化
    switch(socketState)
    {
    case QAbstractSocket::UnconnectedState:
    {
        LabSocketState->setText("socket状态:UnconnectedState");
        break;
    }
    case QAbstractSocket::HostLookupState:
    {
        LabSocketState->setText("socket状态:HostLookupState");
        break;
    }
    case QAbstractSocket::ConnectingState:
    {
        LabSocketState->setText("socket状态:ConnectingState");
        break;
    }
    case QAbstractSocket::ConnectedState:
    {
        LabSocketState->setText("socket状态:ConnectedState");
        break;
    }
    case QAbstractSocket::BoundState:
    {
        LabSocketState->setText("socket状态:BoundState");
        break;
    }
    case QAbstractSocket::ClosingState:
    {
        LabSocketState->setText("socket状态:ClosingState");
        break;
    }
    case QAbstractSocket::ListeningState:
    {
        LabSocketState->setText("socket状态:ListeningState");
        break;
    }
    }


}
QString MainWindow::getLocalIp()
{//获取本机IP
    QString hostName = QHostInfo::localHostName();//本地主机名
    QHostInfo hostInfo = QHostInfo::fromName(hostName);
    QString localIP = "";
    QList<QHostAddress> addList = hostInfo.addresses();

    if(!addList.isEmpty())
    {
        for(int i=0;i<addList.count();++i)
        {
            QHostAddress aHost = addList.at(i);
            if(QAbstractSocket::IPv4Protocol == aHost.protocol())
            {
                localIP = aHost.toString();
                break;
            }
        }
    }
    return localIP;
}

void MainWindow::on_clearBtn_clicked()
{
   ui->plainTextEdit->clear();
}

void MainWindow::on_quitBtn_clicked()
{
    this->close();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值