日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Qt實現簡單UDP通信_C 語言

作者:喝水怪~ ? 更新時間: 2022-10-15 編程語言

Qt簡單實現UDP通信的具體代碼,供大家參考,具體內容如下

標簽(空格分隔): udp通信、Qt

一、UDP簡介

1)UDP(User Datagram Protocol,用戶數據報協議)

UDP是一個輕量級、不可靠、面向數據報的、無連接的傳輸層協議,多用于可靠性要求不嚴格,不是非常重要的傳輸,如直播、視頻會議等等。

2)Qt中QUdpSocket類繼承自QAbstractSocket,用來發送和接收UDP數據報,”Socket”即套接字,套接字即IP地址+端口號。其中IP地址指定了網絡中的一臺主機,二端口號則指定了該主機上的一個應用程序,端口號只具有本地意義,使用套接字即可實現網絡上的兩個應用程序之間的通信。

3)QUdpSocket支持IPv4廣播,要廣播數據報,則只需發送到一個特殊的地址QHostAddress::Broadcast(即255.255.255.255),數據報一般建議發送字節數小于512字節。端口號選擇1024-65535(1024以下的常用作保留端口號,如FTP常用端口號21,Telnet常用端口號23,DNS域名服務器常用端口53等)。

二、具體Demo

發送端:

  • 新建Qt Widgets Application,用作udp發送端,繼承自Qwidget類即可,設計ui界面,用于發送信息,界面如下:

  • 打開pro文件,做如下修改,支持網絡編程,接收端也需做如下修改

  • 添加發送端udpSocket以及按鈕的點擊信號
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
? ? Q_OBJECT

public:
? ? Widget(QWidget *parent = nullptr);
? ? ~Widget();

private slots:
? ? void on_pushButton_clicked(); ? //按鈕點擊信號

private:
? ? Ui::Widget *ui;
? ? QUdpSocket* m_sender; ? //udp發送端
};
#endif // WIDGET_H
  • 點擊信號對應槽函數的實現:
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
? ? : QWidget(parent)
? ? , ui(new Ui::Widget)
{
? ? ui->setupUi(this);
? ? m_sender=new QUdpSocket(this);
}

Widget::~Widget()
{
? ? delete ui;
}

void Widget::on_pushButton_clicked()
{
? ? QByteArray dataGram=ui->lineEdit->text().toUtf8();
? ? m_sender->writeDatagram(dataGram.data(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? dataGram.size(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? QHostAddress::Broadcast, ? ?//udp廣播地址
? ? ? ? ? ? ? ? ? ? ? ? ? ? 6666);
}

接受端:

  • 再新建Qt Widgets Application項目,用作udp接收端,繼承自Qwidget類即可,設計ui界面,用標簽部件來顯示接收到的信息,界面如下:

  • 跟發送端一樣,在pro文件中添加支持網絡編程的模塊 network
  • 添加接收端udpSocket,如下:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
? ? Q_OBJECT

public:
? ? Widget(QWidget *parent = nullptr);
? ? ~Widget();
private slots:
? ? void processData();
private:
? ? Ui::Widget *ui;
? ? QUdpSocket* m_receiver; //udp接受端
};
#endif // WIDGET_H
  • 編輯接收端源文件:
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
? ? : QWidget(parent)
? ? , ui(new Ui::Widget)
{
? ? ui->setupUi(this);
? ? m_receiver=new QUdpSocket(this);
? ? //綁定發送端,ShareAddress允許多接收端綁定6666端口
? ? m_receiver->bind(6666,QUdpSocket::ShareAddress);
? ? //當接收端接收到數據時,就會發送readRead信號
? ? connect(m_receiver,&QUdpSocket::readyRead,this,&Widget::processData);
}

Widget::~Widget()
{
? ? delete ui;
}

void Widget::processData()
{
? ? QString strData;
? ? //有未處理的數據報
? ? while(m_receiver->hasPendingDatagrams()){
? ? ? ? QByteArray dataGram;
? ? ? ? //讀取的數據報大小
? ? ? ? dataGram.resize(m_receiver->pendingDatagramSize());
? ? ? ? m_receiver->readDatagram(dataGram.data(),dataGram.size());
? ? ? ? ui->dataLabel->setText(dataGram); ? //將接收到的數據顯示到標簽上
? ? }

}

三、運行效果

  • 運行發送端應用程序,再打開接收端應用程序;
  • 在發送端編輯框輸入數據,點擊廣播,觀察接收端的情況,結果如下:

原文鏈接:https://blog.csdn.net/qq_43686329/article/details/120352026

欄目分類
最近更新