Qt UDP单播通信

不喜欢花里胡哨,有源码直接上源码通俗易懂!

拿走直接用,方便别人方便自己

先看一下单播效果

SSCOM 点击test发送数据

在这里插入图片描述

应用程序点击 功能模块 发送数据

在这里插入图片描述

功能代码如下:
在.pro文件中添加 network 模块
QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
    UDPUniCast.cpp \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    UDPUniCast.h \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

UDPUniCast.h
#ifndef UDPUNICAST_H
#define UDPUNICAST_H
#include <QHostAddress>
#include <QUdpSocket>

class UDPUniCast
{
public:
    QUdpSocket *udpSendSocket;
    QUdpSocket *udpRecvSocket;

    QStringList getLocalHostIP();                                       //获取本地IP
    bool udpBind(QHostAddress addr,quint16 port);                       //绑定ip和端口号
    void udpDisBind();                                                  //解除绑定
    void sendMsg(QString msg,QHostAddress address,quint16 recvPort);    //发送命令数据
    QString recvMsg(QHostAddress address,quint16 recvPort);             //返回数据值
};

#endif // UDPUNICAST_H

UDPUniCast.cpp
#include "UDPUniCast.h"
#include<QHostInfo>

/* 获取本地IP */
QStringList UDPUniCast::getLocalHostIP()
{
    // 获取电脑本地IP
    QString localHostName = QHostInfo::localHostName();
    QHostInfo info = QHostInfo::fromName(localHostName);
    QStringList IPList;
    //多IP
    foreach (QHostAddress addr,info.addresses())
    {
        if(addr.protocol() == QAbstractSocket::IPv4Protocol)
        {
            qDebug() << addr.toString();
            IPList.append(addr.toString());
        }
    }
    return IPList;
}

/* 端口绑定 */
bool UDPUniCast::udpBind(QHostAddress addr,quint16 port)
{
    bool flag = udpRecvSocket->bind(addr,port);
    return flag;
}

/* 解除端口绑定 */
void UDPUniCast::udpDisBind()
{
    udpRecvSocket->abort();
    udpRecvSocket->close();
}

/* 发送信息 */
void UDPUniCast::sendMsg(QString msg,QHostAddress address,quint16 recvPort)
{
    QByteArray datagram = QByteArray::fromHex(msg.toLatin1());
    udpSendSocket->writeDatagram(datagram.data(),datagram.size(),address,recvPort);
}

/* 接收信息 */
QString UDPUniCast::recvMsg(QHostAddress address,quint16 recvPort)
{
    QByteArray array;
    //根据可读数据来设置空间大小
    array.resize(udpRecvSocket->bytesAvailable());
    //读取数据包, 注:udp一次最多发送65507个字节的数据
    udpRecvSocket->readDatagram(array.data(), array.size(), &address, &recvPort);
    QString recvStr = (QString)array.toHex().data();
    return recvStr;
}

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "UDPUniCast.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    UDPUniCast UDPUniCast;

private slots:
    void on_connectBtn_clicked();

    void on_sendBtn_clicked();

    void udpSocketRecvive();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    UDPUniCast.udpSendSocket =new QUdpSocket(this);
    UDPUniCast.udpRecvSocket =new QUdpSocket(this);

    //获取本机IP
    QStringList localHostIP = UDPUniCast.getLocalHostIP();
    ui->localHostIP->addItems(localHostIP);

}

MainWindow::~MainWindow()
{
    UDPUniCast.udpDisBind();
    delete ui;
}

/* 连接 */
void MainWindow::on_connectBtn_clicked()
{
    QHostAddress address = QHostAddress(ui->localHostIP->currentText());
    int port = ui->localHostPort->text().toInt();
    if(ui->connectBtn->text() =="连接")
    {
        bool conFlag =UDPUniCast.udpBind(address,port);
        if(conFlag ==true)
        {
            connect(UDPUniCast.udpRecvSocket, SIGNAL(readyRead()), this, SLOT(udpSocketRecvive()));
            ui->connectBtn->setText("断开");
            qDebug() << address;
        }
    }else{
        UDPUniCast.udpDisBind();
        ui->connectBtn->setText("连接");
    }
}

/* 发送 */
void MainWindow::on_sendBtn_clicked()
{
    QHostAddress address(ui->udpRecvIP->text());
    quint16 recvPort = ui->udpRecvPort->text().toInt();
    QString msg= "EB 90 01 0A 01 00 00";
    UDPUniCast.sendMsg(msg,address,recvPort);
    ui->sendValue->append(msg);
}

/* 返回值 */
void MainWindow::udpSocketRecvive()
{
    QHostAddress address(ui->localHostIP->currentText());
    int localPort = ui->localHostPort->text().toInt();
    QString recvStr = UDPUniCast.recvMsg(address,localPort);
    qDebug() << recvStr;
    ui->recvValue->append(recvStr);
}

main.cpp
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>747</width>
    <height>358</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>200</x>
      <y>30</y>
      <width>61</width>
      <height>20</height>
     </rect>
    </property>
    <property name="text">
     <string>远程</string>
    </property>
    <property name="alignment">
     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>200</x>
      <y>60</y>
      <width>61</width>
      <height>20</height>
     </rect>
    </property>
    <property name="text">
     <string>本地</string>
    </property>
    <property name="alignment">
     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
    </property>
   </widget>
   <widget class="QPushButton" name="connectBtn">
    <property name="geometry">
     <rect>
      <x>480</x>
      <y>30</y>
      <width>75</width>
      <height>51</height>
     </rect>
    </property>
    <property name="text">
     <string>连接</string>
    </property>
   </widget>
   <widget class="QComboBox" name="localHostIP">
    <property name="geometry">
     <rect>
      <x>270</x>
      <y>60</y>
      <width>141</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
   <widget class="QLineEdit" name="udpRecvIP">
    <property name="geometry">
     <rect>
      <x>270</x>
      <y>30</y>
      <width>141</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
   <widget class="QLineEdit" name="udpRecvPort">
    <property name="geometry">
     <rect>
      <x>420</x>
      <y>30</y>
      <width>50</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
   <widget class="QLineEdit" name="localHostPort">
    <property name="geometry">
     <rect>
      <x>420</x>
      <y>60</y>
      <width>50</width>
      <height>22</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="sendBtn">
    <property name="geometry">
     <rect>
      <x>290</x>
      <y>100</y>
      <width>150</width>
      <height>22</height>
     </rect>
    </property>
    <property name="text">
     <string>功能模块</string>
    </property>
   </widget>
   <widget class="QGroupBox" name="groupBox">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>130</y>
      <width>360</width>
      <height>221</height>
     </rect>
    </property>
    <property name="title">
     <string>发送区域</string>
    </property>
    <widget class="QTextEdit" name="sendValue">
     <property name="geometry">
      <rect>
       <x>8</x>
       <y>20</y>
       <width>345</width>
       <height>191</height>
      </rect>
     </property>
    </widget>
   </widget>
   <widget class="QGroupBox" name="groupBox_2">
    <property name="geometry">
     <rect>
      <x>380</x>
      <y>130</y>
      <width>360</width>
      <height>221</height>
     </rect>
    </property>
    <property name="title">
     <string>接收区域</string>
    </property>
    <widget class="QTextEdit" name="recvValue">
     <property name="geometry">
      <rect>
       <x>8</x>
       <y>20</y>
       <width>345</width>
       <height>191</height>
      </rect>
     </property>
    </widget>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

给正在出差加班中的自己赏一个鸡腿!!!
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淘气の小狼人¹º²⁴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值