#include "proxyserver.h" #include #include ProxyServer::ProxyServer(int localPort, int remotePort, const QString &remoteHost, const QString &serverName, const QString &serverBind) { QHostAddress bindAddress = QHostAddress::LocalHost; if (!serverBind.isEmpty()) { if (serverBind == "::0.0.0.0") { bindAddress = QHostAddress::Any; } else if (serverBind == "0.0.0.0") { bindAddress = QHostAddress::AnyIPv4; } else if (serverBind == "::0") { bindAddress = QHostAddress::AnyIPv6; } else { if (!bindAddress.setAddress(serverBind)) return; } } listen(bindAddress, localPort); p_remotePort = remotePort; p_remoteHost = remoteHost; p_serverName = serverName; } void ProxyServer::incomingConnection(qintptr socketDescriptor) { QTcpSocket *motherSocket = new QTcpSocket(this); motherSocket->setSocketDescriptor(socketDescriptor); motherSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); motherSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); QTextStream(stderr) << p_serverName << ": " << motherSocket->peerAddress().toString() << " incoming connected!" << Qt::endl; QTcpSocket *childSocket = new QTcpSocket(this); childSocket->connectToHost(p_remoteHost, p_remotePort); childSocket->setSocketOption(QAbstractSocket::LowDelayOption, 1); childSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); QTextStream(stderr) << p_serverName << ": " << p_remoteHost << " outgoing connecting..." << Qt::endl; QObject::connect(motherSocket, &QTcpSocket::readyRead, this, [=](){ childSocket->write(motherSocket->readAll()); }); QObject::connect(motherSocket, &QTcpSocket::disconnected, this, [=](){ QTextStream(stderr) << p_serverName << ": " << motherSocket->peerAddress().toString() << " incoming disconnected!" << Qt::endl; childSocket->disconnectFromHost(); motherSocket->deleteLater(); }); QObject::connect(childSocket, &QTcpSocket::connected, this, [=](){ QTextStream(stderr) << p_serverName << ": " << childSocket->peerAddress().toString() << " outgoing connected!" << Qt::endl; }); QObject::connect(childSocket, &QTcpSocket::readyRead, this, [=](){ motherSocket->write(childSocket->readAll()); }); QObject::connect(childSocket, &QTcpSocket::disconnected, this, [=](){ QTextStream(stderr) << p_serverName << ": " << childSocket->peerAddress().toString() << " outgoing disconnected!" << Qt::endl; motherSocket->disconnectFromHost(); childSocket->deleteLater(); }); }