qtcpsocket 客户端_qtcpsocket接收结构体数据

qtcpsocket 客户端_qtcpsocket接收结构体数据实现tcp客户端通信并支持keepAlive探测包#pragmaonce#include<QObject>#include<QTcpSocket>/***********************************************作者:wujianhua*时间:2021/02/25*类介绍:sockettcp客户端通信类************************************************/classT.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

#pragma once

#include <QObject>
#include <QTcpSocket>
/**********************************************
* 作者:wujianhua
* 时间:2021/02/25
* 类介绍:socket tcp客户端通信类
*
***********************************************/
class TcpClient : public QObject
{
	Q_OBJECT

public:
	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_LINUX


TcpClient::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;
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195651.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 万能乘法速算法大全_小学数学加减乘除【速算法】都在这里! 寒假让孩子练一练…

    万能乘法速算法大全_小学数学加减乘除【速算法】都在这里! 寒假让孩子练一练…★需要电子版资料可直接拉至文末查看领取方式哈!小果老师说:很多小朋友的寒假生活已经开启啦!寒假的确可以好好玩一玩,但某种程度上该学习还是的学习一些的!因此,今天小果老师要给大家分享的内容是数学速算法,这些内容掌握以后就几乎不用担心那些简便运算没头绪啦!赶紧来看看然后为孩子收藏起来吧!01加法的神奇速算法一、加大减差法口诀前面加数加上后面加数的整数,减去后面加数与整数的差等于和。例题1376+98…

    2022年6月5日
    34
  • linux怎样用jps命令_hadoopjps只有五个

    linux怎样用jps命令_hadoopjps只有五个前言:在网上有好多说是以root身份vi/etc/profile,然后在下面加一行exportPATH="usr/java/jdk160_05/bin:$PATH"(其中jdk160_05是你的安装目录,依你自己的安装情况所决定),然后source/etc/profile即可解决我觉得这是当你自己安装jdk后jps命令不好使时可以这样解决,但是经过我试验你自己安装jdk成功后(如:在解压jd…

    2022年9月21日
    2
  • vuex的五大核心_vue核心原理

    vuex的五大核心_vue核心原理Vuex的核心概念Vuex有5个核心概念,分别是State,Getters,mutations,Actions,Modules。StateVuex使用单一状态树,也就是说,用一个对象包含了所有应

    2022年7月30日
    8
  • Java 数组和List的使用「建议收藏」

    Java 数组和List的使用「建议收藏」Java中数据的保存离不开数组,但数组的长度是不可变的。这时候就需要列表类(List)来进行数组扩容等操作,同时列表还可以包含批量删除、修改等更方便的内容。同时ArrayList作为使用相当频繁的List类,它的扩容算法效率很高,本文通过其源代码来分析其扩容高效的原因。

    2022年8月23日
    5
  • javac不是内部或外部命令,也不是可运行的程序 或批处理文件的细节问题(window10)

    javac不是内部或外部命令,也不是可运行的程序 或批处理文件的细节问题(window10)描述:打开cmd,输入java,java-version没有问题,但是javac提示不是内部命令问题排查: 找到java安装下的bin目录,运行cmd,输入javac,能提示,说明环境配置有问题cmd输入:path看看java相关的java相关路径有没有多余的符号,比如多出分号,逗号(笔者上面是正确的路径展示形式)看看下载的解压后java目录对不对…

    2022年4月30日
    83
  • 从零开始到设计Python+Selenium自动化测试框架-如何开始

    从零开始到设计Python+Selenium自动化测试框架-如何开始如何开始学习webui自动化测试?如何选择一门脚本语言?选择什么自动化测试工具?    本人已经做测试快5年,很惭愧,感觉积累不够,很多测试都不会,三年多功能测试,最近两年才开始接触和学习自动化测试。打算写一个系列文章,关于如何从零开始到会设计和组装一个简单的webui自动化测试框架。把文章放到这里的目的,方便以后自己记不住,回过来看看,还有就是给一些想学习web自动化测试的朋友们一

    2022年7月15日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号