Fix reconnect to tunnel proxy and improve framing
This commit is contained in:
parent
b865b9903a
commit
32c33ec23f
@ -97,15 +97,23 @@ QByteArray SlipDataProcessor::serializeData(const QByteArray &data)
|
||||
SlipDataProcessor::Frame SlipDataProcessor::parseFrame(const QByteArray &data)
|
||||
{
|
||||
Frame frame;
|
||||
frame.socketAddress = static_cast<quint16>(static_cast<quint16>(data.at(0)) << 8 | data.at(1));
|
||||
frame.data = data.right(data.length() - 2);
|
||||
QDataStream stream(data);
|
||||
stream >> frame.socketAddress;
|
||||
while (!stream.atEnd()) {
|
||||
quint8 dataByte;
|
||||
stream >> dataByte;
|
||||
frame.data.append(dataByte);
|
||||
}
|
||||
return frame;
|
||||
}
|
||||
|
||||
QByteArray SlipDataProcessor::buildFrame(const Frame &frame)
|
||||
{
|
||||
QByteArray addressData;
|
||||
QDataStream stream(&addressData, QIODevice::WriteOnly);
|
||||
QByteArray data;
|
||||
QDataStream stream(&data, QIODevice::WriteOnly);
|
||||
stream << frame.socketAddress;
|
||||
return addressData + frame.data;
|
||||
for (int i = 0; i < frame.data.size(); i++) {
|
||||
stream << static_cast<quint8>(frame.data.at(i));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ void TcpSocketServer::sendData(const QUuid &clientId, const QByteArray &data)
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(dcTcpSocketServerTraffic()) << "Send data to" << clientId.toString() << data + '\n';
|
||||
qCDebug(dcTcpSocketServerTraffic()) << "Send data to" << clientId.toString() << data;
|
||||
if (client->write(data) < 0) {
|
||||
qCWarning(dcTcpSocketServer()) << "Could not write data to client socket" << clientId.toString();
|
||||
}
|
||||
|
||||
@ -335,7 +335,7 @@ void TunnelProxyServer::onClientDataAvailable(const QUuid &clientId, const QByte
|
||||
SlipDataProcessor::Frame frame;
|
||||
frame.socketAddress = clientConnection->socketAddress();
|
||||
frame.data = data;
|
||||
qCDebug(dcTunnelProxyServerTraffic()) << "--> Tunnel data to server socket address" << clientConnection->socketAddress() << "to" << clientConnection->serverConnection() << qUtf8Printable(data);
|
||||
qCDebug(dcTunnelProxyServerTraffic()) << "--> Tunnel data to server socket address" << clientConnection->socketAddress() << "to" << clientConnection->serverConnection() << "\n" << data;
|
||||
clientConnection->serverConnection()->transportClient()->sendData(SlipDataProcessor::serializeData(SlipDataProcessor::buildFrame(frame)));
|
||||
|
||||
} else if (tunnelProxyClient->type() == TunnelProxyClient::TypeServer) {
|
||||
@ -366,7 +366,7 @@ void TunnelProxyServer::onClientDataAvailable(const QUuid &clientId, const QByte
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(dcTunnelProxyServerTraffic()) << "--> Tunnel data from server socket" << frame.socketAddress << "to" << clientConnection << qUtf8Printable(data);
|
||||
qCDebug(dcTunnelProxyServerTraffic()) << "--> Tunnel data from server socket" << frame.socketAddress << "to" << clientConnection << "\n" << frame.data;
|
||||
clientConnection->transportClient()->sendData(frame.data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -159,6 +159,8 @@ void TunnelProxySocketServer::stopServer()
|
||||
m_enabled = false;
|
||||
m_reconnectTimer.stop();
|
||||
|
||||
qCDebug(dcTunnelProxySocketServer()) << "Stopping the server.";
|
||||
|
||||
if (m_connection) {
|
||||
qCDebug(dcTunnelProxySocketServer()) << "Disconnecting from" << m_connection->serverUrl().toString();
|
||||
m_connection->disconnectServer();
|
||||
@ -247,6 +249,7 @@ void TunnelProxySocketServer::onConnectionStateChanged(QAbstractSocket::SocketSt
|
||||
break;
|
||||
case QAbstractSocket::ConnectedState:
|
||||
setState(StateConnected);
|
||||
qCDebug(dcTunnelProxySocketServer()) << "Stopping reconnect timer.";
|
||||
m_reconnectTimer.stop();
|
||||
break;
|
||||
case QAbstractSocket::ClosingState:
|
||||
@ -351,9 +354,10 @@ void TunnelProxySocketServer::requestSocketDisconnect(quint16 socketAddress)
|
||||
void TunnelProxySocketServer::setupReconnectTimer()
|
||||
{
|
||||
m_reconnectTimer.setInterval(5000);
|
||||
m_reconnectTimer.setSingleShot(true);
|
||||
m_reconnectTimer.setSingleShot(false);
|
||||
connect(&m_reconnectTimer, &QTimer::timeout, this, [this](){
|
||||
if (!m_enabled) {
|
||||
qCDebug(dcTunnelProxySocketServer()) << "Stopping reconnect timer. The server has been disabled.";
|
||||
m_reconnectTimer.stop();
|
||||
return;
|
||||
}
|
||||
@ -433,8 +437,6 @@ void TunnelProxySocketServer::cleanUp()
|
||||
m_remoteProxyServerVersion.clear();
|
||||
m_remoteProxyApiVersion.clear();
|
||||
|
||||
m_enabled = false;
|
||||
|
||||
setState(StateDisconnected);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user