buff[4096] = {0};
size_t bytesReceived = serverSocket->receive_from(asio::buffer(buff), clientEndPoint);
if (bytesReceived != 0) {
auto message = message(buff);
std::thread t([message]() {
process(message);
});
t.join();
}
}
Который обрабатывает входящее сообщение, откуда бы оно не пришло, адрес клиента записывает в clientEndPoint и запускает обработку сообщения в отдельном треде.
Но в методе process() описан сценарий диалога - что послать обратно по этому адресу и что ожидать в ответ, с тем же receive_from под капотом. Но дело в том что сообщение которое относится к диалогу может приняться в этом куске который я скинул, а не внутри process()
Как это разрешить, и какой вообще нормальный архитектурный подход к такой проблеме?
делать один receive_from, завести dialog id, по треду на запрос весело =)
Стандартная схемка заводить сессию на каждый коннект, которая по сути fsm. Куски этой fsm реакции на сетевые или не сетевые события. Всё состояние хранится в членах класса или ссылаются на разделённые переменные. А вообще иди экзамплы от asio проботай
Обсуждают сегодня