日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

QT网络编程——UDP

發布時間:2023/12/9 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT网络编程——UDP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、TCP和UDP編程的區別
  • 二、QUdpSocket類所用到的接口函數
  • 三、QT中UDP編程思路
  • 四、UDP界面設計
  • 五、代碼實現發送和接收數據
  • 六、源代碼下載

一、TCP和UDP編程的區別

1、我們記得TCP網絡編程中,要分TCP服務器端和客戶端,但是UDP網絡編程中,不分客戶端和服務器端了,每個用戶既是客戶端又是服務器端。

2、TCP中需要用到兩個類:QTcpSever和QTcpSocket。而UDP中只需要使用一個類QUdpSocket。

需要用到本地端口,目標端口,目標IP地址。
其中本地端口:自己為該UDP主機設置的端口號,目的是對方發送數據時,會發到本機此端口上。
目標端口:對方的UDP主機設置的端口號,作用是可以在本機上向某個IP用戶的端口上發送數據。

二、QUdpSocket類所用到的接口函數

函數功能
bind(quint16 port)將socket和指定端口號進行綁定
close()關閉這個socket
readyRead()這個是信號,當其它用戶向本機的端口上發送數據時,就會產生這個信號。
writeDatagram(QByteArray &datagram, QHostAddress &host, quint16 port)數據報發送,形參分別為數據報,目的IP地址,目的端口號
hasPendingDatagram()socket中有接收到用戶發來的數據報時,返回值為true
pendingDatagramSize()返回待讀取數據報的大小
readDatagram(char *data, qint64 maxSize)讀取數據報,返回讀取數據報的字節數,maxSize為設置的讀取字節數,還可以加上源IP和源端口號

三、QT中UDP編程思路

1、開啟UDP通訊服務:建立QUdpSocket對象,并用其中的bind()方法就可以將套接字和端口號進行綁定。(一但有用戶向本主機的這個端口號發送數據,就會產生readyRead信號)

udpSocket->bind(ui->lineEdit_localPort->text().toUInt());

2、在readyRead信號所對應的槽函數中,接收對方發送過來的數據報。
用hasPendingDatagrams()函數,判斷是還否有下一個數據報待接收。如果有,就用readDatagram()函數讀取指定長度的數據報,并存放在數組中。

udpSocket->readDatagram(byteArray.data(),byteArray.size());```

3、通過writeDatagram()函數向遠端IP用戶的端口號中發送數據。

udpSocket->writeDatagram(sendbuff.toUtf8().data(),sendbuff.length(),ipAddress,port);

:經過測試發現,創建的socket套接字,不用bind函數綁定端口,也可以直接調用writeDatagram函數,而且能成功發送到目的主機的目的端口上去。但是這樣的話,貌似他會隨機為該套接字綁定一個端口,這是我們不希望的,所以調試時盡量避免。

四、UDP界面設計

五、代碼實現發送和接收數據

1、在pro文件中添加network模塊,并且在widget.h中導入QUdpSocket頭文件。

QT += core gui network


2、在widget構造函數中創建一個QUDPSocket對象

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

3、對打開按鈕的點擊信號綁定槽函數,并實現bind功能
綁定指定端口后,如果對方發來數據,會收到readyRead信號

void Widget::on_pushButton_openOrStop_clicked() {if(ui->pushButton_openOrStop->text() == "打開"){//udpSocket->bind(QHostAddress::Any,ui->lineEdit_localPort->text().toUInt());//將socket和自己設置的端口號進行綁定,只要有用戶(不指定,默認為任意IP地址的用戶)向這臺主機的指定端口號中發送數據,就會產生readyRead信號。if(udpSocket->bind(ui->lineEdit_localPort->text().toUInt())) //綁定成功返回true{QMessageBox::information(this,"提示","打開成功");connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot()));ui->pushButton_openOrStop->setText("關閉");ui->label_openOrStop->setStyleSheet("border-image: url(:/picture/open.png);");}elseQMessageBox::information(this,"提示","打開失敗,請重新嘗試");}else{//udpSocket->abort();udpSocket->close();ui->pushButton_openOrStop->setText("打開");ui->label_openOrStop->setStyleSheet("border-image: url(:/picture/stop.png);");} }

注:一個打開按鈕,我設置了兩個功能,即點擊一次打開,再次點擊為關閉。

4、為readyRead信號綁定的槽函數實現功能,主要是接收發送過來的數據報

void Widget::readyRead_slot() {QByteArray byteArray;while(udpSocket->hasPendingDatagrams()) //存在未讀取的數據報{byteArray.resize(udpSocket->pendingDatagramSize()); //將數組的長度設置為待讀數據報的大小udpSocket->readDatagram(byteArray.data(),byteArray.size()); //讀取指定大小的數據,并保存在數組中ui->plainTextEdit_receive->appendPlainText(QString(byteArray.data())); //顯示在界面的編輯框中}}

5、實現發送數據的功能

void Widget::on_pushButton_send_clicked() {QHostAddress ipAddress; //用來存儲目標主機IP地址quint16 port; //存儲目標主機端口號QString sendbuff; //存儲要發送的字符串ipAddress.setAddress(ui->lineEdit_aimIp->text()); //將編輯框中的ip地址轉換為網絡上可以識別的IPv4地址sendbuff = ui->lineEdit_send->text();port = ui->lineEdit_aimPort->text().toUInt();//將指定長度的數據封裝稱數據報,然后發到IP用戶的端口上udpSocket->writeDatagram(sendbuff.toUtf8().data(),sendbuff.length(),ipAddress,port); //向目的IP的目的端口發送指定長度的數據 }

完結!!!!

六、源代碼下載

此代碼的源碼

總結

以上是生活随笔為你收集整理的QT网络编程——UDP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。