Этот ответ состоит из двух частей.
Во-первых, проблема задержки и тайм-аута: вам действительно нужно иметь дело с таймаутами, так как обычно невозможно определить, разорвано ли соединение TCP.В этом вопросе есть еще вопросы по этому вопросу: сокет TCP в Unix - сервер уведомлений Я отправил запрос
Во-вторых, определен формат запроса HTTP (в RFC 2616, раздел 5 ) следующим образом:
Request = Request-Line ; Section 5.1
*(( general-header ; Section 4.5
| request-header ; Section 5.3
| entity-header ) CRLF) ; Section 7.1
CRLF
[ message-body ] ; Section 4.3
По сути, вы получаете строку запроса (например, GET /index.html HTTP/1.1
), за которой следуют несколько строк заголовка (без пустых строк).Затем список заголовков заканчивается пустой строкой.Все концы строк представлены с помощью CRLF ("\r\n
").
В дополнение к этому некоторые запросы также имеют тело (обычно те, которые используют POST
или PUT
).Если в запросе содержится тело сообщения, его длина будет указана либо в заголовке Content-Length
, либо с использованием разделителей через кодировку chunked Transfer .