64 lines
2.7 KiB
C++
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();
|
|
});
|
|
}
|