实现tcp客户端通信并支持keepAlive探测包

#pragma once#include <QObject>
#include <QTcpSocket>
/**********************************************
* 作者:wujianhua
* 时间:2021/02/25
* 类介绍:socket tcp客户端通信类
*
***********************************************/
class TcpClient : public QObject
{Q_OBJECTpublic:TcpClient(QObject *parent);~TcpClient();/*********************************************** 作者:wujianhua* 时间:2021/02/25* 函数:连接服务器* 参数:*    ip:服务器地址*    port:服务器端口*  timeout:超时时间* 返回:*    连接成功返回true,失败返回false***********************************************/bool connect(const QString ip, int port, int timeout = 3000);/*********************************************** 作者:wujianhua* 时间:2021/02/25* 函数:断开服务器连接* 参数:* 无* 返回:*  无***********************************************/void disconnect();/*********************************************** 作者:wujianhua* 时间:2021/02/25* 函数:是否连接* 参数:*  无* 返回:*  返回true为连接状态,false为断开状态***********************************************/bool isOnline();/*********************************************** 作者:wujianhua* 时间:2021/02/25* 函数:发送数据* 参数:*    dat:数据对象* 返回:*    发送成功返回对应发的字节数,-1设备未连接***********************************************/int send(QByteArray dat);/*********************************************** 作者:wujianhua* 时间:2021/02/25* 函数:接收设备发送过来的数据* 参数:* buf:接收设备发送的数据缓存* timeout:超时时间* 返回:*    返回接收到的数据字节数,-1设备未连接***********************************************/int recv(QByteArray &buf, int timeout = 10*1000);/*********************************************** 作者:wujianhua* 时间:2021/03/02* 函数:设置心跳保活机制* 参数:* keepIdle:没有数据交互后发送心跳探测包 单位秒* keepInterval:探测包间隔时间 单位秒*    keepCount:探测重试次数* 返回:*    无***********************************************/void setKeepAlive(int keepIdle = 2, int keepInterval = 1, int keepCount = 3);private slots:void slot_connected();void slot_readData();void slot_disconnected();void slot_stateChange(QAbstractSocket::SocketState state);
private:QTcpSocket *_tcp = nullptr;QString _ip;int _port;bool _online = false;QByteArray _readbuf;
};
#include "TcpClient.h"
#include <QSettings>
#include <QDebug>#ifdef Q_OS_WIN
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <ws2ipdef.h>
#include <mstcpip.h>
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")#endif // Q_OS_WIN#ifdef Q_OS_LINUX
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#endif // Q_OS_LINUXTcpClient::TcpClient(QObject *parent): QObject(parent){_tcp = new QTcpSocket(this);QObject::connect(_tcp, &QAbstractSocket::connected, this, &TcpClient::slot_connected);QObject::connect(_tcp, &QIODevice::readyRead, this, &TcpClient::slot_readData);QObject::connect(_tcp, &QAbstractSocket::disconnected, this, &TcpClient::slot_disconnected);QObject::connect(_tcp, &QAbstractSocket::stateChanged, this, &TcpClient::slot_stateChange);
}TcpClient::~TcpClient() {disconnect();delete _tcp;_tcp = nullptr;
}bool TcpClient::connect(const QString ip, int port, int timeout /*= 3000*/){disconnect();_tcp->abort();_ip = ip;_port = port;_tcp->connectToHost(_ip, _port);_tcp->waitForConnected(timeout);if (_online) {setKeepAlive();}return _online;
}void TcpClient::disconnect(){if (_online) {_tcp->disconnectFromHost();}
}bool TcpClient::isOnline(){return _online;
}int TcpClient::send(QByteArray dat){int size = -1;if (_online) {size = _tcp->write(dat);_tcp->flush();}return size;
}int TcpClient::recv(QByteArray &buf, int timeout /* = 10*1000 */){int size = -1;if (_online) {_tcp->waitForReadyRead(timeout);size = _readbuf.size();buf = _readbuf;}return size;
}void TcpClient::setKeepAlive(int keepIdle /* = 2 */, int keepInterval /* = 1 */, int keepCount /* = 3 */){//设置keepAlive心跳检测int fd = _tcp->socketDescriptor();int keepAlive = 1;        //开启keepAlive属性setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&keepAlive, sizeof(keepAlive));setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, (char*)&keepIdle, sizeof(keepIdle));setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&keepInterval, sizeof(keepInterval));setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, (char*)&keepCount, sizeof(keepCount));
}void TcpClient::slot_connected(){_online = true;
}void TcpClient::slot_readData(){_readbuf = _tcp->readAll();
}void TcpClient::slot_disconnected(){_online = false;
}void TcpClient::slot_stateChange(QAbstractSocket::SocketState state){switch (state){case QAbstractSocket::UnconnectedState:_online = false;break;case QAbstractSocket::ConnectedState:_online = true;break;default:break;}
}

QTcpSocket实现客户端相关推荐

  1. Qt学习笔记之网络编程

    Qt网络模块提供了允许您编写TCP / IP客户端和服务器的类.它提供了代表低级网络概念的低级类(例如QTcpSocket,QTcpServer和QUdpSocket),以及高级类(例如QNetwor ...

  2. qt tcp通信_Qt之网络编程TCP通信

    点击上方"Qt学视觉",选择"星标"公众号重磅干货,第一时间送达 想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获 TCP通信概述 TCP(Trans ...

  3. STM32+ESP8266连接电脑Qt网络上位机——QT篇

    本文简单介绍下手写网络调试器并连接ESP8266模块 上篇:  STM32+ESP8266连接电脑Qt网络上位机--准备工作 目录 一.部分Qt代码及实现过程 二.实现过程--使用ESP8266连接上 ...

  4. Qt-------->第六天,Qt高级编程

    1 IO 进程 线程 IO------->Qt第五天笔记     QFile file("1.txt");file.open();file.read();file.write ...

  5. 【Qt网络编程】实现TCP协议通信

    文章目录 概要:本期主要讲解QT中对于TCP协议通信的实现. 一.TCP协议 二.Qt中TCP协议处理 1.QTcpSocket 2.QTcpServer 三.Qt实现TCP通信 1.客户端 2.服务 ...

  6. Qt TCP/IP语音

    TCP/IP 语音* 参考文章:[QT 实现采集即时音频信号并发送至另一台电脑播放](https://blog.csdn.net/hanzhen7541/article/details/8015238 ...

  7. Qt 的网络通信(TCP)

    基于TCP Qt的网络通信 在标准 C++ 没有提供专门用于套接字通信的类,所以只能使用操作系统提供的基于 C 的 API 函数,基于这些 C 的 API 函数我们也可以封装自己的 C++ 类 , 但 ...

  8. Qt扫盲-网络编程概述

    网络编程概述 一.Qt网络编程概述 二.Qt对Http,FTP应用层协议支持 三.TCP通信编程支持 四.UDP通信编程支持 五.主机信息的获取 六.网络代理 七.底层管理的支持 一.Qt网络编程概述 ...

  9. Qt网络编程概述(一)

    分享主题 Qt网络编程概述(一) Qt网络编程之QTCPSocket和QTCPServer实例(二) Qt网络编程之QUdpSocket实例(三) Qt网络编程概述 QtNetWork模块提供了若干类 ...

  10. 基于Qt框架实现的 C/S架构的外卖平台软件系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85628215 基于Qt框架实现的 C_S架构的外卖平台软件系统 演示视频 C/S 架构的外 ...

最新文章

  1. 第8章系统服务(简易音频播放器的实现)
  2. oracle11g ora 29927,Oracle11gR2使用RMANDuplicate复制数据库
  3. [Python学习] 专题二.条件语句和循环语句的基础知识
  4. 内置函数——filter和map
  5. bbb mmc_blk_probe 分析
  6. 网站策划:如何书写网站的商业计划书
  7. regrex pattern
  8. DELPHI存储过程调用
  9. POJ3414 Pots —— BFS + 模拟
  10. Spectra Logic磁带库成SGI方案中标准化产品
  11. Fullpage:基础学习
  12. oracle 11.2 awr,oracle 11g database获取AWR报告
  13. Netty实战《原理》
  14. 微信支付V3微信公众号支付PHP教程(thinkPHP5公众号支付)/JSSDK的使用
  15. 排水沟槽开挖土方的计算方法(平行相似梯形组成的六面体体积分割计算方法)
  16. 游戏和股票的结构有一定的类似性
  17. 短视频拍摄技巧分享,巧用转场提升高级感,拥有自己的风格很重要
  18. 混合高斯模型(Gaussian Mixture Model,GMM)
  19. 计算机没有管理无线网络,笔记本win7系统下没有无线网络选项的解决方法
  20. 服务器主板用linux版本系统,华硕WG X299主板的服务器上安装ubuntu16.04的系统

热门文章

  1. 使php爬虫能够长期运行的一点总结
  2. pdn阻抗测试_阻抗测试基础(超详细,安捷伦工程师力作)(上篇)
  3. leaflet加载谷歌影像地图、天地图影像地图、天地图影像注记
  4. ThinkPad P53,T490,T590 Win7显卡驱动
  5. 软件测试面试题(2020.6.29)
  6. 机载激光雷达原理与应用科普(九)
  7. 使用python、java语言批量下载抖音中我的视频、我喜欢的视频,解析抖音视频,批量下载抖音...
  8. Mac怎么读写NTFS格式?Mac电脑重新安装NTFS卷
  9. web网页设计制作成品 ——服装明星主页(7页) 表格带留言板带音乐HTML+CSS+JavaScript
  10. 吉林警察学院计算机考研,吉林警察学院怎么样