proxylight/src/proxyserver.cpp

64 lines
2.7 KiB
C++

#include "proxyserver.h"
#include <QTextStream>
#include <QTcpSocket>
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();
});
}