LINUX.ORG.RU

А HTTP запросы в C++?

 , , , ,


0

2

Подскажите, как сейчас модно работать с сетью на клиентах в C++? Future+корутины? Сложнее ли дебажить дефолтные c++20-корутины нежели обычные колбэки?

Я наделал воркер с curl_multi: берём запросы из очереди, состояние загрузки для UI обновляем атомиками, в конце коллбэк. В принципе терпимо, хоть и простое «скачать и распаковать» превращается в:

using AType = AssetsDL::Type;
template <AType ASSET_TYPE> //
struct AssetsCallbacks {
	static void set_asset_zip_ready_to_unpack(...);
	static void set_asset_unpacked_and_remove_zip(...);
	static void job_asset_unpack();
	static void on_zip_downloaded(...);
};

template <AType... Types> struct AssetsCallbacksTables {
	static constexpr auto on_zip_downloaded_table =
		  std::array{&AssetsCallbacks<Types>::on_zip_downloaded...};

	static constexpr auto job_asset_unpack_table =
		  std::array{&AssetsCallbacks<Types>::job_asset_unpack...};
};


using AssetsCbs =
	  AssetsCallbacksTables<AType::XAPIAN_TR, AType::OPTIONAL_XAPIAN_DE,
                            AType::OPTIONAL_TTS, AType::OPTIONAL_ASR>;

В моей, довольно простой ситуа, с коллбэками только одна проблема возникла: я перепутал порядок в шаблонных аргументах AssetsCallbacksTables и завяз на добрый час. Кроме ситуа1 «скачать+распаковать» мне требуется только ещё более простая ситуа ситуа2 «скачать в память и попарсить\подекодить немножк».

БЯМ пишет, что я рак и отдельный тред и атомики мне не нужны, а нужно звать curl_multi_perform на каждом кадре. БЯМ не знает, что у меня рендеринг по ивентам. Впрочем, бустить фпс на время запросов(+ троттлинг непосредственно рендеринга) и сильно упростить код — звучит неплохо!

Как бы вы сейчас писали подсистему сетевых запросов?

Как бы вы сейчас писали подсистему сетевых запросов?

Так, чтобы подсистема удовлетворяла систему и не делала ничего лишнего. Если есть возможность слать запросы синхронно, я бы слал синхронно. Ответы могут полежать в буфере сокета пока не появится время их разобрать. Если разбор ответов долгий и результат разбора нужен готовым к определенному моменту, городил асинхронщину на тредах и job queue

imatveev13 ★★
()
Ответ на: комментарий от imatveev13

Если есть возможность слать запросы синхронно, я бы слал синхронно.

Встаёт со стула.
Здравствуйте. Я свидетель HTTP-запросов, которые выполняются 15 минут.
Садится.

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

HTTP-запросов, которые выполняются 15 минут.

Выполняется т.е. приходит ответ? Ответа ждать не обязательно, сунул в сокет запрос, пошел заниматься своими делами. Освободился от дел, проверил есть ли в сокете ответ.

imatveev13 ★★
()
Ответ на: комментарий от imatveev13

Ответа ждать не обязательно

Обязательно. Потому что время выполнения запроса неизвестно. Нужна событийная модель, а не периодические проверки. С событийной моделью можно работать на скорости канала, если ответ пришёл сразу.

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Событийная модель не работает на скорости канала. А вот проверки как раз работают.

anonymous
()

Как бы вы сейчас писали подсистему сетевых запросов

А что именно делаешь? А то может что-то готовое взять и не изобретать велосипед?

peregrine ★★★★★
()

Как бы вы сейчас писали подсистему сетевых запросов?

взял бы готовый restful api фреймворк. А аутентификацию клиентов в nginx. Вот только не надо спрашивать, какие есть для C++ фреймворки, потому что я такого мнения, что в 21м веке хттп сервер на плюсах мастерить…

seiken ★★★★★
()
Ответ на: комментарий от anonymous

Чего?

[code] auto result = co_await get_send_request_future(params); [/code]

boost beast.

ради такой простой задачи тащить это bloatware?

В том числе и корутины не нужно будет прикручивать.

корутины нужны чтобы код был читаемым и без колбэк-лапши

Reset ★★★★★
()

Как бы вы сейчас писали подсистему сетевых запросов?

На rust.

anonymous
()
Ответ на: комментарий от Reset

co_await get_send_request_future

co_await уже «ждёт», future здесь не нужен. Это кстати о bloatware :)

ради такой простой задачи тащить это bloatware?

ради такой простой задачи тащить это bloatware(curl)? Ну и да, я удивляюсь каждый раз, каким образом ho цпп либа может быть блоат, а вот не хо сошка не блоат.

А так, я написал, почему boost - чтобы не прикручивать корутины. В boost они уже прикручены, в curl нет, очевидно.

anonymous
()
Ответ на: комментарий от anonymous

Мощный комбайн, конечно!

Но, кажется, совсем уж оверкил, если нужен только HTTP клиент. Я вижу, что многое отключается. Но userver/core/src содержит >90k LOC, и boost в зависимостях:

libabsl-dev libbenchmark-dev libboost-context1.83-dev libboost-coroutine1.83-dev libboost-filesystem1.83-dev libboost-iostreams1.83-dev libboost-locale1.83-dev libboost-program-options1.83-dev libboost-stacktrace1.83-dev libboost1.83-dev libbson-dev libbz2-dev libc-ares-dev libcctz-dev libcrypto++-dev libcurl4-openssl-dev libdouble-conversion-dev libev-dev libfmt-dev libgflags-dev libgmock-dev libgrpc++-dev libgrpc-dev libgtest-dev libhiredis-dev libidn11-dev libjemalloc-dev libjemalloc2 libkrb5-dev libldap2-dev liblz4-dev liblzma-dev libmariadb-dev libmongoc-dev libnghttp2-dev libpq-dev libprotoc-dev libpugixml-dev libsasl2-dev libsnappy-dev libsqlite3-dev librdkafka-dev libre2-dev librocksdb-dev libssh2-1-dev libssl-dev libxxhash-dev libyaml-cpp-dev libyaml-cpp0.8 libzstd-dev netbase ninja-build odbc-postgresql postgresql-server-dev-16 protobuf-compiler-grpc python3-dev python3-jinja2 python3-protobuf python3-venv python3-voluptuous python3-yaml ragel unixodbc-dev yasm zlib1g-dev 

Сколько эти шаблонные приколы будут пересобираться при изменении файлов с запросами — уж я не знаю…

UPD: Что-то не могу понять, это рядом к проекту можно вообще прикрутить и дергать только для выполнения запросов?

Нашел только такой пример клиента: https://userver.tech/d5/dce/samples_2websocket_client_2main_8cpp-example.html

BruteForce ★★★★
() автор топика
Последнее исправление: BruteForce (всего исправлений: 1)
Ответ на: комментарий от Reset

Вау, класс!

Поверх такого можно уже и накидать что-то. Я правильно понимаю, что loop.Step() надо звать в отдельном треде, никаких доптредов не создается?

P.S. При кликах на картинки с данными бенчей со страницы гитхаба (например https://github.com/resetius/coroio/blob/master/bench/bench_M1.png?raw=true) открывает страницу гитхаба с ошибкой Error loading page, помогает релоад или «открыть в нвоой вкладке». Firefox. (И график плохо читается.)

UPD: Ай-ой, а HTTP-клиеента-то, собсна, нету! А есть готовое поверх?

BruteForce ★★★★
() автор топика
Последнее исправление: BruteForce (всего исправлений: 2)
Ответ на: комментарий от imatveev13

Если есть возможность слать запросы синхронно, я бы слал синхронно.

Только если в отдельном треде — основной тред занят UI и синхронной работой с данными, на слабом устройстве и так может пробуксовывать (рендеринг текста бывает оч медленный :c), заставлять юзера ждать нового кадра 2 секунды пока соединение отвалится по таймауту не хочется)

городил асинхронщину на тредах и job queue

Ну вот я нагородил, причём поверх асинхронщины же (curl_multi), с коллбеками. Стал бы ты делать на колбеках или заворачивал корутинами? Были бы это крестовые корутины или что-то отдельно лежащее (меня интригует libaco, например)?

Мне кажется, поверх libcurl много городить чтобы корутины заиметь…

BruteForce ★★★★
() автор топика
Ответ на: комментарий от peregrine

Пока нужно достаточно простое HTTP-клиентское делать:

  • ситуа1: «скачать много+распаковать на диск»

  • ситуа2: «скачать немножк (2-50КБ, скажем) в память и попарсить\подекодить немножк»

готовое взять

Я взял libcurl(+boringssl), она звучит достаточно готовой. Но «дело делать» — всё равно надо что-то сверху. У БЯМ вот хороший совет даже, не писать практически ничего вокруг, но я (1) уже нагородил и потому инертен и (2) немного городить всё же придётся и поверх такого.

Тут вот userver предлагают, поверх которого городить шибко не надо будет, но это «готовое» если и можно прикрутить — явный оверкил, в 150+ раз оверкильнее моего оверкила.

BruteForce ★★★★
() автор топика
Ответ на: комментарий от seiken

Клиент нужен!

в 21м веке хттп сервер на плюсах мастерить

Я тоже. Тут хватит Си!

BruteForce ★★★★
() автор топика
Ответ на: комментарий от BruteForce

Ну не всё цирк, что не осилилось. Хотя после «Future+корутины» всё уже очевидно, но дело твоё.

anonymous
()

Лучше расскажи, что пилишь, а главное зачем, там просто такая солянка из платформ, и выбор стека прям очень необычный

void SDL_AppQuit(void *, SDL_AppResult)	save states time: 0 us klappt.js:1610:16
Application quit successfully! klappt.js:1610:16
Status code: 0 klappt.js:1610:16
Unhandled errors: 0 klappt.js:1610:16
program exited (with status: 0), but keepRuntimeAlive() is set (counter=0) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown) klappt.js:4849:12
GET
https://x6prl.github.io/klappt-web/
[HTTP/2 304  210ms]
GET
data:,

GET
https://x6prl.github.io/klappt-web/klappt.js
[HTTP/2 200  0ms]
XHR 
GET
https://x6prl.github.io/klappt-web/klappt.data
[HTTP/2 200  0ms]
XHR 
GET
https://x6prl.github.io/klappt-web/klappt.wasm
[HTTP/2 200  0ms]
SDL_AppInit	SDL_Init time: 0 us klappt.js:1610:16
SDL_AppInit	Tracy connect time: 0 us klappt.js:1610:16
SDL_AppInit	TTF_Init time: 0 us klappt.js:1610:16
SDL_AppInit	create window time: 0 us klappt.js:1610:16
SDL_AppInit	create renderer time: 16667 us klappt.js:1610:16
SDL_AppInit	load fonts time: 0 us klappt.js:1610:16
SDL_AppInit	create text engine time: 0 us klappt.js:1610:16
Window size: 2560x777 klappt.js:1610:16
Backbuffer size: 5120x1554 klappt.js:1610:16
This is a highdpi environment. klappt.js:1610:16
SDL_AppInit	create text cache time: 0 us klappt.js:1610:16
SDL_AppInit	create app context time: 33334 us klappt.js:1610:16
SDL_AppInit	ui clay init time: 0 us klappt.js:1610:16
SDL_AppInit	render loop setup time: 0 us klappt.js:1610:16
SDL_AppInit	load settings time: 0 us klappt.js:1610:16
SETTINGS INIT klappt.js:1610:16
SDL_AppInit	ui settings init time: 0 us klappt.js:1610:16
Application started successfully! klappt.js:1610:16
SDL_AppInit	total time: 0 us klappt.js:1610:16
SDL_AppIterate	 time: 50 ms klappt.js:1610:16
and average 0 us klappt.js:1610:16
SDL_AppIterate	 time: 16 ms klappt.js:1610:16
and average 1851 us klappt.js:1610:16
SDL_AppIterate	 time: 16 ms klappt.js:1610:16
and average 1388 us klappt.js:1610:16
SDL_AppIterate	 time: 16 ms klappt.js:1610:16
and average 1190 us klappt.js:1610:16
SDL_AppIterate	 time: 16 ms klappt.js:1610:16
and average 800 us klappt.js:1610:16
SDL_AppIterate	 time: 16 ms klappt.js:1610:16
and average 799 us

Klappt is a small vocabulary learning app built with C++23, SDL3, SDL_ttf, Clay UI, Xapian, and LMDB. You add words to a learning list and review them with spaced repetition. Learning modes progress from recognizing the whole answer to filling gaps, rebuilding chunks, and composing the answer.

P.S.: Я не смог даже выбрать язык, оно зависло

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous

co_await уже «ждёт», future здесь не нужен. Это кстати о bloatware :)

Ну, то есть, мне надо было написать «Future или корутины»? Или «Future/корутины»?

bloatware(curl)

Да, это правда! Ещё криптографию, кстати, эти либы вообще шиза. Хорошо, что многое можно отключить:

set(CURL_DISABLE_FTP ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_FILE ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_RTSP ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_DICT ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_TELNET ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_TFTP ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_POP3 ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_IMAP ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_SMB ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_SMTP ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_GOPHER ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_MQTT ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_PROXY ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_COOKIES ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_MIME ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_NETRC ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_ALTSVC ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_HSTS ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_DOH ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_WEBSOCKETS ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_ZLIB ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_BROTLI ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_ZSTD ON CACHE BOOL "" FORCE)
set(CURL_DISABLE_VERBOSE_STRINGS OFF CACHE BOOL "" FORCE)

каким образом ho цпп либа может быть блоат, а вот не хо сошка не блоат.

ho цпп либа может (1) содержать шаблоны, которые долго, со скрипом будут собираться и\или (2) импортировать хедеры, которые долго, со скрипом будут собираться.

Пример для (2).

тут b.cpp это использование самописного, тупого как забор, слайса. Логично, что компилится это оч быстро.

#include <cstdio>
#include <cstring>

struct View {
  size_t size;
  char *data;
};

int main(int argc, char *argv[]) {

  char buf[256];
  memcpy(buf, argv[1], 256);

  View sv{strlen(buf), buf};
  printf("%.*s\n", sv.size, sv.data);
}

А это a.cpp с std::string_view

#include <cstdio>
#include <cstring>
#include <string_view>

int main(int argc, char *argv[]) {

  char buf[256];
  memcpy(buf, argv[1], 256);

  std::string_view sv{buf};
  printf("%.*s\n", sv.size(), sv.data());
}

Компилится в четыре, чтоб его, с половиной раза дольше, 154мс! Какое свинство!

bconv.cpp, который компилится в ДВА раза дольше, это более умный слайс (как в тут) с использованием STL-ной charconv для преобразования чисел в строку. bnconv.cpp это то же самое, но charconv убран (в итоге я запихал его в cpp) — и о чудо! компилится так же быстро, как и тупой слайс из b.cpp

Это может, но, действительно, не обязательно для c++ в общем случае. Но для всего boost* — обязательно.

При этом не хо сошка, даже если она 140+k LOC как libcurl, во первых, не хо (собрал и собрал, причём собрал быстро), а во вторых не содержит шаблонов.

В boost они уже прикручены, в curl нет, очевидно.

Это правда! Но к корутинам буста прикасаться без особой надобности мне не очень хочется, это ИМХО.

BruteForce ★★★★
() автор топика
Последнее исправление: BruteForce (всего исправлений: 1)
Ответ на: комментарий от BruteForce

Ну, то есть, мне надо было написать «Future или корутины»? Или «Future/корутины»?

Ну то есть future+корутины это явное непонимание. Что-то вроде «epoll на 1 fd».

ho цпп либа может (1) содержать шаблоны, которые долго, со скрипом будут собираться и\или (2) импортировать хедеры, которые долго, со скрипом будут собираться.

Это ничего не значит. И это, кстати, опять непонимание. Ведь любую хо ты можешь свести к не хо для своего(конечного) случая.

Это может, но, действительно, не обязательно для c++ в общем случае. Но для всего boost* — обязательно.

А это уже следствия непонимания.

Но к корутинам буста прикасаться

к корутинам буста

буста

А это уже не просто непонимание, а некстген. Ну ладно, ты там явно на своей волне.

anonymous
()
Ответ на: комментарий от anonymous_sama

оно зависло

Там по линку собрана довольно старая версия, которая в главном треде при первом запуске начинает собирать базу Xapian. Оно зависло потму что поток заблочился на это) если на телефоне открываешь — может на на несколько минут призадуматься))) Если видел выбор языка и смог нажать — надо ждать. Если и это не видел\не смог нажать — сменить браузер на фурифокс.

Я переделал (добавил воркеров, собираю базу Xapian сам, а клиент качает zip + распаковывает), но до веб-версии руки ещё не дошли.

Лучше расскажи, что пилишь, а главное зачем,

Я балуюсь, в общем случае.

Учу немецкий и при изучении слов есть специфика: существительные надо учить с родом и окончанием мн.ч. Готовых решений задачи нет. У меня был (есть) очень даже рабочий «прототип», который работал для существительных, на JS, в виде web-app, и процентов на 80 вайбкод — собственно вайбкод я и осваивал в тот момент.

В рамках расширения кругозора нашел такой шаблонный проект: https://github.com/Ravbug/sdl3-sample Т. к. игорей я не пишу, я решил, что будет неплохо препрофилировать эту репу в шаблон для аппликух и заодно потыкать Dear ImGui: https://github.com/x6prl/sdl3-imgui-sample

На базе такого перепрофилированного шаблона я решил пилить расширеную версию, ибо, например, неправильных глаголов в немецком поболее чем в английском, и они ещё более неправильные — для части из них надо учить и форму 3лица ед.ч. Dear ImGui пришлось выкинуть — для мобильных приложений штука явно не подходящая. А вот Clay оказался очень приятным!

built with C++23, SDL3, SDL_ttf, Clay UI, Xapian, and LMDB.

теперь ещё libcurl, boringssl, и даже sherpa-onnx (чтобы (1) знать звучание и (2) в перспективе делать упражнения голосом).

LMDB

Вот это может и вылететь вскоре, кстати. А Xapian тема и после лёгких движений напильником завелось и вполне шустро работает на смартфоне 12-ти летней древности с Android 8.1 (~90 тысяч записей).

BruteForce ★★★★
() автор топика
Ответ на: комментарий от anonymous

Ну то есть future+корутины это явное непонимание. Что-то вроде «epoll на 1 fd».

Да, спасибо, что обратил моё внимание

Это ничего не значит.

Не значит, я и пишу «не обязательно для c++ в общем случае».

хо ты можешь свести к не хо для своего(конечного) случая.

И да, и нет же. В том случае, если мне не хочется в часто меняющемся коде юзать шаблоны, завязаные на шаблоны хо либы — да. Ожидать сборки придётся только то время, которое я буду отлаживать конкретный конечный случай. Но если мне нужна будет МОЩЬ КРЕСТОВЫХ ШАБЛОНОВ (или как надо говорить?) непосредственно в часто меняющихся частях кода?

А это уже следствия непонимания.

Так ты объясни, пожалуйста, зачем загадками да намёками говорить? Авось допру. Тебе времени на меня жалко?

к корутинам буста

Извини пожалуйста, что я, бывает, комбинирую слова так что это даёт тебе повод поёрничать. Я про корутины-цепепе20 здесь говорю, не бустовские, а имел в виду что не против корутин-цепепе20, а против буста даже если оно даёт корутины-цепепе20.

BruteForce ★★★★
() автор топика
Ответ на: комментарий от seiken

Спасибо, но по этой теме в подсказках не нуждаюсь.

leo.de

кал

dict.cc

Совсем не про то.

(Если бы я не игрался с приложением для изучения слов, а в это время учил бы слова — уже не было бы необходимости в таком приложении, ну.)

BruteForce ★★★★
() автор топика
Последнее исправление: BruteForce (всего исправлений: 1)
Ответ на: комментарий от anonymous

co_await уже «ждёт», future здесь не нужен.

почему не нужен? ты можешь future не ждать а прикопать где-нибудь

А так, я написал, почему boost - чтобы не прикручивать корутины.

ты так говоришь будето это какой rocket science, ради такой простой вещи тащить этот bloatware ?

Reset ★★★★★
()
Ответ на: комментарий от BruteForce

есть websocket клиент :) мне пока не нужно было, был нужен только http server и websocket клиент, поэтому и в либе нет

да loop.Step можно в отдельном треде

Reset ★★★★★
()
Ответ на: комментарий от BruteForce

Я бы boringssl не стал брать. Сам гугл её не рекомендует, т.к. они её постоянно переделывают и не гарантируют стабильность. Хотя меня не слушай особо, я ещё тот велосипедист.

peregrine ★★★★★
()
Ответ на: комментарий от BruteForce

Да, спасибо, что обратил моё внимание

Ну ты же пытался отмазаться «я имел ввиду ИЛИ». Вот теперь знаешь.

Не значит, я и пишу «не обязательно для c++ в общем случае».

Ни в каком случае не значит.

И да, и нет же.

Только да. Оборачиваешь шаблоны в нешаблоны, собираешь один раз - и всё, вот тебе не хо. Такой хернёй правда никто не страдает(потому что «долго собирается» - фактор где-то на 101 месте в топ-100 критериев выбора либы). Но технически возможность есть.

Так ты объясни, пожалуйста, зачем загадками да намёками говорить?

Так ты должен объяснять, а не я. Ты же заявлял «именно буст» - вот и рассказывай. Ты же не аргументировал никак. А если аргументация заканчивается на блот/долго собирается - тебе объяснения явно не нужны.

а имел в виду что не против корутин-цепепе20, а против буста даже если оно даёт корутины-цепепе20

Ну это из той же оперы что и «я имел ввиду future или корутины» ранее.

anonymous
()
Ответ на: комментарий от BruteForce

Криптография сама по себе шиза, т.к. теории нормальной нет. Слишком много нерешённых математических проблем (начиная от самого известного P?NP и кончая доказательства что односторонние функции не восстановимы быстро от чего пуканы горят у всего асимметричного шифрования на фундаментальном уровне, т.к. оно и есть такая функция + некий секрет, позволяющий провернуть фарш назад и быстро расшифровать данные) + заинтересованных в её ослаблении и регуляции.

Но да, даже простые библиотеки для микроконтроллеров — шиза. Иногда проще с ядра линукса код утянуть и чуть-чуть подправить под местные особенности.

peregrine ★★★★★
()
Ответ на: комментарий от anonymous

фактор где-то на 101 месте в топ-100 критериев выбора либы

А перечисли первые 10 применительно к моей задаче?

Оборачиваешь шаблоны в нешаблоны

Это решение не общего случая. Я привёл пример, когда «нет».

ты должен объяснять

Ты же не аргументировал никак

Так ты должен объяснять, а не я. Ты же заявлял «буст бист» - вот и рассказывай. Ты же не аргументировал никак.

Ну это из той же оперы что и «я имел ввиду future или корутины» ранее.

Самоуверенность ещё выше моей, ого!

BruteForce ★★★★
() автор топика
Ответ на: комментарий от Reset

почему не нужен? ты можешь future не ждать а прикопать где-нибудь

Потому что назначение future такое «ждать» окончания. Если я его не буду ждать - оно не нужно. Я где-то писал тут про epoll на 1 fd - вот смысл примерно тот же получается.

ты так говоришь будето это какой rocket science, ради такой простой вещи тащить этот bloatware ?

Либы(многие) вообще никакой не science, но тащут однако и ещё просят. curl как пример уже привели в ОП - тоже не science. Ну а bloatware - это фантазии. Или в лучшем случае личный неудачный опыт.

anonymous
()
Ответ на: комментарий от BruteForce

А вообще для интереса глянь как пацаны с микроконтроллерами такое решают в своих либах. Там памяти кот наплакал, а процессоры говно полное. Я думаю future это тяжело будет. Вообще сейчас если что-то писать вместо готового, то это под узкие задачи, когда каждый такт на счету. Либо когда надо на мощном железе выжать в 100500 потоков максимум из канала (какие-то сервера нагруженные у условного гугла где ещё всё может быть с дисковым IO плотно сплетено), либо когда надо заставить какую-то микрокартошку качать (самые дешманские микроконтроллеры, где есть какая-то сеть, будь то wifi/кабель/LoRA или иной радиоканал). Но в случае таких картошек (а это почти всегда конечные узлы, которые что-то делают, например открывают ворота или включают свет) обычно отказываются от HTTP в пользу своего бинарного протокола поверх tcp или udp.

ЗЫ

Про то что либы многие говно анон не врёт. Я смотрел тут как раз что во FreeRTOS происходит и его форках… Раздуто даже там. Не в смысле того что оно неправильно как-то. А в смысле что можно проще зачастую.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 3)
Ответ на: комментарий от BruteForce

А перечисли первые 10 применительно к моей задаче?

Зачем мне это перечислять, если даже из ОП видно, что долго компилируется тебя волнует далеко не в первую очередь? Иначе ты бы писал на простом си, который собирается гораздо быстрее даже нешаблонного цпп.

Я привёл пример, когда «нет».

Это:

Но если мне нужна будет МОЩЬ КРЕСТОВЫХ ШАБЛОНОВ (или как надо говорить?) непосредственно в часто меняющихся частях кода?

? Этот случай не выражается в не хо версии, поэтому сравнение бессмыслено. Ещё проще: хо может всё то же, что и не хо(даже по части быстрой сборки). МОЩЬ КРЕСТОВЫХ ШАБЛОНОВ в не хо НЕ доступна в принципе и смысла сравнивать нет.

Ты же заявлял «буст бист» - вот и рассказывай. Ты же не аргументировал никак.

Вот ты и обделался, ибо аргументация была в самом первом моём посте: «уже прикручены корутины(в отличии от курла)».

Самоуверенность ещё выше моей, ого!

Это не самоуверенность. Когда ты был против буста - ты писал «не хочу буст», и не раз. А тут вдруг решил написать «не хочу корутины буста» в том же самом значении.

anonymous
()
Ответ на: комментарий от anonymous

Потому что назначение future такое «ждать» окончания

его можно подождать где угодно, а не на месте создания

Reset ★★★★★
()

В общем, не знаю, что у вас там за родовая травма от буста. А скорее всего даже не травма, а просто пересказ каких-то слухов, коих и про сам цпп предостаточно. Возможно это вызвано тем, что под имеем «буст» собрано много чего и при одном упоминании названия начинается паника. Но это странно, особенно для тех, кто вроде как работает с цпп. Ведь есть стл, в которой также много чего есть, хоть и в куда меньшем кол-ве и с лучшим качеством. Как например, зависимость от tbb при использовании параллельных алгоритмов - это же никого не пугает(хотя может уже убрали - лет 8 назад смотрел это).

«долго собирается» в принципе свойственно цпп коду, причём долго оно собрается не форфан, как например руст, а по вполне объективным причинам. Как можно писать на цпп и бояться «долгой» сборки - непонятно. Скорее всего это наследие си с классами(или опять пересказ каких-то слухов).

«цпп»(не си с классами) - это шаблоны/constexpr. «модно» - это корутины. «хттп» - это сразу либа, ручная реализация не особо осмыслена(руками что-то технологичное можно реализовывать, но хттп к этому не относится). А если либа - лучше поискать такую, где придётся меньше оборачивать/адаптировать к своему коду, в том числе в плане корутин.

Вот одна из таких либ - тот самый boost beast. Ну это если предрассудки оставить, конечно же.

anonymous
()

Есть библиотека Poco https://habr.com/ru/articles/148173/

Она поддерживает http/https - клиентов и серверы.

Смотрите Net::HTTPSClientSession(host,port) для создания клиентской сессии.

Net::HTTPRequest - это запрос.

anonymous
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария