PunchHMI/machine/qbindtcpsocket.cpp

187 lines
5.7 KiB
C++
Raw Permalink Normal View History

2024-02-06 06:58:57 +00:00
#include "qbindtcpsocket.h"
#include <QHostAddress>
QBindTcpSocket::QBindTcpSocket(QObject *parent):
QTcpSocket(parent)
{
}
QBindTcpSocket::~QBindTcpSocket()
{
}
int QBindTcpSocket::bindAddrAndPort(QString localAddr, quint16 localPort)
{
QString str = localAddr;
QHostAddress addr(str);
setLocalAddress(addr);
setLocalPort(localPort);
return 0;
}
//-------------------------------
TcpConnectDetect::TcpConnectDetect(QObject *parent) :
QObject(parent),
m_pDetectSocket(NULL),
m_localip(DEF_LOCAL_IP),
m_localport(DEF_LOCAL_PORT),
m_serverip(DEF_SERVER_IP),
m_serverport(DEF_SERVER_PORT)
{
}
TcpConnectDetect::~TcpConnectDetect()
{
if (m_pDetectSocket == NULL)
{
m_pDetectSocket->disconnectFromHost();
m_pDetectSocket->waitForDisconnected();
m_pDetectSocket->close();
delete m_pDetectSocket;
}
}
void TcpConnectDetect::detectStart()
{
qDebug("TcpConnectDetect start");
if (m_pDetectSocket == NULL)
{
m_pDetectSocket = new QBindTcpSocket;
}
}
int TcpConnectDetect::connectDetect()
{
int connectsta = 0;
int rslt;
// qDebug() << "TcpConnectDetect " << QThread::currentThread();
if (m_pDetectSocket == NULL)
{
return 0;
}
if (m_localip.isEmpty() == false)
{
m_pDetectSocket->bindAddrAndPort(m_localip, m_localport);
}
m_pDetectSocket->abort();
m_pDetectSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1);
m_pDetectSocket->connectToHost(m_serverip, m_serverport);
do
{
rslt = m_pDetectSocket->waitForConnected(4000); // 等待连接
qDebug("bind Detect connect rslt=%d", rslt);
qDebug() << "localip=" << m_localip << "localport=" << m_localport;
qDebug() << "serverip=" << m_serverip << "serverport=" << m_serverport;
switch(m_pDetectSocket->state())
{
case QAbstractSocket::ConnectedState:
{
// 如果连接上,说明 m_pClientSocket 连接已经无效, 需要断开重新连接
// 先断开测试连接
m_pDetectSocket->disconnectFromHost();
m_pDetectSocket->waitForDisconnected();
connectsta = 1;
// 发送断开主连接的信号
qDebug() << "detect is Connected, disconnect all";
break;
}
case QAbstractSocket::UnconnectedState:
{
// qDebug() << "detect is Unconnected err=" << m_pDetectSocket->error() << ", info:" << m_pDetectSocket->errorString();
switch (m_pDetectSocket->error())
{
case QAbstractSocket::SocketTimeoutError: // 连接超时,说明已经断开
case QAbstractSocket::NetworkError: // 网络错误, 主机不可连接, 可能已经断开
{
qDebug() << "detect is timout, disconnect all";
connectsta = 1;
// 发送断开主连接的信号
break;
}
case QAbstractSocket::ConnectionRefusedError: // 拒绝连接, 说明连接还在
{
connectsta = 2;
// qDebug() << "Connection Refused, old connect is alive";
break;
}
/*
case QAbstractSocket::RemoteHostClosedError:
case QAbstractSocket::HostNotFoundError:
case QAbstractSocket::SocketAccessError:
case QAbstractSocket::SocketResourceError:
case QAbstractSocket::SocketTimeoutError:
case QAbstractSocket::DatagramTooLargeError:
case QAbstractSocket::AddressInUseError:
case QAbstractSocket::SocketAddressNotAvailableError:
case QAbstractSocket::UnsupportedSocketOperationError:
case QAbstractSocket::UnfinishedSocketOperationError:
case QAbstractSocket::ProxyAuthenticationRequiredError:
case QAbstractSocket::SslHandshakeFailedError:
case QAbstractSocket::ProxyConnectionRefusedError:
case QAbstractSocket::ProxyConnectionClosedError:
case QAbstractSocket::ProxyConnectionTimeoutError:
case QAbstractSocket::ProxyNotFoundError:
case QAbstractSocket::ProxyProtocolError:
case QAbstractSocket::UnknownSocketError:
*/
default:
{
// 继续检测
connectsta = 2;
qDebug() << " retry";
break;
}
} // 错误处理结束
}
case QAbstractSocket::ConnectingState:
{
// qDebug() << "detect is Connecting";
// qDebug() << "localip=" << m_localip << "localport=" << m_localport;
// 继续等待
break;
}
case QAbstractSocket::HostLookupState:
case QAbstractSocket::BoundState:
case QAbstractSocket::ListeningState:
case QAbstractSocket::ClosingState:
default:
{
// 继续等待
qDebug("detect sta is %d\r\n", m_pDetectSocket->state());
break;
}
}
if (connectsta != 0)
{
break;
}
}while(1);
m_pDetectSocket->close();
// 发送本次测试连接的状态信号
emit(siConnectSta(connectsta));
return connectsta;
}
void TcpConnectDetect::setIpAndPort(QString localip, quint16 localport, QString serverip, quint16 serverport)
{
m_localip = localip;
m_localport = localport;
m_serverip = serverip;
m_serverport = serverport;
}