QT 中网络编程UDP 的通信流程

QT 中网络编程UDP 的通信流程_第1张图片

 函数接口:

构造函数 
QUdpSocket(QObject *parent = nullptr)

    
 发送数据的接口:     
qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
    data:需要发送的数据 
    size:数据的大小 
    address:接收端的IP 
    port : 接收端的端口 
qint64 
writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)
      datagram:发送的内容,eg:ui->lineedit0>text();
      host: ip
      port: 端口号

接收端:

1.绑定UDP socket 
bool QAbstractSocket::bind(const QHostAddress &address, quint16 port = 0) 
    address:需要绑定的地址 
       port:需要绑定的端口 
           


2.读取数据 
qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr)
data:读取后数据的存放地址 
maxSize:读取的数据最大值 
  address:发送者的IP 
   port:发生者的端口   
  
QNetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1)

QNetworkDatagram 网络数据管理类 
       
       

QHostAddress senderAddress() const  //获取发送者的IP  
int senderPort() const   //获取发生者端口 

int destinationPort() const   //获取对方的端口

 官方的接收端代码 demo :

Example:
 void Server::initSocket()
 {
     udpSocket = new QUdpSocket(this);
     udpSocket->bind(QHostAddress::LocalHost, 7755);

     connect(udpSocket, &QUdpSocket::readyRead,
             this, &Server::readPendingDatagrams);
 }

 void Server::readPendingDatagrams()
 {
     while (udpSocket->hasPendingDatagrams()) {
         QNetworkDatagram datagram = udpSocket->receiveDatagram();
         processTheDatagram(datagram);
     }
 }

udp发送端示例代码:

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

#include 


QUdpSocket *udp;

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

    udp =  new QUdpSocket(this);

}

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


void MainWindow::on_pushButton_clicked()
{
    //发送UDP 数据报
    udp->writeDatagram(ui->lineEdit->text().toUtf8(),QHostAddress("192.168.25.2"),6666);

}

udp接收端示例代码:

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

#include 
#include 
#include 
#include 

QUdpSocket  *socket;

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

    //1.创建UDP 通信对象
    socket =  new QUdpSocket(this);

    //2.绑定UDP  socket
    if(socket->bind(QHostAddress::Any,6666))
    {
        qDebug() << "绑定成功";


    }else
    {
        qDebug() <<  "绑定失败";
    }


    //3.关联可读信号
    connect(socket, &QUdpSocket::readyRead,this,&MainWindow::readPendingDatagrams);

}

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

void MainWindow::readPendingDatagrams()
{
      qDebug()  << "有数据可读";
/*
      char  buf[1024]={0};
      QHostAddress  ip;
      unsigned  short  port=0;

   socket->readDatagram(buf,1024,&ip,&port);
    qDebug() << buf;
    */

        //判断是否有网络数据
      while (socket->hasPendingDatagrams()) {

              //把所有数据读到  datagram
              QNetworkDatagram datagram = socket->receiveDatagram();


              //输出数据
              qDebug() <<  datagram.senderAddress().toString();
              qDebug() <<  datagram.senderPort();
              qDebug() <<  datagram.data();


          }

}

 

你可能感兴趣的:(Qt,qt)