LINUX.ORG.RU

архитектура асинхронного сервера на boost

 , , ,


0

1

Ребят, помогите, необходимо сделать типа чат, примерно как из примера http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/chat/chat_se... но со своими особенностями.

1) сообщения бинарные
2) могут быть большой длинны (например не строка, а 5мб)

Протокол типа:
Подключился клиент0, указал свой тип.
Подключился клиент1, указал свой тип и тд.
Если клиент передал сообщение без типа - сообщение получили все подключенные клиенты.
Если клиент передал сообщение с типом, его получили только пользователи с типом.

Тип - битовая маска, то есть можно составные типы.

Никак не могу решить как сделать правильно.

Меня смущает что

write_msgs_.push_back(msg);
сообщения сохраняются в векторе, не может ли произойти такое что затормозится отправка и вектор накопит кучу сообщений? Хотелось бы не выделять память под сообщение для каждого клиента.

Ещё я не очень понимаю в каком месте происходит освобождение памяти вот этой

chat_session_ptr new_session(new chat_session(io_service_, room_));

Ещё я не уверен будет ли всё это работать если io_service.run(); вызвать в 10 потоков? Не будет проблем? Типа много коннектов/много потоков

Правильно ли делать столько классов? Правильно ли весь код писать в одном main файле?

Ещё не понимаю вот что, почему чтение заголовка и тела разделяют на функции? можно же всё сделать в одной а в зависимости от флага выполнять действие?

Не могу найти ответы на свои вопросы. Кто разбирается в подобном, помогите определиться. А то что-то я загнался)



Последнее исправление: zeroday (всего исправлений: 1)

Ещё я не очень понимаю в каком месте происходит освобождение памяти вот этой

chat_session_ptr new_session(new chat_session(io_service_, room_));

При уничтожении последнего экземпляра умного указателя:

typedef boost::shared_ptr<chat_server> chat_server_ptr;

то есть при разрушении chat_server_list servers; - при выходе из блока try.

asaw ★★★★★
()
Ответ на: комментарий от mv

не для всех клиентов возможно подключение zeromq

zeroday
() автор топика

То, что в тегах обязательно? Если нет, то я бы тебе посоветовал взять erlang.

nanoolinux ★★★★
()

например не строка, а 5мб

Мои аппликухи оперируют строками по 300-1500 Мб - это уже «не строки»?

anonymous
()
Ответ на: комментарий от anonymous

Строки, только я думаю принцип работы с ними немного отличается, например ты же не напишешь вывод такой 1500 Мб строки на lineEdit формы, а со строкой в 200 байт запросто.

zeroday
() автор топика

Правильно ли весь код писать в одном main файле?

Нет, это слишком толсто.

trex6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.