Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
10 / 8 / 2
Регистрация: 02.12.2018
Сообщений: 142

Ожидание ответа от клиента после вызова функции получения какой либо информации

20.12.2021, 12:11. Показов 5303. Ответов 2

Студворк — интернет-сервис помощи студентам
Всем привет. Пишу приложения клиент/сервер и стало интересно реализовать одну вещь.
Допустим клиент подключен к серверу и сервер запрашивает у клиента какие ни-будь данные. Делает сервер это с помощью функции:
C++
1
GetClientData(int client, char *pnamedest, int destlen)
Данные находится только у клиента и их нет на сервере, по этому необходимо запросить их у клиента, приостановить выполнение кода в данном месте до получения ответа от клиента, или продолжить выполнение по таймауту, если клиент ничего не ответит за нужный промежуток времени.

Пока что я делаю такие вещи через функции обратного вызова, т.е:
C++
1
2
3
4
5
6
7
8
9
10
GetClientData(int client, char *pnamedest, void (*request_data_fn)(int client, char *data, int len));
 
//функция обратного вызова, которая сработает после получения ответа от клиента
void request_result(int client, char *p_data, int len)
{
      printf("Приняты данные: '%s'  len: %d\n", p_data, len);
}
 
//где то в коде, запрос данных
GetClientData(client, request_result);
При отправке запроса, в очереди я сохраняю адрес клиента который должен мне ответить, и сохраняю что я у него запросил, чтобы соотнести ответ клиента и проверить верно ли клиент отправил данные. Если данные были получены верно, я снимаю клиента из очереди и отправляю данные в функцию обратного вызова, иначе, я так же убираю клиента из очереди по таймауту и вызываю этот каллбек с NULL во всех параметрах.
На данный момент функция GetClientData просто добавляет клиента в очередь, а проверяется очередь при каждом пришедшем на сервер пакете от любого клиента.

Я бы хотел уберечь себя и других от раздувания кода в виде функций обратного вызова, по этому подумал об этой идее.
Да и просто даже интересно, какие варианты реализации существуют.

Сейчас как я думаю, можно сделать цикл в котором будет идти Sleep и при таймауте или ответе он будет завершаться, но опять же я не уверен что это хорошая реализация. Кто то реализовывал подобное?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2021, 12:11
Ответы с готовыми решениями:

Ожидание ответа от клиента
Метод в котором выполняются вычисления, сигналом signalAction передаем ссылку слоту slotActionPlayer bool Game::playerAct() { ...

Запускать js функцию после получения ответа php функции
Доброго времени. Студент, столкнулся с такой проблемой. Делаю web-интерфейс для работы с mysql таблицей. Все минимально, кнопки...

Как вернуться к началу компиляции после выполнения какой либо функции?
В общем даже не знаю как сформулировать свой вопрос. как вернуться к началу компиляции после выполнения какой либо функции? допустим у...

2
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
22.12.2021, 11:15
Skymotion,
1) Сервер не должен приостанавливаться при ожидании ответа от клиента. Это неправильно. Сервер должен заниматься обработкой запросов от других клиентов в это время.

2) Для правильной реализации нужны неблокирующие сокеты. Тогда:
а) Сервер отправляет запрос клиенту и продолжает работу. Объект, обозначающий клиента на стороне сервера, переводится в режим "подготовка данных". Если у вас нет такого объекта, то самое время его сделать. Будет проще.
Естественно, если клиентов несколько, то и объектов несколько. Они в списке;
б) Мультиплексор неблокирующих сокетов засыпает в ожидании событий от клиентов (новые подключения, отключения старых ответы от других клиентов, и в том числе ответ на ваш запрос из пункта а);
в) таймер может быть добавлен в этот же мультиплексор (это проще или сложнее сделать в зависимости от ОС, для которой вы пишете; в специализированных библиотеках на основе сокетов как правило уже есть свои таймеры, которые так работают);
г) если ответа от клиента нет, а таймер истек, то с объекта клиента снимается режим "подготовка данных";
д) если данные от клиента пришли, то объект клиента переводится в режим "данные готовы".

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

Использование sleep на сервере - это плохой тон (и необоснованное снижение времени отклика сервера).
1
10 / 8 / 2
Регистрация: 02.12.2018
Сообщений: 142
26.12.2021, 23:20  [ТС]
DrOffset, здравствуйте. То есть мне лучше все же использовать функции обратного вызова по мере поступления от клиента какой либо информации и забыть о остановке потока в ожидании.
Мой сервер и клиент на UDP.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.12.2021, 23:20
Помогаю со студенческими работами здесь

Вывод скрытого блоки либо информации после авторизации либо регистрации пользователя на сайте
Ув. знатоки, такой вопрос, есть сайт, нужно чтобы после авторизации "Блок <div> с регистрацией" заменялся на другой блок, как это...

Заставка(ожидание) на время выполнения какой-либо операции
Подскажите как создать заставку на время выполнения операции, допустим пока экспортируются данные в файл.

Ожидание ответа от функции
Здравствуйте!! нужна помощь. Есть две строчки кода (Node Js): первый: var findUser = usersDATA.findOneByEmail(req.body.email); ...

После получения ответа снова вывести меню
print(name, 'Сколько Вам лет?') age=int(input()) days=age * 365 minutes=age*365*24*60 secund=age*365*24*60*60 print('Хотите...

Почему сокет закрывается, сразу после получения ответа?
Есть пример клиента на Node.js var net = require('net'); var client = new net.Socket(); client.connect(3333, 'localhost',...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru