zoukankan      html  css  js  c++  java
  • Qt QTcpSocket waitForReadyRead()等函数用法——客户端开关读写应用笔记

    当前工作是为设备上位机做TCP通信,所以只需要写客户端程序,环境是Qt5.12 MinGW,用QTcpSocket类。以下是基本的开关读写遇到的沟沟坎坎。

    开关代码:

     1 myClass()
     2 {
     3     QHostAddress ip;
     4     quint16 port;
     5     ip = QHoseAddress("192.168.10.76");              //服务器IP
     6     port = 8800;                                     //用服务器开放的端口号去连接服务器。
     7 }
     8  
     9 /***************************开**************************/
    10 int myClass::Open()
    11 {
    12     m_tcpClient->connectToHost(ip,port);             //用目标服务器IP/port执行连接动作
    13     if(m_tcpClient->waitForConnected())              //等待连接返回
    14     {
    15         return 0;
    16     }
    17     return -3;
    18 }
    19  
    20 /***************************关**************************/
    21 int myClass::Close()
    22 {
    23     m_tcpClient->disconnectFromHost();
    24     if(m_tcpClient->state() == QAbstractSocket::UnconnectedState
    25         || m_tcpClient->waitForDisconnected())       //多了个条件
    26     {
    27         return 0;
    28     }
    29     return -3;
    30 }

    读:

     1 /***************************读**************************/
     2 //读我目前实现两种
     3 //1、这是我最先实现的 定义信号和槽,qiodevice.h中的readyRead()信号触发槽函数进行读取数据。
     4  
     5 myClass()
     6 {
     7     connect(tcpClient,SIGNAL(readyRead()),this,SLOT(ReadData()));
     8     //头文件要声明SLOT,这里不写了
     9     //出现connect报错:"use of undeclared identifier 'connect'"
    10     //解决方案:增加基类public QObject
    11     //我的是这样写class tcpComm:public ibasecomm,public QObject
    12 }
    13  
    14 void myClass::ReadData()
    15 {
    16     //当有数据进来,槽函数激活,没有过多测试激活时机等等,这种不是我需要的。
    17 }
    18  
    19 //2、由上层调用我的读写函数,利用waitForReadyRead()函数阻塞进程,等待数据,函数默认参数为等待时长=30000ms,超时返回false
    20  
    21 int myClass::read(void * buffer, int len)
    22 {
    23 //尝试在waitForReadyRead()函数之前有数据过来,当执行wait函数时,会直接返回true。
    24 //在阻塞期间来数据,会返回true。
    25 //阻塞默认参数30000ms,超时返回false。
    26     if(m__tcpClient->waitForReadyRead())
    27     {
    28         buffer = (void*)m_bRead.data_ptr();
    29         return m_bRead.size();
    30     }
    31 }
    32 //代码功能不完整,主要是实现读取数据功能。
    33  
    34  
    35 /***************************写**************************/
    36 int myClass::Write(const void * buffer, int len)
    37 {
    38     const char * data = (char *)buffer;
    39     qint64 nRes = m_tcpClient->write(data,len);
    40     return (int)nRes;
    41 }
  • 相关阅读:
    hdu 1541 Stars(经典BIT)
    CODE[VS] 1082 线段树练习3(区间修改+区间查询)
    Luogu P3368 【模板】树状数组 2(区间修改,单点查询)
    牛客小白月赛5-I-区间(差分求前缀和+一次暴力统计)
    牛客小白月赛5-J-时间(time) (简单模拟)
    牛客小白月赛5-D-阶乘(求n内每个数的阶乘相乘后尾数为0的个数)
    CF1110C Meaningless Operations(构造题)
    洛谷4859 BZOJ3622 已经没什么好害怕的了(DP,二项式反演)
    二项式反演学习笔记
    UVAlive-7040 color(组合数学,二项式反演)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14874189.html
Copyright © 2011-2022 走看看