В первый раз я пытаюсь реализовать сетевой протокол через TCP / IP.Я разработал один, но я не уверен, что он эффективен.
Дизайн
Итак, вот моя идея: после открытия клиентом соединения TCP / IP с сервером,каждый раз, когда он хочет сделать запрос, он сначала отправляет размер запроса, за которым следует какой-то символ-разделитель (новая строка или пробел) и после этого фактического запроса (тот же принципал используется в HTTP, и я думаю, что в большинстве случаев эта идея используется).
Например, если клиент хочет отправить GET ASD, он фактически отправит 7 GET ASD (при условии, что пространство является разделителем).
Для серверной части, для каждого клиентского сервера есть буфер, в которомэто сохраняет входящие запросы.Всякий раз, когда он получает новый фрагмент символов от клиента, сервер добавляет его в соответствующий клиентский буфер.После этого сервер попытается получить длину содержимого запроса (в этом примере 7) и проверит, больше или равна остальная длина буфера.Если это так, сервер получит фактическое содержимое запроса, обработает и удалит его из буфера.
Реализация
Все это касалось разработки протокола, теперь некоторые замечания оРеальная реализация: я думаю, что основная проблема здесь заключается в эффективной реализации и управлении буферами.
Я думаю, что буфера размером 2 * MAX_SIZE_OF_ONE_REQUEST будет достаточно для обслуживания одного клиента, поскольку чанки, полученные сервером, могут одновременно содержать конец первого запросаи начало второго.Это мое предположение, если я ошибаюсь и нам нужно больше или меньше места, пожалуйста, дайте мне знать, почему.
Я думаю, что есть два способа хранения запросов в буфере, пока они не будут обработаны:
Всякий раз, когда сервер получает новый фрагмент символов, сервер добавляет его в правую часть буфера.Как только буфер будет содержать полный запрос, сервер обработает его и переместит влево все остальное в начале буферного пространства.
Некоторый циклический буфер, который не перемещаетсябуфер в начале после обработки запроса.
Это мои мысли о реализации буферов с учетом асинхронного ввода-вывода (сервер будет использовать epoll / kqueue / select для получения запросов от клиентов).Я думаю, что если сервер не будет использовать асинхронный ввод-вывод для связи с клиентами, то реализация буфера будет намного проще.
Также я не решил, как должен вести себя сервер, когда он получает некорректный запрос.Должно ли это закрыть связь с клиентом?
Возможно, я много писал, но мне действительно интересна эта тема и я хочу узнать как можно больше.Я думаю, что таких, как я, много, поэтому любые реальные проблемы, связанные с этой темой, и рекомендации по их решению будут очень полезны. 1.