Очень нужна критика, ощущение велосипедостроения
***Далее, сокеты неблокируемые, мультиплексируем с пом 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);
		//Запоминаем где-то состояние протокола на котор остановились
		...
	}
}
Возможно, такие подходы уже реализованы в каких-то библиотеках, но я о них не знаю.





