#include "if_tcp.h" #include "QNetworkConfigurationManager" #include "QThread" if_tcp::if_tcp() { this->connect_state = false; this->timer_reconnect_ = nullptr; this->tcp_socket_ = nullptr; this->reconnect_timeout_ms = 10000; this->cfg_ = syscfg(); this->timer_recv_end_ = nullptr; this->recv_end_timeout_ms = 100; qDebug("tcp created."); } if_tcp::~if_tcp() { if(timer_reconnect_!=nullptr){ delete timer_reconnect_; } if(tcp_socket_!=nullptr){ delete tcp_socket_; } if(timer_recv_end_!=nullptr){ delete timer_recv_end_; } } 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); connect(tcp_socket_, SIGNAL(connected()), this, SLOT(connected_cb())); connect(tcp_socket_, SIGNAL(disconnected()), this, SLOT(disconnected_cb())); connect(tcp_socket_, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(state_changed_cb(QAbstractSocket::SocketState))); connect(tcp_socket_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(on_error_cb(QAbstractSocket::SocketError))); connect(tcp_socket_, SIGNAL(readyRead()), this, SLOT(ready_read_cb())); tcp_socket_->setSocketOption(QAbstractSocket::LowDelayOption, 1); // 禁用Nagle算法. tcp_socket_->setSocketOption(QAbstractSocket::KeepAliveOption, 1); if (cfg_->tcp_enable) tcp_socket_->connectToHost(QHostAddress(cfg_->server_ip), cfg_->server_port); } } // 获取本机地址 QString if_tcp::get_local_ip() { QList network = QNetworkInterface::allInterfaces(); foreach (QNetworkInterface net, network) { QString netName = net.humanReadableName(); if (netName == "eth0") { QList list = net.addressEntries(); // 获取IP地址与子掩码等 foreach (QNetworkAddressEntry address, list) { if (address.ip().protocol() == QAbstractSocket::IPv4Protocol) // 获取IPv4的地址 { return address.ip().toString(); } } } } return QString(); } void if_tcp::reconnect_cb() { if (connect_state != true) { QNetworkConfigurationManager mgr; if (mgr.isOnline() == 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"); } void if_tcp::disconnected_cb() { connect_state = false; qInfo("disconnected"); } void if_tcp::state_changed_cb(QAbstractSocket::SocketState nSocketState) { qInfo("state changed:%d", nSocketState); } void if_tcp::on_error_cb(QAbstractSocket::SocketError nErrCode) { connect_state = false; 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:"<write(data); if (!tcp_socket_->flush()) { // connect_state=false; qWarning("write fial:[%s]", data.toHex(' ').data()); } else { timer_reconnect_->start(); } return wb; } InterFace *if_tcp_get() { static InterFace *if_ = nullptr; if (if_ == nullptr) { if_ = new if_tcp(); QTimer::singleShot(0, if_, &InterFace::init); } return if_; } if_export(tcp, if_tcp_get);