Russian Qt Forum
Ноябрь 23, 2024, 17:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прокся не разрывает коннект  (Прочитано 6182 раз)
johnpion
Гость
« : Август 09, 2012, 15:09 »

Пишу проксю. Если выводить в дебаг, то видно, что данные на inSocket идут, но браузер ничего не отображает, пока не закрыть программу. Для работы указаваю прокси 127.0.0.1:8080

proxy.pro
Код:
QT       += 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);
}
Записан
mutineer
Гость
« Ответ #1 : Август 09, 2012, 15:30 »

попробуй делать flush() сокету
Записан
johnpion
Гость
« Ответ #2 : Август 09, 2012, 16:41 »

когда?
Записан
mutineer
Гость
« Ответ #3 : Август 09, 2012, 16:43 »

После записи в сокет
Записан
johnpion
Гость
« Ответ #4 : Август 09, 2012, 16:51 »

не помогает. Я редактирую код здесь. Можете посмотреть?
https://github.com/johnpion/delta3-tests/tree/proxy
Записан
mutineer
Гость
« Ответ #5 : Август 09, 2012, 17:06 »

Не знаю тогда что может быть причиной. Вроде была похожая тема на форуме, поищи
Записан
johnpion
Гость
« Ответ #6 : Август 09, 2012, 17:11 »

сейчас работает если сбрасываю в буфер по мере чтения и при диссконектте вываливаю в сокет.
Ищу
Записан
alexis031182
Гость
« Ответ #7 : Август 09, 2012, 17:22 »

После записи данных в сокет, нужно дождаться сигнала о количестве фактически отправленных данных (bytesWritten). Только после этого отправлять новую порцию данных. Браузер создаёт сразу кучу соединений на страницу. Там могут грузиться и картинки, и css вместе с js файлами. Объём может быть большой.
Записан
johnpion
Гость
« Ответ #8 : Сентябрь 08, 2012, 17:18 »

Пытаюсь прикрутить потоки. Хорошая ли это идея?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.124 секунд. Запросов: 21.