void ExitTunnel::TcpCreateProxy(QSharedPointer<Packet> packet) { TcpStartPacket *sp = dynamic_cast<TcpStartPacket*>(packet.data()); if(!sp) return; QTcpSocket* socket = new QTcpSocket(this); socket->setProxy(_exit_proxy); // Check the verification key if(!_table.SaveConnection(socket, sp->GetConnectionId(), sp->GetVerificationKey())) return; _tcp_buffers[socket] = QByteArray(); connect(socket, SIGNAL(readyRead()), this, SLOT(TcpReadFromProxy())); connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(TcpProxyStateChanged(QAbstractSocket::SocketState))); connect(socket, SIGNAL(disconnected()), this, SLOT(DiscardProxy())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(HandleError(QAbstractSocket::SocketError))); qDebug() << "SOCKS Creating connection" << sp->GetConnectionId(); bool proxy_does_lookups = (socket->proxy().capabilities() & QNetworkProxy::HostNameLookupCapability); qDebug() << "Direct" << proxy_does_lookups; if(sp->GetHostName().IsHostName()) { if(proxy_does_lookups) { // Connect directly to hostname qDebug() << "SOCKS ConnectToHost Direct" << sp->GetHostName().GetName() << ":" << sp->GetHostName().GetPort() << (sp->GetHostName().IsHostName() ? "DNS" : "Address"); socket->connectToHost(sp->GetHostName().GetName(), sp->GetHostName().GetPort()); } else { // Resolve hostname, then connect to IP address qDebug() << "SOCKS Hostname" << sp->GetHostName().GetName(); int lookup_id = QHostInfo::lookupHost(sp->GetHostName().GetName(), this, SLOT(TcpDnsLookupFinished(const QHostInfo &))); TcpPendingDnsData dns_data = {socket, sp->GetHostName().GetPort()}; _tcp_pending_dns[lookup_id] = dns_data; } } else {