添加tcp心跳

添加升级小板程序、方案、jwt文件的进度条命令
This commit is contained in:
ranchuan
2023-12-29 09:41:37 +08:00
parent 8e7f3347d9
commit 92f3ebbe33
16 changed files with 389 additions and 55 deletions

View File

@@ -2,12 +2,67 @@
#include "QNetworkConfigurationManager"
#include "QThread"
const int keepalive = 1; // 开启keepalive属性
const int keepidle = 5; // 如果连接在5秒内没有任何数据来往则进行探测
const int keepinterval = 3; // 探测时发包的时间间隔为3秒
const int keepcount = 3; // 尝试探测的次数, 如果第一次探测包就收到响应,则不在继续探测
#if 1
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
// 开启TCP心跳检测机制
int enableKeepalive(int fd) {
if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)) < 0) return -1;
if (setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle)) < 0) return -1;
if (setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &keepinterval, sizeof(keepinterval)) < 0) return -1;
if (setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &keepcount, sizeof(keepcount)) < 0) return -1;
return 0;
}
#else
int enableKeepalive(int fd)
{
return -1;
}
#endif
static bool CheckNetInfo()
{
QNetworkInterface net= QNetworkInterface::interfaceFromName("eth0");
if(net.flags().testFlag(QNetworkInterface::IsUp)
&& net.flags().testFlag(QNetworkInterface::IsRunning)
&& !net.flags().testFlag(QNetworkInterface::IsLoopBack)
&& (net.name() == "eth0"))
{
// qDebug() << "eth0 is Connected" << endl;
return true;
}
else
{
// qDebug() << "eth0 is Not Connected";
return false;
}
}
if_tcp::if_tcp()
{
this->connect_state = false;
this->timer_reconnect_ = nullptr;
this->tcp_socket_ = nullptr;
this->reconnect_timeout_ms = 10000;
this->reconnect_timeout_ms = 3000;
this->cfg_ = syscfg();
this->timer_recv_end_ = nullptr;
@@ -33,11 +88,9 @@ void if_tcp::init()
if (nullptr == timer_reconnect_)
{
timer_reconnect_ = new QTimer(this);
connect(timer_reconnect_, &QTimer::timeout, this, &if_tcp::reconnect_cb);
}
timer_reconnect_->start(reconnect_timeout_ms);
if (nullptr == tcp_socket_)
{
tcp_socket_ = new QTcpSocket(this);
@@ -49,8 +102,10 @@ void if_tcp::init()
tcp_socket_->setSocketOption(QAbstractSocket::LowDelayOption, 1); // 禁用Nagle算法.
tcp_socket_->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
if (cfg_->tcp_enable)
if (cfg_->tcp_enable){
tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port);
enableKeepalive(tcp_socket_->socketDescriptor());
}
}
}
@@ -78,39 +133,25 @@ QString if_tcp::get_local_ip()
void if_tcp::reconnect_cb()
{
if (connect_state != true)
{
QNetworkConfigurationManager mgr;
if (mgr.isOnline() == true)
// 网线拔出之后自动断开连接
if(CheckNetInfo()==false){
if(connect_state!=false){
connect_state=false;
tcp_socket_->close();
}
}else{
if (connect_state != true)
{
if (cfg_->tcp_enable)
{
qDebug("network is online.");
tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port);
}
}
else
{
if (cfg_->tcp_enable)
{
qDebug("network is not online.");
}
}
// 设置为配置的ip地址
// if (get_local_ip().isEmpty())
// {
// qDebug("modify local ip addr.");
// QString str = "ifconfig eth0 %1";
// system(str.arg(cfg_->local_ip).toLocal8Bit().data());
// str = "route add default gw %1";
// system(str.arg(cfg_->gateway_ip).toLocal8Bit().data());
// }
}
}
void if_tcp::connected_cb()
{
timer_reconnect_->start();
connect_state = true;
emit tcp_connected_signal();
qInfo("connected");
@@ -124,43 +165,41 @@ void if_tcp::disconnected_cb()
void if_tcp::state_changed_cb(QAbstractSocket::SocketState nSocketState)
{
qInfo("state changed:%d", nSocketState);
// qInfo("state changed:%d", nSocketState);
}
void if_tcp::on_error_cb(QAbstractSocket::SocketError nErrCode)
{
connect_state = false;
qWarning("on error:%d", nErrCode);
// qWarning("on error:%d", nErrCode);
}
void if_tcp::ready_read_cb()
{
QByteArray data = tcp_socket_->readAll();
timer_reconnect_->start();
if (irq_fun)
{
irq_fun(myarray(data));
}
// qInfo()<< "recv data from tcp:"<<crc::byte_array_to_string(recv)<<endl;
emit tcp_recv_signal();
// qInfo()<< "recv data from tcp:"<<crc::byte_array_to_string(recv)<<endl;
}
int if_tcp::write(myarray data)
{
emit tcp_send_signal();
if (nullptr == tcp_socket_ || false == connect_state)
{
// qWarning() << "Cant send data , TcpClient socket not connect.";
return 0;
}
int wb = tcp_socket_->write(data);
if (!tcp_socket_->flush())
{
// connect_state=false;
qWarning("write fial:[%s]", data.toHex(' ').data());
}
else
{
timer_reconnect_->start();
}
return wb;
}

View File

@@ -33,6 +33,8 @@ protected slots:
void ready_read_cb();
signals:
void tcp_connected_signal();
void tcp_recv_signal();
void tcp_send_signal();
protected:
mycfg *cfg_;
@@ -45,4 +47,8 @@ protected:
int recv_end_timeout_ms;
};
InterFace *if_tcp_get();
#endif // IF_TCP_H