Я создал приложение C ++ с использованием WinSck, в котором реализован небольшой (обрабатывает лишь несколько необходимых мне функций) http-сервер. Это используется для связи с внешним миром с помощью http-запросов. Это работает, но иногда запросы не обрабатываются правильно, потому что синтаксический анализ не выполняется. Теперь я совершенно уверен, что запросы правильно сформированы, поскольку они отправляются основными веб-браузерами, такими как firefox / chrome или perl / C # (которые имеют http-модули / dll).
После некоторой отладки я обнаружил, что проблема заключается в получении сообщения. Когда сообщение приходит более чем в одну часть (оно не читается в одном вызове recv()
), иногда анализ завершается неудачно. Я много раз пытался решить эту проблему, но, похоже, ничто не является достаточно надежным.
Что я делаю сейчас, так это то, что я читаю данные, пока не найду последовательность "\r\n\r\n"
, которая указывает конец заголовка. Если WSAGetLastError()
сообщает что-то еще, кроме 10035 (соединение закрыто / не удалось), прежде чем такая последовательность будет найдена, я отбрасываю сообщение. Когда я знаю, что у меня есть весь заголовок, я анализирую его и ищу информацию о длине тела. Однако я не уверен, является ли эта информация обязательной (я думаю, что нет), и что мне делать, если такой информации нет - значит ли это, что тела не будет? Другая проблема заключается в том, что я не знаю, должен ли я искать "\r\n\r\n"
после тела (если его длина больше нуля).
Кто-нибудь знает, как надежно разобрать http-сообщение?
Примечание: я знаю, что существуют реализации http-серверов. Я хочу свой по разным причинам. И да, изобретать велосипед плохо, я тоже это знаю.