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);方式感觉比较适合单纯的接收或者发,不适合一边发一边收;

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

相关推荐
han_hanker15 分钟前
RequestAttributes , ServletRequestAttributes学习
学习
weixin_513449961 小时前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
鱼鳞_1 小时前
Java学习笔记_Day29(异常)
java·笔记·学习
嵌入式小企鹅2 小时前
DeepSeek-V4昇腾首发、国芯抗量子MCU突破、AI编程Agent抢班夺权
人工智能·学习·ai·程序员·算力·risc-v
Amazing_Cacao2 小时前
CFCA精品可可产区认证课程风土解析(亚洲):撕开标签伪装,将微气候差异转化为可用变量
学习
我的xiaodoujiao2 小时前
API 接口自动化测试详细图文教程学习系列11--Requests模块3--测试练习
开发语言·python·学习·测试工具·pytest
墨澜逸客3 小时前
《华胥文化》百回大纲
学习·其他·百度·学习方法·新浪微博
Stella Blog3 小时前
狂神Java基础学习笔记Day04
java·笔记·学习
一只机电自动化菜鸟3 小时前
一建机电备考笔记(17) 常用设备—通用设备1(含考频+题型)
笔记·学习·职场和发展·生活·学习方法
深蓝海拓3 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十)框架初成的阶段总结
网络·笔记·python·学习·ui·plc