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

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

05.06.2019, 19:55. Показов 15722. Ответов 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
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
02.07.2019, 01:02
Студворк — интернет-сервис помощи студентам
В тексте не содержатся символы, управляющие вводом, нигде, кроме как в специально отведённых местах (например "конец файла", "переход на следующую строку" и т.д.) В произвольной информации байты могут содержать какие угодно значения (в том числе равные EOF), и нужно заранее знать их (байт) количество.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
05.07.2019, 16:21  [ТС]
Подскажите пожалуйста, как обойти вот эту ситуацию.

Предположим нужно зарезолвить два адреса, первый не существующий, второй существующий:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
io_service service;
boost::system::error_code ec;
 
ip::tcp::resolver resolver(service);
ip::tcp::resolver::query query_1("www.dfhtr464dfg.ru", "80");  // не существует такого адреса
ip::tcp::resolver::iterator iter_1 = resolver.resolve( query, ec);
cout<<ec<endl;
ip::tcp::endpoint ep_1 = *iter_1;
 
 
ip::tcp::resolver::query query_2("www.cyberforum.ru", "80");  // существует такой адреса
ip::tcp::resolver::iterator iter_2 = resolver.resolve( query, ec);
ip::tcp::endpoint ep_2 = *iter_2;
Получается, так что при первом резолве, выводится сообщение system:11001 или типа "такой хост не найден".

И и при попытке Выполнить строчку ep_1 = *iter_1, все крашится.

Вопрос, как пропустить с строчку кода
C++
1
ip::tcp::endpoint ep_1 = *iter_1;
Если резолв был неудачным, чтобы весь остальной код не прерывался.
if(ec == "system:11001")
{
}
не работает, так как отсутствует оператор "==" соответствующий ec.
0
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
06.07.2019, 07:30
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Если резолв был неудачным, чтобы весь остальной код не прерывался.
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
28
#include <iostream>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>
 
using boost::asio::ip::tcp;
 
int main(int argc, char * argv[])
{
    setlocale(LC_ALL, "ru");
    boost::asio::io_context io;
    tcp::endpoint ep;
    boost::system::error_code ec;
    tcp::resolver resolv(io);
    tcp::resolver::query query("www.cyberforum.1232", "80");
    tcp::resolver::iterator iter = resolv.resolve(query, ec);
 
    if (!ec)// Если при разрешении адреса ошибок нет
    {
        /*----some actions------*/
        ep = *iter; 
        std::cout << ep << "\n";        
    }
    else
    {
        /*----some actions------*/
        std::cout << ec.message() << "\n";
    }   
}
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
17.07.2019, 20:29  [ТС]
Здравствуйте,

Подскажите почему так получается.
Вот к примеру посылаю get запрос на www.government.ru
От сервера приходит ответ:
C++
1
2
3
4
5
6
7
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Wed, 17 Jul 2019 21:03:47 GMT
Content-Type: text/html
Content-Length: 178
Connection: close
Location: http://government.ru/
Соответственно посылаю запрос повторно на http://government.ru/, но на моменте резолва этого адреса, возникает ошибка "хост не найден", но почему ?
В хроме смотрел, там точно так же, но соответственно при повторном запросе, страничка приходит, а тут не хочет.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
18.07.2019, 11:43
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите почему так получается.
1. nginx предлагает вам обратиться по другому имени.
2. имена government.ru и www.government.ru резолвятся в одни и те же адреса (у меня их три)
Bash
1
2
3
4
5
6
7
8
9
# host government.ru
government.ru has address 95.173.136.163
government.ru has address 95.173.136.168
government.ru has address 95.173.136.162
government.ru mail is handled by 5 mx4.gov.ru.
# host www.government.ru
www.government.ru has address 95.173.136.163
www.government.ru has address 95.173.136.162
www.government.ru has address 95.173.136.168
Соотверственно в GET запросе нужно поменять только имя. (Host: government.ru)
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
18.07.2019, 18:44  [ТС]
Цитата Сообщение от gng Посмотреть сообщение
Соотверственно в GET запросе нужно поменять только имя. (Host: government.ru)
Спасибо!
Работает.
Я почему то подумал, что поменять название hosta нужно, как в самом запросе, так и при самом резволве, поэтому то резолв и выдавал ошибку.

Но, у меня тогда два вопроса:
1)Почему ответ от сервера был именно:
C++
1
2
...
Location: http://government.ru/
А не, прям, как нужно:
C++
1
government.ru
?

2)И я что то вообще тогда не понимаю, по крайне мере в данном случае, смысл этого редиректа. По резолву видно ip адресса не меняются, так почему сервер не может принять get запрос с host`ом:www.government.ru ?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
18.07.2019, 19:44
Цитата Сообщение от Optimus11 Посмотреть сообщение
А не, прям, как нужно:
В поле "Location:" должен стоять URL, куда браузер должен обратиться за этой страницей.
Цитата Сообщение от Optimus11 Посмотреть сообщение
И я что то вообще тогда не понимаю, по крайне мере в данном случае, смысл этого редиректа. По резолву видно ip адресса не меняются, так почему сервер не может принять get запрос с host`ом:www.government.ru ?
Может, но это зависит от логистики сайтов на сервере. Например, они хотят, чтобы в адресной строке браузера высвечивалось government.ru а не www.government.ru.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
18.07.2019, 22:58  [ТС]
Подскажите, о каком io_ context идет речь в этом примере:
https://www.boost.org/doc/libs... time1.html

Или просто io_ context - это просто устаревшее название и сейчас оно заменено на io_service ?
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
29.07.2019, 13:33  [ТС]
Подскажите пожалуйста, если read читает то eof конца потока, и только потом из прочитанного можно достать содержимое, то, как тогда динамические читать данные на ajax ответы от сервера, ведь они должны идти постоянно.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
02.08.2019, 18:22  [ТС]
Попытался понять, что такое асинхронный boost asio, вообще ниче не понял

Если к примеру просто от клиента послать на сервер "Hello world" синхронно и последовательно, как уже было описано в этой теме, будет так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
boost::asio::io_service io_services;
tcp::resolver resolvers(io_services); 
tcp::socket socks(io_services);
boost::system::error_code ec;
 
tcp::resolver::query querys("www.cyberforum", 80);
tcp::resolver::iterator iteratorka = resolvers.resolve(querys, ec);
tcp::endpoint endo_pointo = *iteratorka;
 
socks.connect(endo_pointo);
string message = "Hello world";
write(socks, boost::asio::buffer(message));
То в ассинхронном режиме не понятно, как это сделать, просто добавив приставку sync по типу: asyc_resolve, async_connect, async_write не получится:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
boost::asio::io_service io_services;
tcp::resolver resolvers(io_services); 
tcp::socket socks(io_services);
boost::system::error_code ec;
 
tcp::resolver::query querys("www.cyberforum", 80);
tcp::resolver::iterator iteratorka = resolvers.async_resolve(querys, ec);
tcp::endpoint endo_pointo = *iteratorka;
 
socks.async_connect(endo_pointo);
string message = "Hello world";
async_write(socks, boost::asio::buffer(message));
 
io_services.run();
VS2017 сразу начинает ругаться на эти async_ функции.
Даже, если бы не ругался, непонятно, как эта асинхронизация работает, если необходимо отправить два сообщения, в синхронном режиме - это было бы просто два последовательных кода или код в цикле, а тут не понятно.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
01.09.2019, 19:12  [ТС]
Здравствуйте,

Подскажите пожалуйста, почему так происходит ?

Создаю простой синхронный аццептор, читаю входящие сообщения с помощью read_until`ом в streambuf, и достаю оттуда с помощью istream и getline.
И все работает, но только в первый раз, как только 1ое входящее сообшщения прочитано, я опять ставлю аццептор на прослушку, опять приходит Входящий запрос, опять read_until читает в streambuf, streambuf.size() больше нуля! Но !Response_istream_acceptor.eof() - опреlеляется сразу, как конец потока.
Почему так ?

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
28
29
30
31
32
33
34
35
36
37
38
int main()
{
int port;
port = 80 // порт по которому boost будет слушать Входящие запросы
 
boost::asio::io_service io_services;  // обьявление ио сервиса
boost::system::error_code ec_acceptor;  // обьявление ошибки
 
boost::asio::ip::tcp::acceptor Acceptorka(io_services);  // обьявление самого ацептора
boost::asio::ip::tcp::endpoint endpointo_acceptor(boost::asio::ip::tcp::v4(), port); // обьявление конечно точки по которой аццептор будет слушать запросы
 
tcp::acceptor the_acceptor(io_services, endpointo_acceptor); // привязка аццептора к конечно точке
tcp::socket socket_acceptor(io_services); // обьявление сокета
 
 
for(;;)
{
/////////////
the_acceptor.accept(socket_acceptor);  // запуск аццептора на прослушку
////////////
 
/// читаем Входящее сообщение:
boost::asio::streambuf Response_read_acceptor;   // Обьявим boost asio буффер
istream Response_istream_acceptor(&Response_read_acceptor);  // Обьявим поток ввода связанный с Response_read_acceptor
string response_getline_acceptor;  // создадим string куда будем записывать поcтрочные данные с getline
 
boost::asio::read_until(socket_acceptor, Response_read_acceptor, "\r\n", ec_acceptor);  Читаем входящий запрос в Response_read_acceptor
 
cout<<"Response_read_acceptor.size: "<<Response_read_acceptor.size()<<endl;
 
while (!Response_istream_acceptor.eof())  // Первый круг цикла, работаtт нормально, повторно сразу определяется, как eof !!
{
getline(Response_istream_acceptor, response_getline_acceptor);
response_Result_acceptor = response_Result_acceptor + response_getline_acceptor + "\r\n";
}
 
cout<<"Входящий запрос: "<<response_Result_acceptor<<endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.09.2019, 19:12

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;) Он у меня является базовым классом. От него создаю...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru