QT学习之UDP

cpp 复制代码
#include <QUdpSocket>
 // UDP 接受的数据
 char buf[1024] = { 0 };
 // 接受到数据的标识
 bool bRecvFlag = false;
 //Udp服务器
 QUdpSocket* mSocket;
 //通信的ip和端口,用于获取发送者的 IP 和端口
 QHostAddress sendAddr; // 本机
 QHostAddress recAddr;  // 设备ip
 quint16 recPort;
 quint16 sendPort;

bool XXXCard::init() {
    mSocket = new QUdpSocket(this);

// 发送指令的机器所在ip和端口
    QSettings ini_config("ICCardReader.ini", QSettings::IniFormat);
    ini_config.setIniCodec(QTextCodec::codecForName("utf-8"));
    ini_config.beginGroup("XXX");
    QString sendIP = ini_config.value("sendIP").toString();
    // 监听error()信号 不要监听这个,mSocket->waitForReadyRead会走到监听的槽函数里
   // connect(mSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(handleError(QAbstractSocket::SocketError)));
    //sendAddr.setAddress("192.168.1.2");
    sendAddr.setAddress(sendIP.isEmpty()?"192.168.1.2": sendIP);

    QString sendPortStr = ini_config.value("sendPort").toString();
    sendPortStr = sendPortStr.isEmpty() ? "8080" : sendPortStr;
    sendPort = sendPortStr.toInt();
    bool bRet = mSocket->bind(sendPort);

// 接受指令的设备所在ip和端口 会返回响应报文
    QString cardIP = ini_config.value("cardIP").toString();
    recAddr.setAddress(cardIP.isEmpty() ? "192.168.1.232": cardIP);
    QString cardPortStr = ini_config.value("cardPort").toString();
    cardPortStr = cardPortStr.isEmpty() ? "8080" : cardPortStr;
    recPort = cardPortStr.toInt();
   // recPort = 8080;
  //  connect(mSocket, &QUdpSocket::readyRead, this, &HYB502Card::recvData);
    return bRet;
}




// 发送二进制指令 0成功 其他返回错误
int XXXX::send_hex(const std::string& in, std::string& out) {
    outPutMsg(QtDebugMsg, "XXXX::send_hex invoke begin.req = " + QString(QString::fromLocal8Bit(in.c_str())));
    ss = "";
    response = "";
    QString qstr = QString::fromStdString(in);
    QByteArray baReq = qstr.toLocal8Bit();
    mSocket->writeDatagram(baReq, recAddr, recPort);
    
    bool flag = true;
    int i = 30;
    while (flag & i > 0)
    {
        i--;
        Sleep(50);
        if (!mSocket->waitForReadyRead(10)) {
            continue;
        }
        quint16 port = 0;
        qint64 size = mSocket->readDatagram(buf, sizeof(buf), &sendAddr, &sendPort);
        if (size < 1) {
             continue;
        }

        out = buf;
        flag = false;  
    }
    QString res = QString::fromLocal8Bit(out.c_str());
    outPutMsg(QtDebugMsg, "APDU res = " + res);

    // pcsc_receiveBufferLen -= 2;//接受数据长度减去sw
    int l_res = -1;
    if (out.length() >= 4) {
        ss = out.substr(out.length() - 4);
        response = out.substr(0, out.length() - 4);
        l_res = 0;
    }
    outPutMsg(QtDebugMsg, "XXXX::send_hex invoke end.");
    return l_res;
}

这里很多让用信号槽的方式接受返回的信息 .connect(mSocket, &QUdpSocket::readyRead, this, &HYB502Card::recvData); 实际使用中发现不好使(我查的是说发送一直占用焦点什么的,导致不会捕获到信号啥的),所以使用readDatagram直接从缓存里获取。

connect(mSocket, &QUdpSocket::readyRead, this, &HYB502Card::recvData);方式感觉比较适合单纯的接收或者发,不适合一边发一边收;

可能我理解的不准确,欢迎指正!

相关推荐
Z21-X3 小时前
云原生运维学习笔记:容器技术的演进、底层原理与 Docker 全生命周期管理
运维·笔记·学习·云原生
Rabitebla11 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
无心水15 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd16 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
BroNekoX20 小时前
我将基于 QtQuick 框架开发的音乐播放器性能做到顶级
qt
La Pulga21 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd21 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白1 天前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
小小晓.1 天前
Qt 对话框、QLineEdit 与布局管理实战详解
开发语言·qt
lisw051 天前
作为人类代理的大语言模型及其角色分类!
人工智能·学习·语言模型