|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|||||||||||
Асинхронный tcp server21.06.2016, 20:04. Показов 6298. Ответов 5
Метки нет (Все метки)
Привет всем.
Пытаюсь реализовать класс - сервер, с которым в дальнейшем можно будет легко и непринужденно работать:
select, но что поменяется? , только становится непонятно, как прерывать работу цикла, если поток повиснет в этом select (сервер неустанно ждёт клиентов и сообщений от них, и таймеры ни к чему).Вообще, к подобному меня привела необходимость создания эмулятора modbus tcp server/slave, а сокетами занимаюсь всего несколько дней (не считая пары лаб в универе больше 6-и лет назад ).Прикидывал как это можно сделать на boost::asio (тоже только начал разбираться), используя асинхронные методы, но не получится ли тогда, что каждый сокет, полученный аксептором, будет создавать для себя свой поток асинхронного чтения? В общем если есть адекватно решение этой задачи с использованием этой либы, я только рад.
0
|
|||||||||||
| 21.06.2016, 20:04 | |
|
Ответы с готовыми решениями:
5
TCP server-klient TCP proxy server для СУБД с возможностью логирования всех запросов Асинхронный или синхронный клиент TCP в приведенных примерах |
|
Модератор
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
|
|
| 22.06.2016, 08:01 | |
|
Operok, можно сделать все в одном потоке на блокирующих сокетах если вы будете вызывать select для того чтобы узнать есть ли входящие подключения или данные и будет ли блокировка при accept или recv. select не вешает цикл. Но если такой сервер сильно нагрузить то он не сможет использовать процессор целиком - поток один и этому потоку доступно только одно ядро. Поэтому рационально создавать новый поток для обслуживания группы клиентов при необходимости. Отключившихся клиентов надо удалять из списка. Это немного усложняет схему управления потоками так как потоки могут разгружаться. Можно предусмотреть завершение полностью разгруженного потока или перераспределение клиентов между загруженными потоками при определенном уровне разгрузки потока плюс добавление нового клиента в группу к наименее загружённому потоку. Простор для творчества огромен однако у меня все отлично работает на блокирующих сокетах с select в одном потоке.
1
|
|
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|
| 22.06.2016, 17:03 [ТС] | |
|
vxg, разве select поток не блокирует, если последним параметром NULL передать? Отдельный select для серверного сокета тогда надо (отдельный fd_set) и в разные потоки, такое можно попробовать. Получится уже как минимум 3 потока (основной, select для accept и select для recv), если ещё кидать обработчик полученного сообщения в новый поток, то с одной стороны (если учесть конечное использование сервера) обработка модбас сообщений происходит довольно быстро имеет ли смысл создавать поток, а с другой стороны, если использовать сервер для задач с более длительной обработкой сообщений, то не накопится потоков многовато? Сделать thread pool? Это интересно
![]() Как без лишних хлопот (без всяких счетчиков) узнать что клиент отвалился, не закрыв сокет? По крайней мере когда я вырубал консоль с работающим клиентом (в while(true) ), то серверу ничего не приходило от него. При штатном закрытии сокета прилетает сообщение нулевой длины.
0
|
|
|
Модератор
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
|
|
| 22.06.2016, 18:53 | |
|
Operok, а вы не передавайте в select null. Повторюсь - все может работать в одном потоке - и accept и recv. GUI я не рассматриваю как поток но если охото можно обработку и ему скормить через таймеры например или OnIdle. Смерть клиента можно по разному фиксировать. Да, при нештатном прерывании работы клиента вы можете сразу не увидеть что сокет закрылся, но рано или поздно система сама уведомит вас - тут уж ничего не изменишь разве что пинговать клиента
1
|
|
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
||
| 25.06.2016, 14:21 [ТС] | ||
timeval с низким значением, так сказать вместо того же Sleep(...) будет давать "отдыхать" потоку в отсутствие нагрузки. Но у меня вопрос насчёт accept и recv в одном потоке: лучше два последовательных select или одним обойтись (прослушивающий сокет и те, что для клиентов, в один fd_set)? Спасибо.
0
|
||
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|
| 06.07.2016, 19:25 [ТС] | |
|
Может кто подсказать по boost::asio?
Как реализовать работу аналогичную с select (т.е. ждать что на один из множества сокетов придёт сообщение, после чего обработать его и снова ждать)? Выходит что есть два основных варианта: синхронные сокеты и асинхронные. Первый можно использовать, если для работы с каждым клиентом будем заводить поток , поэтому только второй:вызов async_accept, в обработчике у полученного клиента, вызываем async_recive и следом следующий async_accept, в обработчике для async_recive обрабатываем сообщение и снова вызываем async_recive... и так до скончания веков. Как себя поведёт такой сервер при большом количестве клиентов? Какие ещё могут быть варианты реализации такого сервера с применением asio?
0
|
|
| 06.07.2016, 19:25 | |
|
Помогаю со студенческими работами здесь
6
Асинхронный TCP сервер-клиент: не выходит считать поток
TCP-client and TCP-Server Tcp server TCP server Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
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
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|