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

Опыта написания http клиентов и серверов нет, может, это нормально?
...
Рейтинг: 0 / 0
09.04.2021, 19:16
    #40061169
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
Клиент посылает 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
09.04.2021, 19:35
    #40061179
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
Извинения, код сервера чуть подправлен:
Код: 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
09.04.2021, 19:52
    #40061187
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
может там еще какие таймауты влияют

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

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

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

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

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

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

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

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

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


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

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

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

Тогда хрень какая-то. Ответ должен приходить со скоростью пинга.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.04.2021, 02:39
    #40061302
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
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
10.04.2021, 04:06
    #40061304
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
В общем, это я тормоз. Клиент должен коннектиться не localhost, а к 127.0.0.1, тогда не будет задержки при коннекте.
Или серверу следует указывать привязку не к "0.0.0.0", а к "::". Тогда пофиг, что клиент будет указывать при коннекте - localhost, 127.0.0.1 или сетевое имя компьютера.
Что-то связано с ipv4/ipv6, завтра разберусь. Спать пошел.
...
Рейтинг: 0 / 0
10.04.2021, 09:10
    #40061311
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
это виноват "местный" dns, разрешение имен, частая сетевая проблема
...
Рейтинг: 0 / 0
10.04.2021, 12:32
    #40061327
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
Не DNS, а hosts в данном случае. Он ресольвит localhost в два адреса - IPv6 и IРv4. По умолчанию IPv6 имеет приоритет и клиент пытается использовать его. Кривая библиотека: достаточно умная чтобы использовать IPv6, но недостаточно умная для коннекта сразу на все полученные адреса.
...
Рейтинг: 0 / 0
10.04.2021, 13:07
    #40061331
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
hosts и есть "местный" локальный ДНС
...
Рейтинг: 0 / 0
13.04.2021, 14:59
    #40062084
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
Сокет (клиентский и серверный) создается в 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
13.04.2021, 15:13
    #40062092
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
ъъъъъ,
Угу.
Большинство ПО прописывают что вырубать ipv6 и не парятся по этому поводу.
...
Рейтинг: 0 / 0
13.04.2021, 15:17
    #40062097
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
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
13.04.2021, 15:21
    #40062101
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
httplib: скорость клиент-серверного обмена (HTTP 1.1)
ъъъъъклиент создает сокет ipv6, который лезет к серверу ipv4, обламывается через 2 секунды,
берет следующий addrinfo с ipv4, получает правильный коннект.

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

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

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

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

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


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