Qt+UDP及封装

1、单播服务器

一、声明udp对象socket

QUdpSocket* udpClient;tcp

二、new出对象函数

udpClient = new QUdpSocket(this);ui

三、分配本地地址(若是不分配,使用系统自动分配的),设置接收槽函数this

udpClient.bind("192.168.1.1”,8080);spa

QObject::connect(this->udpClient,SIGNAL(readyRead()),this,SLOT(rcvData()));code

四、接收函数对象

void Udp::rcvData()blog

{

  if(this->udpClient->pendingDatagramSize() == 0)

    return;

  QByteArray ba;

  ba.resize(udpClient->pendingDatagramSize());

  QHostAddress tempHost("");

  quint16 port = 0;

  this->udpClient->readDatagram(ba.data(),udpClient->pendingDatagramSize(),&tempHost,&port);

}

五、发送

void Udp::on_pushButton_3_clicked()

{

 

  if(j == this->udpClient->writeDatagram(tempChar,j,ipAddress,port))

  {

    qDebuf()<<"发送成功"

  }

}

六、关闭

udpClient.close();

 

ps:一、udp套接字bind成功以后,状态是BoundState,close以后是UnconnectedState;

   二、bind是将一个ip和地址绑定,并使socket与这两个绑定在一块儿,一般是udp使用此函数;connectToHost是套接字链接至主机ip和端口,一般是tcp客户端链接至服务器使用此函数;

   三、每当udp的readyRead信号发出来后,必定要使用接收函数把数据接收了,不然下次来数据的时候不会发出此信号。

2、组播

组播:假设一个局域网内有多个计算机,每一个计算机有一个IP,定义一个组播IP,把局域网中的某些计算机加入此组播IP,而后发送端向这个组播IP发送数据就完成了组播过程。

3、广播

向255:255:255:255发送

 

 

ps:路由器会过滤多播(组播和广播)

PS:开发流程

 

4、封装

头文件

#ifndef DATAACCESS_H
#define DATAACCESS_H
/*****************************************************************/
//做者:NULL
//函数名称:数据通讯
//函数参数:NULL
//函数返回值:NULL
//函数做用:NULL
//备注:NULL
/*****************************************************************/
#include <QObject>
#include <QUdpSocket>
class DataAccess : public QObject
{
    Q_OBJECT
private:
    QUdpSocket* udp;
public:
    explicit DataAccess(QObject *parent = nullptr);
    ~DataAccess();
    void init();
signals:
    void initSignal();
    void sendDataSignal(const QByteArray&);
public slots:
    void initSlot();
    void rcvDataSlot();
};

#endif // DATAACCESS_H

源文件

#include "dataaccess.h"
#include "includes.h"
#include "config.h"
#include "mymethod.h"
/*****************************************************************/
//做者:朱小勇
//函数名称:构造函数
//函数参数:NULL
//函数返回值:NULL
//函数做用:NULL
//备注:NULL
/*****************************************************************/
DataAccess::DataAccess(QObject *parent) : QObject(parent)
{
    udp = NULL;
}

/*****************************************************************/
//做者:朱小勇
//函数名称:初始化
//函数参数:NULL
//函数返回值:NULL
//函数做用:绑定udp端口
//备注:NULL
/*****************************************************************/
void DataAccess::init()
{
    QObject::connect(this,SIGNAL(initSignal()),this,SLOT(initSlot()));
    emit initSignal();
}

/*****************************************************************/
//做者:朱小勇
//函数名称:析构函数
//函数参数:NULL
//函数返回值:NULL
//函数做用:NULL
//备注:NULL
/*****************************************************************/
DataAccess::~DataAccess()
{
    if(NULL!=udp)
    {
        delete udp;
        udp->close();
        udp = NULL;
    }
}

/*****************************************************************/
//做者:朱小勇
//函数名称:初始化
//函数参数:NULL
//函数返回值:NULL
//函数做用:NULL
//备注:NULL
/*****************************************************************/
void DataAccess::initSlot()
{
    RET_IF_NOT_EAQU(udp,NULL);

    udp = new QUdpSocket();
    bool ret = udp->bind(QHostAddress(Config::getInstance()->sets->value(LOCAL_UDP_IP).toString()),Config::getInstance()->sets->value(LOCAL_UDP_PORT).toUInt());
    record<QString>(Config::getInstance()->sets->value(LOCAL_UDP_IP).toString());
    record<uint>(Config::getInstance()->sets->value(LOCAL_UDP_PORT).toUInt());
    record<bool>(ret);
    QObject::connect(udp,SIGNAL(readyRead()),this,SLOT(rcvDataSlot()));
}

/*****************************************************************/
//做者:朱小勇
//函数名称:数据接收
//函数参数:NULL
//函数返回值:NULL
//函数做用:NULL
//备注:NULL
/*****************************************************************/
void DataAccess::rcvDataSlot()
{
    record<QString>("rcvDataSlot");
    RET_IF_EAQU(udp->pendingDatagramSize(),VALUE_ZERO);
    QByteArray ba;
    ba.resize(udp->pendingDatagramSize());
    QHostAddress tempHost("");
    quint16 port = VALUE_ZERO;
    udp->readDatagram(ba.data(),udp->pendingDatagramSize(),&tempHost,&port);
    record<QString>(ba.toHex().toUpper());
}
相关文章
相关标签/搜索