С Новым годом! Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/76: Рейтинг темы: голосов - 76, средняя оценка - 4.91
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915

Boost asio для начинающих

05.06.2019, 19:55. Показов 15185. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Пытаюсь разобраться с самым простым примером, как это все должно работать, как получить ip адрес и записать его в end point:
C++
1
2
3
4
5
6
io_service service;
ip::tcp::resolver resolver(service);
ip::tcp::resolver::query query("www.cyberforum.ru", "80");
ip::tcp::resolver::iterator iter = resolver.resolve( query);
ip::tcp::endpoint ep = *iter;
std::cout << ep.address().to_string() << std::endl;
Подскажите пожалуйста:
C++
1
ip::tcp::endpoint ep = *iter;
Это что операция разыменования ? А переменная iter - это указатель, куда записались данные от резолв запроса ?
Или как то совершенно все по другому ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2019, 19:55
Ответы с готовыми решениями:

Boost Asio для чайника
вообщем стоит задача поставить Boost на Windows и на Ubuntu. голову ломаю не первый день. в интернете ничего внятного не написано. не...

Boost.asio
Добрый день. Я только начал знакомство с boost.asio и при использовании примеров с офф.сайта никак не могу разобраться в их работе. Вот...

Boost Asio C++
Добрый день. Юзаю этот ( http://www.boost.org/ ) проект. Нужна помощь с документаций...

30
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
06.06.2019, 02:19
https://theboostcpplibraries.c... rogramming
1
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
06.06.2019, 07:55
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Это что операция разыменования ? А переменная iter - это указатель, куда записались данные от резолв запроса ?
Или как то совершенно все по другому ?
Это вопрос сложный. Я так вижу эту ситуацию (возможно я не прав)

ASIO предоставляет механизм абстракции для доступа к API операционных систем. Когда мы получаем объект boost::asio::io_context, то он инициализируется всеми необходимыми полями, для доступа к базовым механизмам ввода-вывода конкретной ОС. ip::tcp::resolver::iterator iter = resolver.resolve(query); призывает ОС выполнить для нас работу по определению всех доступных сетевых адресов хоста(собственно ОС использует собственную службу DNS для разрешения имени хоста). resolver возвращает указатель (полученный от API ОС) на область памяти (та область памяти, которая используется сетевыми компонентами конкретной ОС). ip::tcp::endpoint служит контейнером, для хранения сетевых реквизитов хоста (конечной точки). Дальше вопрос интересный. Скорее всего данные копируются в этот контейнер (но возможно, что хранятся лишь указатели). ip::tcp::endpoint имеет у себя "на борту" методы, с помощью которых можно извлечь необходимые данные. Например ep.address().to_string() вернет ip адрес хоста в удобной форме, то есть с типом std::string. ep.port() метод, вернёт номер порта (с типом unsigned int), на котором "крутится" необходимый сервис (для http и https порты 80 и 443 соответственно). В любом случае, асио лишь абстракция, под капотом у неё ,так или иначе, скрыты механизмы общения с подсистемами ввода-вывода конкретной ОС. То есть, приложение, использующее асио, в теории переносимое(может использовать API разных типов ОС).
1
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
06.06.2019, 08:21
Говоря о сетевых компонентах ОС, имеется в виду нечто похожее на ->
Кликните здесь для просмотра всего текста
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
06.06.2019, 20:54  [ТС]
1)
Цитата Сообщение от Termit779 Посмотреть сообщение
ip::tcp::endpoint служит контейнером, для хранения сетевых реквизитов хоста (конечной точки). Дальше вопрос интересный. Скорее всего данные копируются в этот контейнер (но возможно, что хранятся лишь указатели). ip::tcp::endpoint имеет у себя "на борту" методы, с помощью которых можно извлечь необходимые данные. Например ep.address().to_string() вернет ip адрес хоста в удобной форме, то есть с типом std::string. ep.port() метод, вернёт номер порта..
А не подскажите, почему вот такая строчка кода не работает:
C++
1
cout << ep.protocol().to_string() << endl;
VS2017 пишет, что boos:asio:ip:tcp не содержит члена "to_string". Но ведь на взятии адреса и порта работает.

2)И если не сложно, подскажите:
C++
1
2
bind(endpoint): эта функция связывается с данным адресом.
connect(endpoint): эта функция синхронно подключается по данному адресу.
В чем разница между связыванием с адресом и подключением ?

Добавлено через 1 час 12 минут
И позвольте пожалуйста еще один вопрос:
Если сделать резолв хотя бы один раз:
C++
1
2
3
4
ip::tcp::resolver::query query("www.cyberforum.ru", "80");
ip::tcp::resolver::iterator iter = resolver.resolve( query);
ip::tcp::endpoint ep = *iter;
std::cout << ep.address().to_string() << std::endl;
А потом отключить сеть, то результат все равно выдается. Получается полученные данные, как то хэшируются ? Где они могу хэшироваться и как можно убрать использование таких данных ?
1
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
07.06.2019, 12:26
Цитата Сообщение от Optimus11 Посмотреть сообщение
А не подскажите,
Мне импонирует Ваше явно выраженное стремление к познанию boost и asio конкретно. Вы молодец, как и многие прикладные программисты, использующие эту библиотеку. Есть спойлер, что в 2023 году в стандарт С++ войдет поддержка сетевого взаимодействия. И я даю 10 к 10, что это будет boost asio. И те, кто активно изучают "подкапотное пространство" asio, будут "на коне". Ведь уже сейчас есть библиотека boost::beast, основой которой есть boost::asio. Эта библиотека имеет просто ОГРОМНЫЙ багаж функционалки для работы с сетью на высоком уровне абстракции. Плюсом к этой библиотеке будет хорошая поддержка со стороны самого Винни Фалко. Так что ставлю Вам палец вверх, за изучение asio.

Цитата Сообщение от Optimus11 Посмотреть сообщение
А не подскажите, почему вот такая строчка кода не работает:
Нет перегруженного оператора в классе ip::tcp::endpoint. Ну и зачем Вам это? В программировании нужно в первую очередь задавать вопрос ЗАЧЕМ? А потом уже КАК?
Цитата Сообщение от Optimus11 Посмотреть сообщение
В чем разница между связыванием с адресом и подключением ?
Нужно штудировать маны по сокетам Беркли и IPC. Вернее сказать, нужно базовое понимание, как это все работает. В любом раскладе, нужно помнить, что ВСЕ есть данные и алгоритмы. Не верьте никаким другим объяснениям программирования и понимания БЫТИЯ.
Цитата Сообщение от Optimus11 Посмотреть сообщение
Если сделать резолв хотя бы один раз:
Здесь все очень просто, объект ip::tcp::endpoint будет доступен в области видимости. Если проще, то пока компилятор не встретит } (закрывающую скобку)
Цитата Сообщение от Optimus11 Посмотреть сообщение
Где они могу хэшироваться и как можно убрать использование таких данных ?
Как Вы себе представляете УБРАТЬ ДАННЫЕ? Ничто нельзя убарть. Ничто нельзя удалить. Это противоречит фундаментальным понятиям ЧТО-ТО и НЕЧТО. Посмотрите выступление Нила Деграйсс Тайсона и лучших физиков-математиков планеты. Там разжевано все, от того что такое ЧТО-ТО, и заканчивая НИЧТО. https://www.youtube.com/watch?v=WqBPrkzSO0c&t=489s
2
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
07.06.2019, 19:00  [ТС]
Спасибо за обьяснение!

Цитата Сообщение от Termit779 Посмотреть сообщение
Здесь все очень просто, объект ip::tcp::endpoint будет доступен в области видимости. Если проще, то пока компилятор не встретит } (закрывающую скобку)
Я имел ввиду, что запускается код, резолв получает ip по имени сайта и присваивает его эндпоинту.
Выполнение кода закончилось, я выдергиваю патчкорд из сетевой платы, и опять запускаю код, и резолв каким то образом опять полусает ip адресса соответвующий имени запрашиваемого сайта. Вопрос как, если сети нет, откуда берется данные ip.

Добавлено через 3 часа 8 минут
Цитата Сообщение от Termit779 Посмотреть сообщение
Нет перегруженного оператора в классе ip::tcp::endpoint. Ну и зачем Вам это? В программировании нужно в первую очередь задавать вопрос ЗАЧЕМ? А потом уже КАК?
Чтобы посмотреть по какому протоколу работает сервер к которому идут запросы.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
11.06.2019, 20:00  [ТС]
Здравствуйте,

В продолжении темы

Позвольте такой вопрос:
Чтобы не произошло ошибки, к примеру во время резолва не существующего доменного имени, к примеру: cyberforum1.ru
В примере http запроса доабаляется обработчик исключений try/catch и еще несколько непонятных для меня по функционалу строк:
C++
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
try
}
io_service service;
ip::tcp::resolver resolver(service);
ip::tcp::resolver::query query("www.cyberforum1111.ru", "80");  // не сущесвующий адрес
ip::tcp::resolver::iterator iter = resolver.resolve( query);   // если не будет try/catch  винда выдает ошибку
ip::tcp::endpoint ep = *iter;
 
 
//Я не могу понять, для чего нужна эта часть кода ??
////////////////////////////////////////////////////////////////////////////
tcp::resolver::iterator end_empty;
 
boost::system::error_code error = boost::asio::error::host_not_found;  
 
while (error && iter != end_empty)
  {
sock.close();
sock.connect(*iter++, error);
cout << "error:" << error << endl;
  }
////////////////////////////////////////////////////////////////////////////
}
catch (std::exception& e)
{
std::cout << "Exception: " << e.what();
}
Вопрос: какую функцию выполняет код выделенный комментарием с вопросом ? Если резолвить не существующий адрес, то ошибку первым перехватит try/cathc и выдаст host_not_found, то есть до выделенных строк, выполнения кода вообще не дойдет, так же выполнения кода не дойдет до этих строк и без try/catch, так как винда после строки:
C++
1
ip::tcp::resolver::iterator iter = resolver.resolve( query);
Сразу выдаст ошибку.

Вот я что-то сообразить ни как не могу
0
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
12.06.2019, 20:31
Цитата Сообщение от Optimus11 Посмотреть сообщение
доабаляется обработчик исключений try/catch
Если Вы разработчик библиотеки (с использованием буста) то boost::system::error_code, тогда Exception не будет генерироваться.
Я перевожу документацию к boost (скоро будет доступна на сайте с кучей примеров и пояснениями), так вот:
. Объект ввода-вывода (I/O object) выдает исключение типа boost::system::system_error, если операция не удалась. Если код для запуска операции был записан как:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <boost/asio.hpp>
 
int main(int argc, char* argv[])
{
    boost::asio::io_context io_context;
    boost::asio::ip::tcp::socket socket(io_context);
    boost::asio::ip::tcp::endpoint server_endpoint;
    boost::system::error_code ec;
    socket.connect(server_endpoint, ec);        
    return 0;
}
тогда переменной ec будет установлено значение результата выполнения операции типа boost::system::error_code и никаких исключений типа std::exception не будет вызвано.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
19.06.2019, 19:44  [ТС]
Здравствуйте,

Извините, еще один вопросик

1)Вот есть простейший Get запрос:

C++
1
2
3
4
5
6
7
8
9
10
...
string name_URL = "www.cyberforum.ru"
string zapros = "GET / HTTP/1.1\r\nHost: " + name_URL + "\r\n\r\n";
sock.send(boost::asio::buffer(zapros));
 
//записываем ответ в buff
 
char buff[1000];
sock.read_some(boost::asio::buffer(buff));
cout << buff << endl;
И вот вопрос, сервер присылает ответ, но ведь я не могу заранее знать, какой длинны будет ответ, чтобы определит размер char buff.
Есть ли способ записать ответ в переменную, размер которой заранее не нужно определять ?

2)И не подскажите, что то не могу понять, для чего нужна функция:
C++
1
available(): эта функция возвращает количество байт, которое можно считать синхронно, без блокировки.(с) взято отсюда https://habr.com/ru/post/193038/
Что в итоге за информация содержится в этой available() ?
C++
1
cout << "функция available " << sock.available() << endl;
0
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
20.06.2019, 08:27
Цитата Сообщение от Optimus11 Посмотреть сообщение
Есть ли способ записать ответ в переменную, размер которой заранее не нужно определять ?
Есть. Boost::beast например предоставляет flat_buffer, основанный на концепции DynamicBuffer подробнее можно почитать тут: https://www.boost.org/doc/libs... uffer.html

Цитата Сообщение от Optimus11 Посмотреть сообщение
И не подскажите, что то не могу понять, для чего нужна функция:
Возвращает размер подготовленных данных.

Тут вопрос сложный, данные могут приходить например, не последовательно. Как на принимающей стороне определить, что все данные получены и они нужного Вам типа? Представим, что я отправляю файл размером 5 Гб. При всем этом нужно учитывать, что пакеты на пути своего следования могут приходить в разной последовательности, теряться, задерживаться, иметь ошибки передачи. Подсистема сетевого взаимодействия ОС готовит данный для Вас, и вы посредством API(sockets) получаете эти данные в свое ПО. Если файл огромного размера, то ОС скорее всего будет выдавать Вам данные порциями. Узнать о порциях готовых к получению, можно в частности с помощью данной функции.

Добавлено через 1 час 18 минут
Давайте еще раз обратимся к такому вопросу, как буфер приема и передачи socet API ОС. Так как я подозреваю, что мы говорим о разных вещах. socet API ОС - это прослойка, между программами управления устройствами (NIC) и приложением пользователя. Драйверы устройств лежат в глубине ядра ОС, и socet API ОС предоставляет возможность с ними общаться. То есть это вторая или даже третья прослойка, так как сами драйверы тоже есть абстракция доступа управлением железяками ПК. Boost::Asio - это прослойка между socet API ОС и нашим ПО. И это удобно, так как (я считаю) с точки зрения прикладного программирования, "пилить" socet напрямую, неразумно и подвержено куче ошибок. Пусть этим занимаются разработчики библиотек, аля Boost.

socet API ОС имеет свой буфер приема и отправки сообщений. На сколько мне известно, то сейчас он по дефолту равен 8192 байт. Есть статья, в которой описывают процесс задания буфера отправки сокета равным 0, при этом данные приложения начинают напрямую улетать в сеть без буферизации. Использовать такой подход крайне не рекомендуется, в виду снижения производительности.

Принимая данные из сокета с помощью boost::buffer, мы всего лишь описываем то, какими порциями мы будем вычитывать данные из буфера сокета.

Зачем нужен буфер сокета? Приемные буферы используются для хранения полученных данных, пока они не будут считаны приложением. В случае TCP доступное пространство в приемном буфере сокета — это окно, размер которого TCP сообщает другому концу соединения.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
20.06.2019, 09:14  [ТС]
Огромное спасибо за такие подробные ответы!

Но, если буффер приема является желательным, но необязательным, то в функции read_some все равно присутвует переменная buff:
C++
1
2
3
char buff[1000];
sock.read_some(boost::asio::buffer(buff));
cout << buff << endl;
То есть все что придет от сервера свыше указанной длинны buff, в данном случае 1000 символов, через cout же не выведется.
Тогда возникает вопрос, где же тогда хранится все полное сообщение, которое поишло от сервера по запросу и как его в итоге прочитать.

Добавлено через 16 минут
А, ну или, как Вы написали можно получить доступ ко вмему сообщению, которое пришло с сервера, которое хранится где то в буффере ОС с помщью функции - flat_buffer.(пока не успел прочитать про нее)
0
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
20.06.2019, 09:54
Цитата Сообщение от Optimus11 Посмотреть сообщение
в функции read_some все равно присутвует переменная buff:
Это буфер Вашего приложения. В него будут помещаться данные из буфера сокета.

Цитата Сообщение от Optimus11 Посмотреть сообщение
То есть все что придет от сервера свыше указанной длинны buff, в данном случае 1000 символов, через cout же не выведется.
Нет не выведется. Для этого нужно читать данные из буфера сокета в цикле, пока не произойдет отключение второй стороны, не произойдет ошибка, либо пока все данные не будут получены.
Цитата Сообщение от Optimus11 Посмотреть сообщение
то в буффере ОС с помщью функции - flat_buffer
Лучше не замарачивайтесь с этим. Работайте с уровнем абстракции буста. Вам дают хороший инструмент в руки, а вы пытаетесь "забивать саморезы".
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
22.06.2019, 22:25  [ТС]
C++
1
[I]Boost::beast например предоставляет flat_buffer, основанный на концепции DynamicBuffer[/I]
За место flat_buffer можно использовать boost::asio::streambuf, вот нашел такое:
C++
1
2
3
В Boost.Asio есть два типа буферов для работы с вводом/выводом:
boost::asio::buffer()
boost::asio::streambuf
C++
1
Это чтение будет идти до тех пор, пока не заполнится объект streambuf, а так как объект streambuf может перераспределить себя, чтобы вместить в себя больше места, то, в основном, чтение будет идти до тех пор, пока соединение не будет закрыто
1)Но я хотел еще спросить, в чем разница между функциями write и write_some:
C++
1
2
boost::asio::write(sock, boost::asio::buffer(request_text));
sock.write_some(boost::asio::buffer(request_text));
Я конечно нагуглил, что write_some работает чуть более быстро за счет отсутствующей проверки передачи указанного в запросе текста, а write наоборот дожидается полной отправки, но что то не могу понять, как это проверка в общем смысле происходит. Что конкретно и как проверяется полнота отправки ?

2)И я хотел спросить, а есть ли принципиальная разница куда записывать посылаемый текст - или в стринг или в buffer/streambuf?
C++
1
2
3
4
5
6
7
8
9
10
11
string request_text = "Передаваемый текст"
sock.write_some(boost::asio::buffer(request_text));
 
или же так
 
boost::asio::streambuf Zapros;
ostream zapros_stream(&Zapros);
 
zapros_stream<<"Передаваемый текст"<<endl;
 
sock.write_some(boost::asio::buffer(zapros_stream));
0
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
23.06.2019, 15:23
Цитата Сообщение от Optimus11 Посмотреть сообщение
или в стринг или в buffer/streambuf?
Boost стырил, или QT стырил у boost, но смысл один: streambuf это потоковое чтение данных, а boost::buffer это представить данные из IO в кэше, или оперативной памяти как объект. Будто это файл или объект ввода / вывода. Часто юзают как хэш памяти. В описание к QT кстати даётся лучшее описание. Boost очень сложно все описывает.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
27.06.2019, 18:30  [ТС]
Что то непонятное:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
sock.connect(end_pointo); // end_pointo = cyberforum.ru
 
boost::asio::streambuf request;
        
ostream request_stream(&request);    
request_stream << "GET / HTTP/1.1\r\n"
                       << "Host: Cyberforum.ru\r\n\r\n";
 
boost::asio::write(sock, request);
cout << "bytes available-1: " << sock.available() <<endl;
 
char buff[10000];
 
boost::asio::read(sock,boost::asio::buffer(buff));
cout << "bytes availabl-2 " << sock.available() << endl;
 
cout<<endl<<endl;
 
boost::asio::write(sock, request);
boost::asio::read(sock,boost::asio::buffer(buff));
 
cout << "bytes available-3: " << sock.available() <<endl;
Если я правильно понял sock.available() возвращает кол-во полученных или прочитанных байт, и если так, то я получаю вот такие результаты после выполнения кода:
C++
1
2
3
bytes availabl-1:0
bytes availabl-2:1125
bytes availabl-3:626
Запускаю тот же самый код буквально через секунду и получаю такие данные:
C++
1
2
3
bytes availabl-1:0
bytes availabl-2:1073
bytes availabl-3:2084
Потом опять и опять разные данные.

Я не понимаю, что это за данные и почему они разные из раза в раз, и почему они разные в пределах выполнения одного кода.

PS:Причем текст ответа от сервера тоже разный получается
0
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
27.06.2019, 18:46
Попробуйте вот это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*Адрес хоста*/
std::string host = "www.ceberforum.ru";
/*Динамический буфер приема(приложение)*/
std::string data; 
/*Отправляемый GET запрос*/
std::string message = 
"GET / HTTP/1.1\r\n"
"Host: "+ host + "\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64)\r\n"
"Accept: text/html\r\n"
"Accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7\r\n"
"Connection: close\r\n\r\n";
/*Отправка сообщения*/
sock.write_some(boost::asio::buffer(message, message.size()));
/*Прием ответа. Возвращает количество байт, до совпадения с boost::regex("\r\n\r\n")*/
std::size_t lean = boost::asio::read_until(sock, boost::asio::dynamic_buffer(data), boost::regex("\r\n\r\n"));
/*Убирает все, оставляя только заголовки ответа*/
data.erase(lean);
/*Выводим результат*/
std::cout << data;
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
27.06.2019, 20:27  [ТС]
Мистика, как это все работает
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
28.06.2019, 13:50  [ТС]
А как вообще комманды read/read_some понимают, что они прочитали всё входящее сообщение(входящие биты) от сервера и что можно завершить чтение и перейти к выполнению следующей строчки кода ?
С read_until понятно читает до заданного символа, а с этими коммандами не понятно.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
01.07.2019, 18:21  [ТС]
Подскажите, а в чем принципиальная разница между отправкой/получения файла и просто передачей информации, ну того же html текста ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2019, 18:21
Помогаю со студенческими работами здесь

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу посмотреть простой пример, где сервер...

boost/asio
Кто тестил asio в Вuilder-е? Код использовал отсюда https://www.cyberforum.ru/cpp-beginners/thread329576.html И напоролся сразу...

boost::asio пример
Привет! Можно, пожалуйста, простейший пример работы с boost::asio - клиент-серверная программа, клиент которой должен отсылать...

Winsock vs boost::asio
у Winsock преимущество - это есть русская документация(это не совсем документация но крис касперски объянять умеет) у asio...

Boost asio + qt (slots)
Здравствуйте! В общем, имеется клиентский код из документации boost::asio (&lt;ТЫК&gt;) Он у меня является базовым классом. От него создаю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru