Необходима правильная структура данных для обработки сообщений от нескольких клиентов

62
6

В нашем приложении у нас есть сервер, который будет подключаться к нескольким клиентам. Для вашей справки это однопоточное приложение. Всякий раз, когда клиент хочет отправить какое-либо сообщение другому клиенту, он будет проходить через сервер. Всякий раз, когда клиент отправляет сообщение на сервер, он сохраняет сообщение в Dqueue. Сервер будет извлекать сообщения один за другим из Dqueue и он select() и проверит, доступен ли канал, в котором должно быть отправлено сообщение, или нет. Если да, то он будет отправлен, иначе он будет вставлять его обратно, чтобы мы могли обрабатывать другие сообщения. Но проблема с этим подходом заключается в том, что клиент C1 отправляет два сообщения S1 и S2. Теперь, когда сервер пытается отправить S1 другому клиенту C2, C2 был занят, в результате он будет выталкивать сообщение S1 в обратную сторону очереди. Теперь предположим, что при обработке S2 клиент C2 готов. Таким образом, сервер теперь может отправлять S2. Но проблема с этим - это сообщения доходят до C2 в обратном порядке (S2 S1).

Можете ли вы предложить, какая структура данных должна быть подходящей для этого, чтобы мы могли поддерживать один и тот же порядок сообщений?

спросил(а) 2021-01-19T22:01:22+03:00 2 месяца, 3 недели назад
1
Решение
62

Не используйте одну очередь для обработки всех сообщений. Каждому клиенту нужна отдельная очередь. Когда приходит сообщение, определите клиента, которому оно предназначено, и поместите сообщение в конец очереди клиента. Затем обновите логику своего сервера, чтобы отправить этому клиенту только верхнее сообщение в заданной клиентской очереди. Если клиент занят, не отправляйте верхнее сообщение. Если клиент готов, отправьте верхнее сообщение и удалите его из очереди clien.

ответил(а) 2021-01-19T22:01:22+03:00 2 месяца, 3 недели назад
45

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

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


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

ответил(а) 2021-01-19T22:01:22+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема