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