Название: Прокся не разрывает коннект
Отправлено: johnpion от Август 09, 2012, 15:09
Пишу проксю. Если выводить в дебаг, то видно, что данные на inSocket идут, но браузер ничего не отображает, пока не закрыть программу. Для работы указаваю прокси 127.0.0.1:8080 proxy.proQT += core network
QT -= gui
TARGET = proxy
CONFIG += console CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \ proxy.cpp
HEADERS += \ proxy.h main.cpp#include <QCoreApplication> #include "proxy.h"
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Proxy proxy;
return a.exec(); }
proxy.h#pragma once
#include <QObject>
class QTcpSocket; class QTcpServer;
class Proxy : public QObject { Q_OBJECT public: explicit Proxy(QObject *parent = 0); private: QTcpServer *srv; QTcpSocket *outSocket; QTcpSocket *inSocket; QByteArray inData; QByteArray outData; QString host; QString getHost(const QByteArray &data); private slots: void slotSrvNewConnection(); void slotInSocketRead(); void slotOutSocketRead(); void slotOutSocketConnected(); };
proxy.cpp#include <QDebug> #include <QTcpSocket> #include <QTcpServer> #include <QRegExp> #include "proxy.h"
Proxy::Proxy(QObject *parent) { srv = new QTcpServer;
outSocket = new QTcpSocket;
connect(srv, SIGNAL(newConnection()), SLOT(slotSrvNewConnection())); connect(outSocket, SIGNAL(readyRead()), SLOT(slotOutSocketRead())); connect(outSocket, SIGNAL(connected()), SLOT(slotOutSocketConnected()));
srv->listen(QHostAddress::LocalHost, 8080); }
QString Proxy::getHost(const QByteArray &data) { QString str = data.data();
QRegExp rx("host: ([A-Za-z0-9\\.\\-]+)");
if (rx.indexIn(str.toLower()) != 1) host = rx.cap(1);
return host; }
void Proxy::slotSrvNewConnection() { qDebug() << "-------------------------------"; qDebug() << Q_FUNC_INFO;
inSocket = srv->nextPendingConnection();
connect(inSocket, SIGNAL(readyRead()), SLOT(slotInSocketRead())); }
void Proxy::slotOutSocketConnected() { qDebug() << "-------------------------------"; qDebug() << host << Q_FUNC_INFO;
outSocket->write(outData); }
void Proxy::slotOutSocketRead() { qDebug() << "-------------------------------"; qDebug() << host << Q_FUNC_INFO;
inData = outSocket->readAll(); inSocket->write(inData); }
void Proxy::slotInSocketRead() { qDebug() << "-------------------------------"; qDebug() << Q_FUNC_INFO;
outData = inSocket->readAll();
if (outSocket->state() != QAbstractSocket::UnconnectedState){ outSocket->disconnectFromHost(); }
outSocket->connectToHost(getHost(outData), 80); }
Название: Re: Прокся не разрывает коннект
Отправлено: mutineer от Август 09, 2012, 15:30
попробуй делать flush() сокету
Название: Re: Прокся не разрывает коннект
Отправлено: johnpion от Август 09, 2012, 16:41
когда?
Название: Re: Прокся не разрывает коннект
Отправлено: mutineer от Август 09, 2012, 16:43
После записи в сокет
Название: Re: Прокся не разрывает коннект
Отправлено: johnpion от Август 09, 2012, 16:51
не помогает. Я редактирую код здесь. Можете посмотреть? https://github.com/johnpion/delta3-tests/tree/proxy (https://github.com/johnpion/delta3-tests/tree/proxy)
Название: Re: Прокся не разрывает коннект
Отправлено: mutineer от Август 09, 2012, 17:06
Не знаю тогда что может быть причиной. Вроде была похожая тема на форуме, поищи
Название: Re: Прокся не разрывает коннект
Отправлено: johnpion от Август 09, 2012, 17:11
сейчас работает если сбрасываю в буфер по мере чтения и при диссконектте вываливаю в сокет. Ищу
Название: Re: Прокся не разрывает коннект
Отправлено: alexis031182 от Август 09, 2012, 17:22
После записи данных в сокет, нужно дождаться сигнала о количестве фактически отправленных данных (bytesWritten). Только после этого отправлять новую порцию данных. Браузер создаёт сразу кучу соединений на страницу. Там могут грузиться и картинки, и css вместе с js файлами. Объём может быть большой.
Название: Re: Прокся не разрывает коннект
Отправлено: johnpion от Сентябрь 08, 2012, 17:18
Пытаюсь прикрутить потоки. Хорошая ли это идея?
|