Очень нужна критика, ощущение велосипедостроения
***Далее, сокеты неблокируемые, мультиплексируем с пом epoll (тут непринципиально)
В процессе обмена данными между клиентом и сервером размеры пакетов данных заранее неизвестны (указываются в самих пакетах), пакеты приходится разберать «налету», дочитывать из сокета требуемое колво-данных и возвращаться к прежнему состоянию протокола.
Алгоритм протокола я разбила на этапы каждый из которых завершается тем что нужно вычитать/отправить еще данных из сокета и возврат к ожиданию события EPOLLIN/EPOLLOUT.
Схематично:
//Сам протокол
protocol_stage_t protocol(protocol_stage_t stage)
{
if(stage_1)
{
//Какой-то алгоритм
...
//Если нужно получить/отправить данные, запоминаем состояние протокола и выходим
}
if(stage_2)
{
//Какой-то алгоритм
...
//Если нужно получить/отправить данные, запоминаем состояние протокола и выходим
}
....
}
//Ожидаем события
void event_loop()
{
//Если пришли данные
if(EPOLLIN)
{
...
//Восстанавливаем состоние протокола для клиента и продолжаем выполнение
...
last_stage = protocol(saved_protocol_state);
//Запоминаем где-то состояние протокола на котор остановились
...
}
//Если ушли данные
if(EPOLLOUT)
{
...
//Восстанавливаем состоние протокола для клиента и продолжаем выполнение
...
last_stage = protocol(saved_protocol_state);
//Запоминаем где-то состояние протокола на котор остановились
...
}
}
Возможно, такие подходы уже реализованы в каких-то библиотеках, но я о них не знаю.