Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187

Boost 1.67.0 ssl connect не получается сделать timeout 10sec

13.07.2018, 20:16. Показов 7849. Ответов 38

Студворк — интернет-сервис помощи студентам
Не очень-то я сильна в библиотеке boost 1.67.0, от чего прошу помощи экспертов.
Спустя какое-то время, запрос ждет ответа от сервера бесконечно, из-за отсутствия связи и приходится перезапускать программу.
Boost взяла по причине упростить написание кода. Но вот как выставить timeout если соединение отвалилось понять не могу
Если можно как-то проще вставить этот кусочек кода в то что у меня уже есть.. Заранее огромное спасибо.

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
39
40
41
42
43
44
45
46
47
bool HttpsConnect::get() {
    char shop_url[]="myshop.com";
    try {
        boost::asio::io_context ioc;
        ssl::context ctx{ssl::context::sslv23_client};
        load_root_certificates(ctx);
        tcp::resolver resolver{ioc};
        ssl::stream <tcp::socket> stream{ioc, ctx};
 
        if (!SSL_set_tlsext_host_name(stream.native_handle(), shop_url)) {
            boost::system::error_code ec{static_cast<int>(::ERR_get_error()), boost::asio::error::get_ssl_category()};
            throw boost::system::system_error{ec};
        }
 
        auto const results = resolver.resolve(shop_url, _port.c_str());
        boost::asio::connect(stream.next_layer(), results.begin(), results.end());
 
        stream.handshake(ssl::stream_base::client);
 
        http::request <http::string_body> req{
                http::verb::get, "/api/price", _ssl_proto
        };
 
        req.set(http::field::host, shop_url);
 
        http::write(stream, req);
        boost::beast::flat_buffer buffer;
        http::response <http::string_body> res;
        http::read(stream, buffer, res);
 
        _response = res.body();
        if (_response.size() < 1000) //тут если тело ответа < 1000  знаков
            return false;
 
        boost::system::error_code ec;
        stream.shutdown(ec);
        if (ec == boost::asio::error::eof) {
            ec.assign(0, ec.category());
        }
        if (ec)
            return false;
    }
    catch (std::exception const &e) {
        return false;
    }
    return true;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.07.2018, 20:16
Ответы с готовыми решениями:

Не получается достучаться до БД ORA-12170: TNS:Connect timeout occurred
Всем привет! База 10.2 установлена на вирт. машину Vmware. Сеть настроена - машины видны в обоих направлениях (от виртуальной к реальной...

Зависание формы, как сделать timeout в connect()
Здравствуйте. В моей программе button1 вызывает цикл функций connect() из класса. В это время форма зависает, до завершения работы цикла....

Socket.Connect() Timeout
Подскажите, как можно выставить таймаут соединения для метода Connect() у сокета?Нашёл только таймауты для отправки и получения данных.

38
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
23.11.2018, 14:50
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от helena_1990 Посмотреть сообщение
Сейчас шедулер шустрый даже на винде, не как раньше на методе ловушек как например во freebsd было.

Я не хочу спорить, просто намекну, что если потребуется делать что-то серьезное вроде сервера онлайн игры какой-нибудь, то синхронный вариант не взлетит.
Вот первая статья на тему
https://habr.com/post/150788/
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
23.11.2018, 14:54  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
Я уже устал объяснять
Так вы мне объясняете не то. Я же спрашиваю про boost sync timeout. А вы мне про асинхронные твердите. Вам удобно асинхронно, мне синхронно кому-то корутины. Просто я не пишу для чего мне это нужно, и асинхронное мне не надо понимаете ? Я же тоже устала про это Вам намекать всеми способами Про серьезных дядей зачем-то написали :-D

Добавлено через 1 минуту
Цитата Сообщение от shmkv Посмотреть сообщение
если потребуется делать что-то серьезное вроде сервера онлайн игры какой-нибудь
Так вот для сервер онлайн игры я писала в позапрошлом году, и там я использовала разумеется асинхронность. А тут дело другое.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
23.11.2018, 15:02
Цитата Сообщение от helena_1990 Посмотреть сообщение
Вроде слушает, данные бегут, правда пришлось в бесконечный цикл сделать чтобы постоянно слушал и как только выключила сеть, он продолжает слушать.
Не нужен там бесконечный цикл. Приложи сюда пример кода.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
23.11.2018, 15:08  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
Не нужен там бесконечный цикл.
А я Вам сейчас покажу, вот тоже интересно как ?!
Если убрать бесконечный цикл, то оно считает одну строку и завершится.
И раз в 5-10 минут нужно отключаться от сокета, там такие правила. По этому я сделала break из него и потом по новой


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        
        auto begin = std::chrono::steady_clock::now();
        auto end = std::chrono::duration_cast<std::chrono::minutes>(std::chrono::steady_clock::now() - begin).count();
        
        while (true) {
            boost::this_thread::sleep_for(boost::chrono::milliseconds(1));
            ws.read(b);
    
            std::cout << b.data();
     
            b.consume(b.size());
            end = std::chrono::duration_cast<std::chrono::minutes>(std::chrono::steady_clock::now() - begin).count();
            
            if (end >= ASIO_RECONNECT_MIN) {
                ws.close(websocket::close_code::normal);
                break;
            }
        }
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
23.11.2018, 15:36
Сделай для чтения из вебсокета аналогичную обертку, что я советовал для http, только в обработчике чтения аккумулируй данные, которые приходят, т.е. кидай новые запросы на чтения, пока не все пришли данные. io_service::run не отдаст управление пока у него есть активные задачи (таймер тоже нужно будет отменить).

Добавлено через 20 секунд
Сделай для чтения из вебсокета аналогичную обертку, что я советовал для http, только в обработчике аккумулируй данные и настоятельно советую обрабатывать ошибки и on_close.
Короче, добавляешь сюда таймер, оборачиваешь в отдельную функцию и получаешь свою синхронную функцию.
https://www.boost.org/doc/libs... _async.cpp

Добавлено через 13 минут
Срач по теме https://svn.boost.org/trac10/ticket/2832
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
23.11.2018, 18:43  [ТС]
Цитата Сообщение от helena_1990 Посмотреть сообщение
Не нужен там бесконечный цикл.
Собственно цикл предложил сам Vinnie Falco

Цитата Сообщение от shmkv Посмотреть сообщение
Срач по теме
"I think asio's sync routines either need a timeout parameter or need to be removed.
Sync IO without a timeout is something I can hardly imagine any sensible use case for."

Вот и я о том же.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
28.11.2018, 13:38  [ТС]
В итоге написала всё на чистом Си без лишних библиотек и результат производительности небо и земля. Вообще не понимаю зачем жертвовать производительностью ради удобства написания. Boost к сожалению оказался очень медленный по сравнению с моей реализацией для моей задачи. Теперь моя программа успевает сделать все 100% ставок. Кстати тот же curl быстрее реализует запросы чем boost. Кому интересно, сравните по таймеру. Там разница в 1.2-1.8ms получается. У меня же 0.00117ms сейчас. Хорошо что из буста ничего такого не добавляют в стандарт C++, а то он такими темпами будет похож на php по производительности. Единственный плюс, это наверное переносимость, и что для каждой платформы он оптимизирует код реализуя epoll, kqueue etc, ну это легко лечиться директивами. Ну для ленивых сойдет конечно
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
28.11.2018, 16:12
Не надо списывать на Boost Asio проблемы, которые возникают от неправильного его использования. У меня на нем написан веб-сервер потоковой передачи видеотрансляций в реальном времени и почему-то никаких секундных задержек не замечаю.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
28.11.2018, 16:35  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
Не надо списывать на Boost Asio проблемы, которые возникают от неправильного его использования
Ну расскажите как "правильно" вставить таймаут в том варианте что есть в boost asio sync без костылей?! Я многое не прошу ))
Зачем вы спорите об очевидных вещах ? Вы совершенно не тот пример привели.
У меня стаж c 12 лет, и я знаю о чем говорю поверьте на слово. Ради интереса посмотрите какой ужасный код генерирует компилятор когда в проекте участвует boost.
У вас просто задачи проще. Веб-сервер я не считаю чем-то серьезным. Да и как вы сказали "секундные задержки" это было бы перебор даже для PHP )) Я писала поточный видео-сервер еще лет 5 назад, и производительность упиралась только в 100мб канал. Да и к тому же есть очень быстрый ffmpeg, ffserver etc что избавляет от необходимости использования этой вечно тестовой библиотеки как boost. Я вам так скажу, моя задача очень критична к времени обращения к сетевому протоколу. Я даже думаю реанимировать свою микроОС которую когда-то писала на ассемблере. В моем случае критично даже время общения с драйвером, мне в идеале нужно работать напрямую с памятью сетевой карты без драйвера- но это отдельная история. По этому для меня разница в производительности сразу заметна.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
28.11.2018, 21:40
Цитата Сообщение от helena_1990 Посмотреть сообщение
Ну расскажите как "правильно" вставить таймаут в том варианте что есть в boost asio sync без костылей?! Я многое не прошу ))
Я никогда не использовал блокирующие функции asio: считаю это извращением.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Зачем вы спорите об очевидных вещах ? Вы совершенно не тот пример привели.
Почему же?
Цитата Сообщение от helena_1990 Посмотреть сообщение
У меня стаж c 12 лет, и я знаю о чем говорю поверьте на слово.
Иии? Я свою первую программу на плюсах написал еще раньше.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Ради интереса посмотрите какой ужасный код генерирует компилятор когда в проекте участвует boost.
Мне этот код самому исполнять что ли? В моем случае все упирается в пропускную способность сети сервера, загрузка процессора околонулевая, задержки минимальны. Давно не занимаюсь преждевременной оптимизацией.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Веб-сервер я не считаю чем-то серьезным.
Там такое же asio... А что тогда серьезное? Если уж решили мерятся со мной, то собственное мини-ядро игрушечной ОС с поддержкой SMP и Paging'а пойдет в качестве аргумента?
Цитата Сообщение от helena_1990 Посмотреть сообщение
Да и к тому же есть очень быстрый ffmpeg,
Неимоверно глючный продукт и выносящая мозг библиотека с кучей разных и несовместимых версий, а также отличается почти полным отсутствием вменяемой документации, от использования которой в моей компании почти ушли (и с этим исчезло куча проблем). Одно время у нас был сотрудник, который специально занимался починкой багов в ней. По крайней мере для распаковки RTSP пакетов h264 и в контейнеры лучше ffmpeg не использовать. Написание такого велосипеда будет сопоставимо по танцам с бубнами с ffmpeg. Сейчас я использую ffmpeg только в своем собственном проекте, хотя уже задумываюсь, чтобы на досуге написать свой велосипед и забыть про него (декомпрессия мне ненужна).
Цитата Сообщение от helena_1990 Посмотреть сообщение
от необходимости использования этой вечно тестовой библиотеки как boost
У ffmpeg вообще нет релизов. И они официально не рекомендуют даже использовать последние версии.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Я вам так скажу, моя задача очень критична к времени обращения к сетевому протоколу.
Готов поспорить, что ваша задача решается с пользованием Boost'а с запасом.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Я даже думаю реанимировать свою микроОС которую когда-то писала на ассемблере.
Не вижу смысла писать ОС на ассемблере. Ради прикола я имитировал в своей старой версии игрушечной ОС (написанной еще в школе на Си вообще без оптимизации) системные вызовы KolibriOS, результат - разницы в скорости работы их кривых аппликух почти нет, а если учитывать, что у меня там получились одни сплошные конвертации вызовов в свои собственные, то ее вообще нет.
Цитата Сообщение от helena_1990 Посмотреть сообщение
В моем случае критично даже время общения с драйвером, мне в идеале нужно работать напрямую с памятью сетевой карты без драйвера- но это отдельная история. По этому для меня разница в производительности сразу заметна.
Я так тоже раньше думал. Писал драйверы EHCI, AHCI... Разница ничтожна. Для нормальной работой с сетью должна быть довольно сложная реализация многозадачности и событийно ориентированная модель, чтобы не ждать в бесконечном цикле прерывания от карточки. Если интересно, то можем поговорить об этом в другой теме (или ПМ), чтобы не замусоривать тему.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
28.11.2018, 21:45  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
Я никогда не использовал блокирующие функции asio: считаю это извращением
Я с вами согласна что многое в библиотеке boost это и есть извращение.

Мне достаточно того, что вам таймауты просто не нужны и сделала из этого определенный вывод, из чего спор с вами считаю избыточным.
Вам можно больше не беспокоиться - заранее спасибо

P.S Хотелось бы услышать профессионалов, относительно вопросу по теме.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
28.11.2018, 22:06
Цитата Сообщение от helena_1990 Посмотреть сообщение
Мне достаточно того, что вам таймауты просто не нужны и сделала из этого определенный вывод, из чего спор с вами считаю избыточным.
Где я это писал? Можно цитату?
Цитата Сообщение от helena_1990 Посмотреть сообщение
P.S Хотелось бы услышать профессионалов, относительно вопросу по теме.
А в ответ будет тишина...

Добавлено через 4 минуты
На самом деле ответ уже дан, причем не только тут, но и на других ресурсах.

Добавлено через 10 минут
Вы надеюсь понимаете разницу между "функции для таймаута не нужны" и просто "таймауты не нужны". Для гибкой реализации таймаутов используются таймеры, даже в примерах к документации https://github.com/boostorg/be... server.cpp. Применительно к Boost'у, да, таймеры не нужны, т.к. в нем просто иная архитектура.
0
4 / 3 / 1
Регистрация: 28.11.2018
Сообщений: 4
29.11.2018, 00:49
Лучший ответ Сообщение было отмечено helena_1990 как решение

Решение

Цитата Сообщение от helena_1990 Посмотреть сообщение
Но вот как выставить timeout если соединение отвалилось понять не могу
В твоем примере этого сделать нельзя. Только переделывать на асинхронное или искать альтернативу.

Добавлено через 4 минуты
Цитата Сообщение от helena_1990 Посмотреть сообщение
моя программа успевает сделать все 100% ставок
Я правильно понимаю речь о бирже? если пишешь скальпера на секундах по мультипарам то boost тут не игрок, нужно что-то более рилтаймовое.

Добавлено через 1 минуту
Цитата Сообщение от helena_1990 Посмотреть сообщение
Я даже думаю реанимировать свою микроОС которую когда-то писала на ассемблере. В моем случае критично даже время общения с драйвером, мне в идеале нужно работать напрямую с памятью сетевой карты без драйвера- но это отдельная история. По этому для меня разница в производительности сразу заметна.
Снимаю шлапу, ушел варить борщ!
2
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
29.11.2018, 01:47
Цитата Сообщение от shmkv Посмотреть сообщение
Применительно к Boost'у, да, таймеры не нужны, т.к. в нем просто иная архитектура.
таймауты конечною.
Цитата Сообщение от int_21h Посмотреть сообщение
В твоем примере этого сделать нельзя. Только переделывать на асинхронное или искать альтернативу.
Я пытаюсь к этому подвести уже 2ю страницу. Но helena_1990 убеждена, что не она должна подстраиваться под boost, а boost под нее. Если из этого исходить, то действительно лучше использовать инструмент, который больше нравится.

Добавлено через 12 минут
Идея со своей ОС скорее всего сразу загнется на этапе чтения документации на сетевой чип. Тут очень много осеписателей, но лишь единицы из них смогли сделать хоть какой-то более-менее рабочий драйвер для современного железа. С сетевыми картами ситуация еще хуже: они не стандартизированы. Т.е. для SATA есть спецификация AHCI, для USB EHCI/xHCI, для звука HDA... А вот для сетевых карточек ничего нет, причем для многих документация вообще закрыта. Т.е. есть риск, что придется покупать специально карточку, под которую открыта документация на чип. Ну и конечно будет 100% привязка к ней. По скорости... если делать логику сразу в обработчике прерываний, то, возможно, будет и чуть быстрее для каких-то синтетических задач вроде "нужно быстро ответить". А вот что-то более-менее реальное так сделать не получится.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
29.11.2018, 02:51  [ТС]
Цитата Сообщение от int_21h Посмотреть сообщение
В твоем примере этого сделать нельзя. Только переделывать на асинхронное или искать альтернативу.
Спасибо! Именно это выяснить мне и требовалось. Я думала что уже схожу с ума, а это просто такая "продвинутая" библиотека. (сорри за сарказм)

Цитата Сообщение от int_21h Посмотреть сообщение
Я правильно понимаю речь о бирже
Правильно!
0
0 / 0 / 0
Регистрация: 06.12.2018
Сообщений: 3
06.12.2018, 14:00
А у меня тоже беда с boost но только с асинхронными websockets. Прошу сильно не ругать, это мой первый пост.
Постараюсь изложить мою мысль правильно.

Я хочу подключиться к бирже и читать не прерывно котировки.
Исходя из примера ссылка я подписываюсь на канал и слушаю. Я даже иногда вижу данные, но чаще вот такую ошибку "read: The WebSocket stream was gracefully closed at both endpoints". Программа завершается в любом случае, попали туда данные или нет. А мне нужно чтобы он читал не прерывно. Как мне такое сделать ?

вот код
компилирую на Debian так
Bash
1
g++ test.cpp -o testbin -std=c++11 -lcrypto -lssl -lboost_system-mt -lboost_thread-mt -lpthread
C++ (Qt)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/beast/websocket/ssl.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <memory>
#include <string>
 
namespace beast = boost::beast;         // from <boost/beast.hpp>
namespace http = beast::http;           // from <boost/beast/http.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
namespace net = boost::asio;            // from <boost/asio.hpp>
namespace ssl = boost::asio::ssl;       // from <boost/asio/ssl.hpp>
using tcp = boost::asio::ip::tcp;       // from <boost/asio/ip/tcp.hpp>
 
void
fail(beast::error_code ec, char const* what)
{
    std::cerr << what << ": " << ec.message() << "\n";
}
 
class session : public std::enable_shared_from_this<session>
{
    tcp::resolver resolver_;
    websocket::stream<ssl::stream<tcp::socket>> ws_;
    beast::multi_buffer buffer_;
    std::string host_;
    std::string text_;
 
public:
    explicit
    session(net::io_context& ioc, ssl::context& ctx)
        : resolver_(ioc)
        , ws_(ioc, ctx)
    {
    }
 
    void
    run(
        char const* host,
        char const* port,
        char const* text)
    {
        host_ = host;
        text_ = text;
 
        resolver_.async_resolve(
            host,
            port,
            std::bind(
                &session::on_resolve,
                shared_from_this(),
                std::placeholders::_1,
                std::placeholders::_2));
    }
 
    void
    on_resolve(
        beast::error_code ec,
        tcp::resolver::results_type results)
    {
        if(ec)
            return fail(ec, "resolve");
 
        net::async_connect(
            ws_.next_layer().next_layer(),
            results.begin(),
            results.end(),
            std::bind(
                &session::on_connect,
                shared_from_this(),
                std::placeholders::_1));
    }
 
    void
    on_connect(beast::error_code ec)
    {
        if(ec)
            return fail(ec, "connect");
 
        ws_.next_layer().async_handshake(
            ssl::stream_base::client,
            std::bind(
                &session::on_ssl_handshake,
                shared_from_this(),
                std::placeholders::_1));
    }
 
    void
    on_ssl_handshake(beast::error_code ec)
    {
        if(ec)
            return fail(ec, "ssl_handshake");
 
        ws_.async_handshake(host_, text_,
            std::bind(
                &session::on_handshake,
                shared_from_this(),
                std::placeholders::_1));
    }
 
    void
    on_handshake(beast::error_code ec)
    {
        if(ec)
            return fail(ec, "handshake");
        
        ws_.async_write(
            net::buffer(text_),
            std::bind(
                &session::on_write,
                shared_from_this(),
                std::placeholders::_1,
                std::placeholders::_2));
    }
 
    void
    on_write(
        beast::error_code ec,
        std::size_t bytes_transferred)
    {
        boost::ignore_unused(bytes_transferred);
 
        if(ec)
            return fail(ec, "write");
        
        ws_.async_read(
            buffer_,
            std::bind(
                &session::on_read,
                shared_from_this(),
                std::placeholders::_1,
                std::placeholders::_2));
    }
 
    void
    on_read(
        beast::error_code ec,
        std::size_t bytes_transferred)
    {
        boost::ignore_unused(bytes_transferred);
 
        if(ec)
            return fail(ec, "read");
 
        ws_.async_close(websocket::close_code::normal,
            std::bind(
                &session::on_close,
                shared_from_this(),
                std::placeholders::_1));
    }
 
    void
    on_close(beast::error_code ec)
    {
        if(ec)
            return fail(ec, "close");
 
        std::cout << beast::buffers(buffer_.data()) << std::endl;
    }
};
 
//------------------------------------------------------------------------------
 
int main(int argc, char** argv)
{
    auto const host = "stream.binance.com";
    auto const port = "9443";
    auto const text = "/ws/ethbtc@kline_1m";
 
    net::io_context ioc;
    ssl::context ctx{ssl::context::sslv23_client};
    ctx.set_verify_mode(ssl::verify_none);
    std::make_shared<session>(ioc, ctx)->run(host, port, text);
    ioc.run();
 
    return EXIT_SUCCESS;
}
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
07.12.2018, 12:35  [ТС]
Если грубо, то примерно так. А вообще для бинанса boost подходит в случае долгой перспективы, а для скальпирования лучше что-то более быстрое. И разумеется пинг до биржи должен быть 0.3-0.5ms - а то всё это не будет иметь смысла.

C++ (Qt)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/beast/websocket/ssl.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <memory>
#include <string>
 
namespace beast = boost::beast;         // from <boost/beast.hpp>
namespace http = beast::http;           // from <boost/beast/http.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
namespace net = boost::asio;            // from <boost/asio.hpp>
namespace ssl = boost::asio::ssl;       // from <boost/asio/ssl.hpp>
using tcp = boost::asio::ip::tcp;       // from <boost/asio/ip/tcp.hpp>
 
void
fail(beast::error_code ec, char const* what)
{
    std::cerr << what << ": " << ec.message() << "\n";
}
 
class session : public std::enable_shared_from_this<session>
{
    tcp::resolver resolver_;
    websocket::stream<ssl::stream<tcp::socket>> ws_;
    beast::multi_buffer buffer_;
    std::string host_;
    std::string text_;
 
public:
    explicit
    session(net::io_context& ioc, ssl::context& ctx)
        : resolver_(ioc)
        , ws_(ioc, ctx)
    {
    }
 
    void
    run(
        char const* host,
        char const* port,
        char const* text)
    {
        host_ = host;
        text_ = text;
 
        resolver_.async_resolve(
            host,
            port,
            std::bind(
                &session::on_resolve,
                shared_from_this(),
                std::placeholders::_1,
                std::placeholders::_2));
    }
 
    void
    on_resolve(
        beast::error_code ec,
        tcp::resolver::results_type results)
    {
        if(ec)
            return fail(ec, "resolve");
 
        net::async_connect(
            ws_.next_layer().next_layer(),
            results.begin(),
            results.end(),
            std::bind(
                &session::on_connect,
                shared_from_this(),
                std::placeholders::_1));
    }
 
    void
    on_connect(beast::error_code ec)
    {
        if(ec)
            return fail(ec, "connect");
 
        ws_.next_layer().async_handshake(
            ssl::stream_base::client,
            std::bind(
                &session::on_ssl_handshake,
                shared_from_this(),
                std::placeholders::_1));
    }
 
    void
    on_ssl_handshake(beast::error_code ec)
    {
        if(ec)
            return fail(ec, "ssl_handshake");
 
        ws_.async_handshake(host_, text_,
            std::bind(
                &session::on_handshake,
                shared_from_this(),
                std::placeholders::_1));
    }
 
    void
    on_handshake(beast::error_code ec)
    {
        if(ec)
            return fail(ec, "handshake");
        
        ws_.async_read(
            buffer_,
            std::bind(
                    &session::on_read,
                    shared_from_this(),
                    std::placeholders::_1,
                    std::placeholders::_2))
    }
 
 
 
    void
    on_read(
        beast::error_code ec,
        std::size_t bytes_transferred)
    {
        boost::ignore_unused(bytes_transferred);
 
        if(ec)
            return fail(ec, "read");
 
         std::cout << beast::buffers(buffer_.data()) << std::endl;
         buffer_.consume(buffer_.size());
 
        ws_.async_read(
            buffer_,
            std::bind(
                    &session::on_read,
                    shared_from_this(),
                    std::placeholders::_1,
                    std::placeholders::_2))
    }
 
};
 
//------------------------------------------------------------------------------
 
int main(int argc, char** argv)
{
    auto const host = "stream.binance.com";
    auto const port = "9443";
    auto const text = "/ws/ethbtc@kline_1m";
 
    net::io_context ioc;
    ssl::context ctx{ssl::context::sslv23_client};
    ctx.set_verify_mode(ssl::verify_none);
    std::make_shared<session>(ioc, ctx)->run(host, port, text);
    ioc.run();
 
    return EXIT_SUCCESS;
}
1
0 / 0 / 0
Регистрация: 06.12.2018
Сообщений: 3
07.12.2018, 14:39
helena_1990, Спасибо ты гений!

Добавлено через 3 минуты
helena_1990, А не подскажешь кстати как сделать завершение, если обрыв соединения ?
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
07.12.2018, 14:56  [ТС]
Цитата Сообщение от mapout Посмотреть сообщение
А не подскажешь кстати как сделать завершение, если обрыв соединения ?
Теоретически нужно создать таймер и обновлять его где-то в void on_read... Мне кажется вам поможет shmkv, он больше проникся в этой библиотеке. А я её не использую для биржи.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2018, 14:56

C++ | boost::asio + ssl?
Доброго времени суток! Хотелось бы узнать как подключаться по SSL? int main() { boost::asio::ip::tcp::iostream stream; ...

Не работает SSL в Boost
Здравствуйте. Пытаюсь написать программу для подключения к серверу. #include &lt;boost/asio.hpp&gt; #include...

Boost.asio ошибка в socket.connect
Подскажите почему коннект выдает ошибку? #include &lt;QCoreApplication&gt; #include &lt;boost/asio.hpp&gt; int main(int argc, char *argv) { ...

Boost SSL ошибка линковки
Добрый день. Собственно вопрос: возникла необходимость работы с OpenSSL да еще под виндовс. Собрал буст. Собрал openSSL. Прикрутил все это...

Boost + ssl Отправка почты с gmail.com
Прога просто висит. Что не так ? )) #include &lt;boost/asio.hpp&gt; #include &lt;boost/asio/ssl.hpp&gt; #include &lt;iostream&gt; using...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru