Improve XRay protocol process close (#1318)

This commit is contained in:
Mykola Baibuz 2025-01-07 06:52:10 -08:00 committed by GitHub
parent e7fa160c9c
commit 767b14b37a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 27 deletions

View file

@ -1,7 +1,6 @@
#include "xrayprotocol.h" #include "xrayprotocol.h"
#include "utilities.h" #include "utilities.h"
#include "containers/containers_defs.h"
#include "core/networkUtilities.h" #include "core/networkUtilities.h"
#include <QCryptographicHash> #include <QCryptographicHash>
@ -22,9 +21,8 @@ XrayProtocol::XrayProtocol(const QJsonObject &configuration, QObject *parent):
XrayProtocol::~XrayProtocol() XrayProtocol::~XrayProtocol()
{ {
qDebug() << "XrayProtocol::~XrayProtocol()";
XrayProtocol::stop(); XrayProtocol::stop();
QThread::msleep(200);
m_xrayProcess.close();
} }
ErrorCode XrayProtocol::start() ErrorCode XrayProtocol::start()
@ -36,10 +34,6 @@ ErrorCode XrayProtocol::start()
return lastError(); return lastError();
} }
if (Utils::processIsRunning(Utils::executable(xrayExecPath(), true))) {
Utils::killProcessByName(Utils::executable(xrayExecPath(), true));
}
#ifdef QT_DEBUG #ifdef QT_DEBUG
m_xrayCfgFile.setAutoRemove(false); m_xrayCfgFile.setAutoRemove(false);
#endif #endif
@ -54,9 +48,16 @@ ErrorCode XrayProtocol::start()
qDebug().noquote() << "XrayProtocol::start()" qDebug().noquote() << "XrayProtocol::start()"
<< xrayExecPath() << args.join(" "); << xrayExecPath() << args.join(" ");
m_xrayProcess.setProcessChannelMode(QProcess::MergedChannels);
m_xrayProcess.setProcessChannelMode(QProcess::MergedChannels);
m_xrayProcess.setProgram(xrayExecPath()); m_xrayProcess.setProgram(xrayExecPath());
if (Utils::processIsRunning(Utils::executable("xray", false))) {
qDebug().noquote() << "kill previos xray";
Utils::killProcessByName(Utils::executable("xray", false));
}
m_xrayProcess.setArguments(args); m_xrayProcess.setArguments(args);
connect(&m_xrayProcess, &QProcess::readyReadStandardOutput, this, [this]() { connect(&m_xrayProcess, &QProcess::readyReadStandardOutput, this, [this]() {
@ -68,13 +69,9 @@ ErrorCode XrayProtocol::start()
connect(&m_xrayProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) { connect(&m_xrayProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) {
qDebug().noquote() << "XrayProtocol finished, exitCode, exitStatus" << exitCode << exitStatus; qDebug().noquote() << "XrayProtocol finished, exitCode, exitStatus" << exitCode << exitStatus;
setConnectionState(Vpn::ConnectionState::Disconnected); setConnectionState(Vpn::ConnectionState::Disconnected);
if (exitStatus != QProcess::NormalExit) { if ((exitStatus != QProcess::NormalExit) || (exitCode != 0)) {
emit protocolError(amnezia::ErrorCode::XrayExecutableCrashed); emit protocolError(amnezia::ErrorCode::XrayExecutableCrashed);
stop(); emit setConnectionState(Vpn::ConnectionState::Error);
}
if (exitCode != 0) {
emit protocolError(amnezia::ErrorCode::InternalError);
stop();
} }
}); });
@ -177,14 +174,14 @@ void XrayProtocol::stop()
IpcClient::Interface()->StartRoutingIpv6(); IpcClient::Interface()->StartRoutingIpv6();
#endif #endif
qDebug() << "XrayProtocol::stop()"; qDebug() << "XrayProtocol::stop()";
m_xrayProcess.terminate(); m_xrayProcess.disconnect();
m_xrayProcess.kill();
m_xrayProcess.waitForFinished(3000);
if (m_t2sProcess) { if (m_t2sProcess) {
m_t2sProcess->stop(); m_t2sProcess->stop();
} }
#ifdef Q_OS_WIN setConnectionState(Vpn::ConnectionState::Disconnected);
Utils::signalCtrl(m_xrayProcess.processId(), CTRL_C_EVENT);
#endif
} }
QString XrayProtocol::xrayExecPath() QString XrayProtocol::xrayExecPath()

View file

@ -11,7 +11,6 @@ IpcProcessTun2Socks::IpcProcessTun2Socks(QObject *parent) :
IpcProcessTun2SocksSource(parent), IpcProcessTun2SocksSource(parent),
m_t2sProcess(QSharedPointer<QProcess>(new QProcess())) m_t2sProcess(QSharedPointer<QProcess>(new QProcess()))
{ {
connect(m_t2sProcess.data(), &QProcess::stateChanged, this, &IpcProcessTun2Socks::stateChanged);
qDebug() << "IpcProcessTun2Socks::IpcProcessTun2Socks()"; qDebug() << "IpcProcessTun2Socks::IpcProcessTun2Socks()";
} }
@ -23,8 +22,10 @@ IpcProcessTun2Socks::~IpcProcessTun2Socks()
void IpcProcessTun2Socks::start() void IpcProcessTun2Socks::start()
{ {
connect(m_t2sProcess.data(), &QProcess::stateChanged, this, &IpcProcessTun2Socks::stateChanged);
qDebug() << "IpcProcessTun2Socks::start()"; qDebug() << "IpcProcessTun2Socks::start()";
m_t2sProcess->setProgram(amnezia::permittedProcessPath(static_cast<amnezia::PermittedProcess>(amnezia::PermittedProcess::Tun2Socks))); m_t2sProcess->setProgram(amnezia::permittedProcessPath(static_cast<amnezia::PermittedProcess>(amnezia::PermittedProcess::Tun2Socks)));
QString XrayConStr = "socks5://127.0.0.1:10808"; QString XrayConStr = "socks5://127.0.0.1:10808";
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -41,7 +42,11 @@ void IpcProcessTun2Socks::start()
m_t2sProcess->setArguments(arguments); m_t2sProcess->setArguments(arguments);
Utils::killProcessByName(m_t2sProcess->program()); if (Utils::processIsRunning(Utils::executable("tun2socks", false))) {
qDebug().noquote() << "kill previos tun2socks";
Utils::killProcessByName(Utils::executable("tun2socks", false));
}
m_t2sProcess->start(); m_t2sProcess->start();
connect(m_t2sProcess.data(), &QProcess::readyReadStandardOutput, this, [this]() { connect(m_t2sProcess.data(), &QProcess::readyReadStandardOutput, this, [this]() {
@ -54,12 +59,10 @@ void IpcProcessTun2Socks::start()
connect(m_t2sProcess.data(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) { connect(m_t2sProcess.data(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) {
qDebug().noquote() << "tun2socks finished, exitCode, exiStatus" << exitCode << exitStatus; qDebug().noquote() << "tun2socks finished, exitCode, exiStatus" << exitCode << exitStatus;
emit setConnectionState(Vpn::ConnectionState::Disconnected); emit setConnectionState(Vpn::ConnectionState::Disconnected);
if (exitStatus != QProcess::NormalExit){ if ((exitStatus != QProcess::NormalExit) || (exitCode != 0)) {
stop(); emit setConnectionState(Vpn::ConnectionState::Error);
}
if (exitCode !=0 ){
stop();
} }
}); });
m_t2sProcess->start(); m_t2sProcess->start();
@ -69,6 +72,8 @@ void IpcProcessTun2Socks::start()
void IpcProcessTun2Socks::stop() void IpcProcessTun2Socks::stop()
{ {
qDebug() << "IpcProcessTun2Socks::stop()"; qDebug() << "IpcProcessTun2Socks::stop()";
m_t2sProcess->close(); m_t2sProcess->disconnect();
m_t2sProcess->kill();
m_t2sProcess->waitForFinished(3000);
} }
#endif #endif