qt UDPSocket 的使用

//MyUdpSocket.h

cpp 复制代码
#ifndef MYUDPSOCKET_H
#define MYUDPSOCKET_H
//#pragma once


#include "udp_global.h"

#include <string>
#include <set>

#include <QUdpSocket>
#include <QNetworkInterface>
#include <QObject>
#include <QList>


static std::set<std::string> get_system_ip_all()
{
    std::set<std::string> setIp;
    //QList<QHostAddress> ipList;
    QList<QNetworkInterface> allIFS = QNetworkInterface::allInterfaces();
    foreach (QNetworkInterface interface, allIFS)
    {
        if(     interface.flags() & QNetworkInterface::IsUp
        && !(   interface.flags() & QNetworkInterface::IsLoopBack)
                )
        {
            foreach (QNetworkAddressEntry entry, interface.addressEntries())
            {
                if(entry.ip().protocol() == QAbstractSocket::IPv4Protocol)
                {
                    //ipList.append(entry.ip());
                    setIp.insert(entry.ip().toString().toStdString());
                }
            }
        }
    }
    return setIp;
} // */

static bool isSelfIp(std::set<std::string>& mySetIp, std::string& senderStrIp)
{
    std::set<std::string>::iterator itIp = mySetIp.begin();
    while(itIp != mySetIp.end())
    {
        if(senderStrIp.find(*itIp) != std::string::npos)
        {
            return true;
        }
        itIp++;
    }
    return false;
}


class UDPSHARED_EXPORT MyUdpSocket : public QObject
{
    Q_OBJECT
public:
    MyUdpSocket (unsigned short portReceive, unsigned short _portSend = 0, QObject* parent = nullptr);
    virtual ~MyUdpSocket();

    void sendMsg (QByteArray baMsg, unsigned short _port = 0);
    void sendMsg(const char *data, qint64 len, unsigned short _port = 0);

public slots:
    void readyRead();
    //void slotMsg(char buf[], unsigned short len);

signals:
    void sigMsg(char buf[], unsigned short len);

private:
    QThread* m_thread;
    QUdpSocket* m_pUdpSocketReceive;
    QUdpSocket* m_pUdpSocketSend;
    std::set<std::string> m_setIp;
    unsigned short m_portReceive;
    unsigned short m_portSend;

};

#endif // MYUDPSOCKET_H

//MyUdpSocket .cpp

cpp 复制代码
#include "MyUdpSocket.h"
#include <QNetworkDatagram>

MyUdpSocket::MyUdpSocket (unsigned short _portReceive, unsigned short _portSend, QObject* parent):QObject(parent),
m_portReceive(_portReceive), m_portSend (_portSend)
{
    m_setIp = get_system_ip_all();
    m_pUdpSocketReceive = new QUdpSocket(this);
    if(m_portSend==0)
    {
        m_pUdpSocketSend = m_pUdpSocketReceive;
        m_portSend = m_portReceive;
    }
    else
    {
        m_pUdpSocketSend = new QUdpSocket(this);
    }

    m_pUdpSocketReceive->bind(m_portReceive, QUdpSocket::ReuseAddressHint);//广播//QudpSockst::8hareAddresg//接收
    connect(m_pUdpSocketReceive, &QUdpSocket::readyRead, this, &MyUdpSocket::readyRead);//接收



    /*/组播
    m_pUdpSocket->bind(QHostAddress::AnyIPv4, m_portSend, QUdpSocket::ReuseAddressHint);
    m_pUdpSocket->joinMulticastGroup(QHostAddress("10.66.1.90"));//*/
    //connect(this,&MyUdpSocket::sigMsg, this,&MyUdpSocket::slotMsg);

    //m_thread = new QThread();
    //m_pUdpSocket->moveToThread(m_thread);
    //this->moveToThread(m_thread);
    //m_thread->start();
}

MyUdpSocket::~MyUdpSocket()
{
    if(m_pUdpSocketReceive)
    {
        if(m_pUdpSocketReceive == m_pUdpSocketSend)
        {
            m_pUdpSocketSend = nullptr;
        }
        delete m_pUdpSocketReceive;
        m_pUdpSocketReceive = nullptr;
    }
    if(m_pUdpSocketSend)
    {
        delete m_pUdpSocketSend;
        m_pUdpSocketSend = nullptr;
    }
}

void MyUdpSocket::sendMsg(QByteArray baMsg, unsigned short _port)
{
    if (_port == 0) _port = m_portSend;
    m_pUdpSocketSend->writeDatagram(baMsg, QHostAddress::Broadcast, _port);//广播
    //m_pUdpSocket->writeDatagram(baMsg, QHostAddress("10.66. 1. 90"), _port);//组播
}

void MyUdpSocket::sendMsg(const char *data, qint64 len, unsigned short _port)
{
    if (_port == 0) _port = m_portSend;
    m_pUdpSocketSend->writeDatagram(data, len, QHostAddress::Broadcast, _port);//广播
    //m_pUdpSocket->writeDatagram(data, len, QHostAddress("10.66. 1. 90"), _port);//组播
}

void MyUdpSocket::readyRead()
{
    if(m_pUdpSocketReceive->hasPendingDatagrams())
    {
        qint64 len = m_pUdpSocketReceive->pendingDatagramSize();
#if 0
        QHostAddress sendAddress;
        qint64 sendPort;
        QByteArray recvData;
        recvData.resize(len);
        m_pUdpSocketReceive->readDatagram(recvData.data(), len, &sendAddress, &sendPort);
#else
        QNetworkDatagram aa = m_pUdpSocketReceive->receiveDatagram(len);
        QHostAddress sendAddress = aa.destinationAddress();
        //qint64 sendPort = aa.destinationPort();
        QByteArray recvData = aa.data();
#endif
        std::string strSender = sendAddress.toString().toStdString();
        if(isSelfIp(m_setIp, strSender))   //接受到自己的数据
        {
            //int aa = 0;
            emit sigMsg(recvData.data(), len);
        }
        else    //接受到别人的数据
        {
            emit sigMsg(recvData.data(), len);
        }
    }
}

//void MyUdpSocket::slotMsg(char buf[], unsigned short len)
//{
//    //int a = 0;
//}

使用

cpp 复制代码
    m_pMyUdpSocket = new MyUdpSocket(1122,1133);
    connect(m_pMyUdpSocket, &MyUdpSocket::sigMsg, this, &MainWindow::onReadyRead);

    
    m_pMyUdpSocket->sendMsg(QByteArray("66666"),1133);
    m_pMyUdpSocket->sendMsg(QByteArray("44444"),1122);
相关推荐
码匠许师傅1 天前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
丰锋ff1 天前
基于 Qt 的智慧社区物业管理系统
开发语言·qt
夜不会漫长1 天前
C++入门(1)
开发语言·c++·算法
旖旎夜光1 天前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..1 天前
【C++】继承——基类和派生类的配合
开发语言·c++·算法
程与留1 天前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci1 天前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
Littlehero_1211 天前
QT自定义控件之热换站系统(源码开源)
开发语言·qt
冻柠檬飞冰走茶1 天前
《数据结构实验指导-C++语言版》 求单链表list中的元素个数,即表长
开发语言·数据结构·c++·算法·list
_Narcissus_1 天前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径