powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / httplib: скорость клиент-серверного обмена (HTTP 1.1)
25 сообщений из 94, страница 1 из 4
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061166
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь сделать простенький HTTP сервер с использованием библиотеки httplib .
Смущает скорость обмена: если "всё по умолчанию", то примерно один запрос GET в одну-две секунды.
Если клиент включает keep-alive, то скорость возрастает до 2 запросов в секунду. Что также удручает.

Опыта написания http клиентов и серверов нет, может, это нормально?
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061169
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Клиент посылает GET - запросы вида /id=число, например:
Код: plaintext
1.
/id=123


Сервер возвращает ответы вида
Код: plaintext
1.
Echo 123

.

Код сервера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include <httplib.h>
namespace htl = httplib;

int main()
{
	htl::Server srv;
	srv.Get("/id=(d+)", [](const htl::Request& req, htl::Response& res) {
		auto param = req.matches[1];
		auto result = "Echo " + param.str();
		res.set_content(result, "text/plain");
	});
	srv.listen("0.0.0.0", 8080);
}
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061179
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извинения, код сервера чуть подправлен:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <httplib.h>

namespace htl = httplib;

int main()
{
	htl::Server srv;
	srv.Get(R"(/id=(\d+))", [](const htl::Request& req, htl::Response& res) {
		auto param = req.matches[1];
		auto result = "Echo " + param.str();
		res.set_content(result, "text/plain");
	});
	srv.listen("0.0.0.0", 8080);
}


Код клиента:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <httplib.h>
#include <ctime>

namespace htl = httplib;

int main()
{
	htl::Client cli("localhost", 8080);

//	cli.set_keep_alive(true); // Если установить - будет быстрее
	
	time_t my_time = time(NULL);
	printf("%s", ctime(&my_time));

	for (auto i = 0; i < 10; i++) {
		std::string req = "/id=1";// +std::to_string(i);
		auto res = cli.Get(req.c_str());
	}

	my_time = time(NULL);
	printf("%s", ctime(&my_time));

}
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061187
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может там еще какие таймауты влияют

c set_keep_alive(true) конечно будет быстрее, сейчас в броузерах это по дефолту имхо

set_keep_alive_max_count выставь (черт знает сколько, 5-10 допустим)

надо все Сеттеры смотреть, что они делают
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061209
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,

да. Увеличение set_keep_alive_max_count увеличивает скорость.
Запросто можно и 500 (и выше) сообщений в секунду получить.
Но - вот беда: первое сообщение хоть убей 2 секунды. Т.е., время коннекта.
Т.обр., нужно учесть характер данных и алгоритм обмена.

Огромное спасибо.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061210
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
Т.е., время коннекта.

Радует, что "тормоза" - на стороне клиента. Т.е., праллельные коннекты сервер почти не замедляют.
Спасибо ещё раз.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061227
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъСмущает скорость обмена: если "всё по умолчанию", то примерно один запрос GET в одну-две
секунды.

Кто клиент и какой протокол? Если браузер без явного указания префикса протокола, то он
пробует щемиться по https сначала и только если не вышло - переключается на http. А если у
тебя https, то там безумный handshake с проверкой сертификатов и обращением к 100500
центрам сертификации перед началом собственно обмена.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061233
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

клиент - тоже я (см. код 22306718 ). :)

Протокол HTTP 1.1, не использую никаких SSL/TLS.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061237
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ, используй пул из нескольких соединений.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061239
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
ъъъъъ, используй пул из нескольких соединений.


Э... клиент должен быть с сервером постоянно на связи? Если да, то, наверное, никак. Да и не особо нужно.

Задержка при коннекте на стороне клиента не особо важна. Я сперва подумал, что это сервер тормозит, сие было бы грустно: например, с утра десятки тысяч клиентов лезут к серверу, это скорее сдохнешь, чем результат получишь...
А так - нормально, торможение в момент коннекта фактически только на клиенте.
Результаты удовлетворительны, если что - буду копать глубже.
Спасибо.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061256
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем проблема? Пул объектов - нормальный порождающий шаблон проектирования.
Он тут как раз подходит. Можно его наделить логикой idle_timeout когда созданные соединения
после часа простоя - отключаются. Тогда не нужна постоянная связь.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061262
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
А в чем проблема?

Да по логике не нужно. Предполагается, что при старте любого "бизнес-приложения" нашего программного комплекса будет стартовать крошечное приложение - этот самый http-клиент, проверяющий наличие обновлений.
Приложение будет работать параллельно (проверка наличия обновлений и, если нужно, загрузка), даже когда "бизнес-приложение" завершит работу. То есть, если потратится лишние 2 сек на первоначальный коннект - это вовсе не беда. И даже если связи не будет совсем - тоже не беда, потом скачают, или курьера (как сейчас) пошлют. Я боялся, что затык сервера будет, так как таких клиентов довольно много.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061280
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъклиент - тоже я (см. код 22306718
Протокол HTTP 1.1, не использую никаких SSL/TLS.

Тогда хрень какая-то. Ответ должен приходить со скоростью пинга.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061302
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
ъъъъъклиент - тоже я (см. код 22306718
Протокол HTTP 1.1, не использую никаких SSL/TLS.

Тогда хрень какая-то. Ответ должен приходить со скоростью пинга.
Да. Если на сервере вместо
Код: plaintext
1.
	srv.listen("0.0.0.0", 8080);


задать
Код: plaintext
1.
	srv.listen("localhost", 8080);


или сетевое имя компьютера - то всё очень-очень быстро.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061304
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, это я тормоз. Клиент должен коннектиться не localhost, а к 127.0.0.1, тогда не будет задержки при коннекте.
Или серверу следует указывать привязку не к "0.0.0.0", а к "::". Тогда пофиг, что клиент будет указывать при коннекте - localhost, 127.0.0.1 или сетевое имя компьютера.
Что-то связано с ipv4/ipv6, завтра разберусь. Спать пошел.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061311
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это виноват "местный" dns, разрешение имен, частая сетевая проблема
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061327
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не DNS, а hosts в данном случае. Он ресольвит localhost в два адреса - IPv6 и IРv4. По умолчанию IPv6 имеет приоритет и клиент пытается использовать его. Кривая библиотека: достаточно умная чтобы использовать IPv6, но недостаточно умная для коннекта сразу на все полученные адреса.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40061331
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hosts и есть "местный" локальный ДНС
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40062084
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сокет (клиентский и серверный) создается в https://github.com/yhirose/cpp-httplib/blob/master/httplib.h#L2061
В клиенте функция getaddrinfo() (коннект к "localhost") возвращает список addrinfo структур, в которых addrinfo с протоколом ipv6 идут первыми, а затем иду ipv4. А в сервере (бинд к "0.0.0.0") формируется список только из addrinfo с ipv4.
Таким образом, клиент создает сокет ipv6, который лезет к серверу ipv4, обламывается через 2 секунды, берет следующий addrinfo с ipv4, получает правильный коннект. Если сервер биндится в "::", то в итоге он будет "висеть" на сокете ipv6 (все та же getaddrinfo()).
...
Если в https://github.com/yhirose/cpp-httplib/blob/master/httplib.h#L2069 задать хинт, вместо
Код: plaintext
1.
  hints.ai_family = AF_UNSPEC;


задать, например,
Код: plaintext
1.
  hints.ai_family = AF_INET;


то и клиент и сервер будет работать по ipv4.

Или в настройках ОС клиента изменить порядок приоритета, задав ipv4 более приоритетным:
В HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters создать/задать переменную DisabledComponents со значением 20 (hex).
Подробности: https://docs.microsoft.com/en-US/troubleshoot/windows-server/networking/configure-ipv6-in-windows.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40062092
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,
Угу.
Большинство ПО прописывают что вырубать ipv6 и не парятся по этому поводу.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40062097
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

MSDNInternet Protocol version 6 (IPv6) is a mandatory part of Windows Vista and Windows Server 2008 and newer versions. We do not recommend that you disable IPv6 or its components. If you do, some Windows components may not function.

We recommend using Prefer IPv4 over IPv6 in prefix policies instead of disabling IPV6.

Кто я такой, чтобы идти против MS-Soft.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40062101
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъклиент создает сокет ipv6, который лезет к серверу ipv4, обламывается через 2 секунды,
берет следующий addrinfo с ipv4, получает правильный коннект.

Вот именно поэтому правильные клиенты создают сокеты сразу для всех полученных addrinfo,
коннектятся в неблокирующем режиме и используют тот сокет, который сумел успешно
подключиться раньше остальных. Остальные можно либо пристрелить, либо отправить в пул для
последующего повторного использования.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40062106
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
ъъъъъклиент создает сокет ipv6, который лезет к серверу ipv4, обламывается через 2 секунды,
берет следующий addrinfo с ipv4, получает правильный коннект.

Вот именно поэтому правильные клиенты создают сокеты сразу для всех полученных addrinfo,
коннектятся в неблокирующем режиме и используют тот сокет, который сумел успешно
подключиться раньше остальных. Остальные можно либо пристрелить, либо отправить в пул для
последующего повторного использования.
Да, библиотека https://github.com/yhirose/cpp-httplib - "блокирующая".

Ну, в плане создания клиентского сокета, думаю, можно чуток и подшаманить.
Спасибо.
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40062108
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъДа, библиотека https://github.com/yhirose/cpp-httplib - "блокирующая".

Это сугубо всё равно. Блокирующей библиотеке никто не запрещает использовать неблокирующие
сокеты с select/poll/и т.п.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
httplib: скорость клиент-серверного обмена (HTTP 1.1)
    #40062121
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

да.
...
Рейтинг: 0 / 0
25 сообщений из 94, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / httplib: скорость клиент-серверного обмена (HTTP 1.1)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]