Чтение из сокетов C HTTP - PullRequest
       61

Чтение из сокетов C HTTP

1 голос
/ 23 февраля 2012

Мне интересно, как я могу узнать, все ли данные были получены из сокета.Это простой веб-прокси, и сейчас я обрабатываю часть запроса, поэтому то, что отправлено, должно заканчиваться на '\ r \ n \ r \ n'. Я понятия не имею, как долго будет длиться запрос.Я прочитал некоторые посты здесь, которые говорят, что я должен проверить, чтобы 0 возвращался из функции чтения?Но другие, которые говорят, 0 возвращается только тогда, когда клиент закрывает соединение?В противном случае я могу проверить последние символы в буфере и посмотреть, соответствуют ли они приведенному выше?

План состоит в том, чтобы просто загрузить считанные данные в буфер, сохранить эти данные, если есть еще данные, повторить.

Спасибо

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

HTTP не является тривиальным протоколом, принимая несколько RFC.Совпадение двойной строки / новой строки не подходит.Как минимум, вам придется проанализировать заголовки запроса, чтобы выяснить, какая кодировка существует, а затем, при необходимости, обработать тело запроса.

Просмотрите libcurl или любой издоступные веб-серверы с открытым исходным кодом, чтобы оценить сложность.

0 голосов
/ 23 февраля 2012

Зависит от того, используете ли вы блокирующий или неблокирующий сокет.

  • Если вы используете неблокирующий сокет, он может вернуть 0 и установить errno на EAGAIN. Это просто означает, что вам нужно подождать, прежде чем пытаться снова прочитать
  • Если вы находитесь в блокирующем сокете, 0 будет означать конец файла
0 голосов
/ 23 февраля 2012

Я думаю, что ваш план почти верен.Вам нужно продолжать загружать прочитанные данные в буфер, пока вы не найдете нужный шаблон '\r\n\r\n', тогда вы знаете, что у вас есть весь запрос и можете передать его логике обработки, удалить запрос из буфера и повторить.

...