Fix reconnect to tunnel proxy and improve framing

This commit is contained in:
Simon Stürz 2021-12-20 13:50:31 +01:00
parent b865b9903a
commit 32c33ec23f
4 changed files with 21 additions and 11 deletions

View File

@ -97,15 +97,23 @@ QByteArray SlipDataProcessor::serializeData(const QByteArray &data)
SlipDataProcessor::Frame SlipDataProcessor::parseFrame(const QByteArray &data) SlipDataProcessor::Frame SlipDataProcessor::parseFrame(const QByteArray &data)
{ {
Frame frame; Frame frame;
frame.socketAddress = static_cast<quint16>(static_cast<quint16>(data.at(0)) << 8 | data.at(1)); QDataStream stream(data);
frame.data = data.right(data.length() - 2); stream >> frame.socketAddress;
while (!stream.atEnd()) {
quint8 dataByte;
stream >> dataByte;
frame.data.append(dataByte);
}
return frame; return frame;
} }
QByteArray SlipDataProcessor::buildFrame(const Frame &frame) QByteArray SlipDataProcessor::buildFrame(const Frame &frame)
{ {
QByteArray addressData; QByteArray data;
QDataStream stream(&addressData, QIODevice::WriteOnly); QDataStream stream(&data, QIODevice::WriteOnly);
stream << frame.socketAddress; 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;
} }

View File

@ -52,7 +52,7 @@ void TcpSocketServer::sendData(const QUuid &clientId, const QByteArray &data)
return; return;
} }
qCDebug(dcTcpSocketServerTraffic()) << "Send data to" << clientId.toString() << data + '\n'; qCDebug(dcTcpSocketServerTraffic()) << "Send data to" << clientId.toString() << data;
if (client->write(data) < 0) { if (client->write(data) < 0) {
qCWarning(dcTcpSocketServer()) << "Could not write data to client socket" << clientId.toString(); qCWarning(dcTcpSocketServer()) << "Could not write data to client socket" << clientId.toString();
} }

View File

@ -335,7 +335,7 @@ void TunnelProxyServer::onClientDataAvailable(const QUuid &clientId, const QByte
SlipDataProcessor::Frame frame; SlipDataProcessor::Frame frame;
frame.socketAddress = clientConnection->socketAddress(); frame.socketAddress = clientConnection->socketAddress();
frame.data = data; 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))); clientConnection->serverConnection()->transportClient()->sendData(SlipDataProcessor::serializeData(SlipDataProcessor::buildFrame(frame)));
} else if (tunnelProxyClient->type() == TunnelProxyClient::TypeServer) { } else if (tunnelProxyClient->type() == TunnelProxyClient::TypeServer) {
@ -366,7 +366,7 @@ void TunnelProxyServer::onClientDataAvailable(const QUuid &clientId, const QByte
return; 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); clientConnection->transportClient()->sendData(frame.data);
} }
} }

View File

@ -159,6 +159,8 @@ void TunnelProxySocketServer::stopServer()
m_enabled = false; m_enabled = false;
m_reconnectTimer.stop(); m_reconnectTimer.stop();
qCDebug(dcTunnelProxySocketServer()) << "Stopping the server.";
if (m_connection) { if (m_connection) {
qCDebug(dcTunnelProxySocketServer()) << "Disconnecting from" << m_connection->serverUrl().toString(); qCDebug(dcTunnelProxySocketServer()) << "Disconnecting from" << m_connection->serverUrl().toString();
m_connection->disconnectServer(); m_connection->disconnectServer();
@ -247,6 +249,7 @@ void TunnelProxySocketServer::onConnectionStateChanged(QAbstractSocket::SocketSt
break; break;
case QAbstractSocket::ConnectedState: case QAbstractSocket::ConnectedState:
setState(StateConnected); setState(StateConnected);
qCDebug(dcTunnelProxySocketServer()) << "Stopping reconnect timer.";
m_reconnectTimer.stop(); m_reconnectTimer.stop();
break; break;
case QAbstractSocket::ClosingState: case QAbstractSocket::ClosingState:
@ -351,9 +354,10 @@ void TunnelProxySocketServer::requestSocketDisconnect(quint16 socketAddress)
void TunnelProxySocketServer::setupReconnectTimer() void TunnelProxySocketServer::setupReconnectTimer()
{ {
m_reconnectTimer.setInterval(5000); m_reconnectTimer.setInterval(5000);
m_reconnectTimer.setSingleShot(true); m_reconnectTimer.setSingleShot(false);
connect(&m_reconnectTimer, &QTimer::timeout, this, [this](){ connect(&m_reconnectTimer, &QTimer::timeout, this, [this](){
if (!m_enabled) { if (!m_enabled) {
qCDebug(dcTunnelProxySocketServer()) << "Stopping reconnect timer. The server has been disabled.";
m_reconnectTimer.stop(); m_reconnectTimer.stop();
return; return;
} }
@ -433,8 +437,6 @@ void TunnelProxySocketServer::cleanUp()
m_remoteProxyServerVersion.clear(); m_remoteProxyServerVersion.clear();
m_remoteProxyApiVersion.clear(); m_remoteProxyApiVersion.clear();
m_enabled = false;
setState(StateDisconnected); setState(StateDisconnected);
} }