Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 30
1

keep-alive в Qt

21.12.2013, 19:37. Просмотров 2737. Ответов 9
Метки нет (Все метки)


Нарыл код простейшего однопоточного http-сервера.

main:
C++ (Qt)
1
2
3
4
5
6
7
8
#include <QCoreApplication>
#include <qserver.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QServer server;
    return a.exec();
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "qsimpleserver.h"
 
QSimpleServer::QSimpleServer(QObject *parent) :
    QTcpServer(parent)
{
    //Запуск сервера на прослушивание на порту 80
    if(listen(QHostAddress::Any, 80)){
        qDebug() << "Listening...";
    }
    else {
        qDebug() << "Error while starting: " << errorString();
    }
}
 
void QSimpleServer::incomingConnection(int handle)
{
    qDebug() << "connected!!!";
    //Создание объекта сокета
    QTcpSocket* socket = new QTcpSocket();
    //Сопоставление объекта сокета с системным сокетом по дескриптору
    socket->setSocketDescriptor(handle);
    //Соединение сигналов сокета с одноименными слотами
    connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    connect(socket, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
}
 
void QSimpleServer::onReadyRead()
{
    //Получение указателя на слот, испустивший сигнал
    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
    //Чтение и вывод информации из сокета
    QString string = socket->readAll();
 
    qDebug() << string;
 
    //Генерация ответа сервера
    QString response =   "HTTP/1.1 200 OK\r\nContent-Language: ru\r\nConnection: Keep-Alive\r\n\r\nWorks?";
    //Запись ответа сервера в сокет
    socket->write(response.toLatin1());
    //Отсоединение сокета
    socket->disconnectFromHost();
}
 
void QSimpleServer::onDisconnected()
{
    qDebug() << "disconnect!!!";
    //Получение указателя на слот, испстивший сигнал
    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
    //Закрытие сокета
    socket->close();
    //Метод отсроченного удаления объекта
    socket->deleteLater();
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef QSIMPLESERVER_H
#define QSIMPLESERVER_H
 
//Подключение используемых в коде классов
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
#include <QDateTime>
 
//Пользовательский класс сервера
class QSimpleServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit QSimpleServer(QObject *parent = 0);
 
    //Метод, вызываемый при появлении нового соединения,
    //который необходимо переопределить
    void incomingConnection(int handle);
signals:
 
public slots:
    //Слот обмена информации через сокет
    void onReadyRead();
    //Слот закрывающий сокет
    void onDisconnected();
};
 
#endif // QSIMPLESERVER_H
Бился дофига времени, чтобы при отправке ответа клиент не отключался от сервера.
Сначала удалил ***** строчку socket->disconnectFromHost(), но гребаный браузер почему-то ПРОДОЛЖАЛ ГРУЗИТЬ (простите за капс). Пытался делать еще несколько манипуляций, прописывал connection: keep-alive... В итоге я в очередной раз зашел попросить мудрого сенсея ответить мне, недопрограммисту, как организовать этот ацкий keep-alive.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2013, 19:37
Ответы с готовыми решениями:

It is alive!
Как?! Как это может быть?! #include &lt;iostream&gt; int main () { int i = 4; char c = i; ...

Stayin’ Alive
Долго думала, куда написать: в форум о здоровье или в форум о музыке... Решила всё-таки в здоровье...

HTTP GET-запрос и keep-alive
Есть HTTP keep-alive соединение. Через него надо сделать серию GET-запросов. Со стороны клиента это...

Keep-Alive соединение и Cookie
Доброго времени суток, товарищи программисты. Столкнулся с такой вот ситуацией: При попытке...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
9
Ушел с форума
Эксперт С++
16419 / 7394 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
21.12.2013, 19:53 2
В HTTP 1.1 keep-alive является поведением по умолчанию (в отличие от HTTP 1.0),
поэтому заголовок "Connection: keep-alive" указывать не обязательно.

Попробуйте добавить в ответ сервера заголовок Content-Length с указанием длины.

А вообще, учиться писать клиент-серверы лучше начинать с "голых" сокетов,
не пользуясь Qt и прочими компонентами, это дает лучшее понимание.
1
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 30
21.12.2013, 19:57  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
В HTTP 1.1 keep-alive является поведением по умолчанию (в отличие от HTTP 1.0),
поэтому заголовок "Connection: keep-alive" указывать не обязательно.

Попробуйте добавить в ответ сервера заголовок Content-Length с указанием длины.

А вообще, учиться писать клиент-серверы лучше начинать с "голых" сокетов,
не пользуясь Qt и прочими компонентами, это дает лучшее понимание.
Вау, нига, брат, спасибо!!!. У, поехал писать многопоточность!!! Да здравствуют сайты с нуля!!! Пошел апачи с пхп на фиг!!!
0
Ушел с форума
Эксперт С++
16419 / 7394 / 1185
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
21.12.2013, 20:07 4
Вдогонку.

Цитата Сообщение от MBoY4ik Посмотреть сообщение
QString string = socket->readAll();
Что будет, если readAll вернет не весь HTTP-запрос, который отправил браузер ?
А будет вот что: клиентский поток будет ожидать возврата из функции send, а
сервер в это время будет пытаться отправить клиенту ответ. Но поскольку свой
запрос клиент еще не записал в сокет и не вызвал recv, все в итоге повиснет.

Но это еще не все. Браузеры частенько создают по два соединения к одному серверу,
причем одно соединение могут использовать весьма интенсивно, а второе держать
наготове и время от времени закачивать через него всякие ресурсы - картинки,
скрипты, favicon и т.д. Поэтому даже однопоточный HTTP-сервер должен уметь
работать с несколькими входящими соединениями.

Цитата Сообщение от MBoY4ik Посмотреть сообщение
Вау, нига, брат, спасибо!!!. У, поехал писать многопоточность!!! Да здравствуют сайты с нуля!!! Пошел апачи с пхп на фиг!!!
Если это была ирония, то замечу, что на php и apache свет клином
не сходится и есть очень много задач, где требуется именно такое,
на самых "басовых нотах", программирование.
0
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 30
23.12.2013, 21:10  [ТС] 5
Убежденный, Уже переделано в многопоточный. Кстати, есть ли какие-нибудь библиотеки под cpp для создания http серверов. Просто очень уж стремно все с нуля фигачить. Не могу разобраться с передачей того же favicon.ico.
0
1440 / 1321 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
25.12.2013, 10:49 6
Цитата Сообщение от MBoY4ik Посмотреть сообщение
Кстати, есть ли какие-нибудь библиотеки под cpp для создания http серверов.
boost::asio, poco c++.
Единственно не знаю как с асинхронностью у poco.
1
Почетный модератор
11172 / 4129 / 412
Регистрация: 12.06.2008
Сообщений: 11,971
25.12.2013, 13:47 7
Dmitriy_M, посмотрел пример и не заметил там готовой библиотеки для http-сервера. Возникло впечатление, что там тоже велосипед делается из обычной работы с сокетами. Возможно, я плохо смотрел.
0
1440 / 1321 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
25.12.2013, 14:04 8
Цитата Сообщение от Humanoid Посмотреть сообщение
готовой библиотеки для http-сервера.
Что именно смотрели boost::asio или poco?
В Poco есть готовый класс предоставляющий многопоточный http сервер.
Asio же включает множество различных классов, для написания различных моделей серверов.
0
Почетный модератор
11172 / 4129 / 412
Регистрация: 12.06.2008
Сообщений: 11,971
26.12.2013, 08:06 9
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Asio же включает множество различных классов, для написания различных моделей серверов.
В http самая большая работа - это распарсить запрос и учесть большое количество различных вариантов. В том примере, который видел, там они вручную запрос рапсили.
А про poco не посмотрел... спасибо за наводку. Тоже пишу маленький http-сервер для собственных нужд, поэтому хочу посмотреть общую идею, как там всё устроено.

Лично я пришёл к мнению что многопоточный сервер на Qt не нужен. Многопоточным может быть приложение, которое отвечает на запросы. Именно это приложение может создавать задержки и поэтому один поток не должен мешать другому. А сам сервер пусть только запросы парсит и отправляет сигналы наружу класса для обработки. Сокеты и так асинхронные, поэтому внутри класса сервера они мешать друг другу не должны.
0
1440 / 1321 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
26.12.2013, 10:49 10
Цитата Сообщение от Humanoid Посмотреть сообщение
В http самая большая работа - это распарсить запрос и учесть большое количество различных вариантов.
Да не такая уж и проблема. HTTP довольно таки прост. Можно самому написать, можно взять что-нибудь из готовых.
Цитата Сообщение от Humanoid Посмотреть сообщение
Сокеты и так асинхронные
Асинхронные, однако попробуй к ним прикрутить libevent/libuv.
Цитата Сообщение от Humanoid Посмотреть сообщение
поэтому хочу посмотреть общую идею, как там всё устроено.
тут лучше читать исходники Libmicrohttpd и его список Alternatives.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2013, 10:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

HttpClient не работает Keep-Alive
Всем привет. Для запросов использую следующий метод: using (var client = new...

wiznet vs keep alive, как это работает???
Здравствуйте, заранее извиняюсь если тема не в той ветке или уже обсуждалась. ( но я никак не могу...

Http 2.0 мультиплексирование и http 1.1 keep-alive
Здравствуйте, Подскажите пожалуйста, иультиплекмироаание в http 2.0 и keep-alive в http 1.1 это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.