C: адресация случая частичных заголовков при использовании select в контексте HTTP - PullRequest
2 голосов
/ 30 января 2010

Это относится к моему предыдущему вопросу, на который уже был дан ответ:

C: Когда я читаю, используя вызов выбора, как отслеживать данные?

Мой протокол на самом деле отправляет, сколько данных он собирается отправить, прежде чем он отправит какие-либо другие данные. Но вчера, когда я тестировал этот код с помощью браузера, у меня возник один вопрос:

Многие люди предложили мне проверить длину сообщения, но использовать сценарий браузера. HTTP-запрос браузера не имеет размера при первой отправке на сервер. Теперь, предполагая, что я использовал 256-байтовый буфер, как мне управлять структурой данных этого клиента, если я продолжаю получать частичные заголовки между каждым действием мультиплексирования? Продолжайте использовать realloc, поскольку я продолжаю получать больше данных, а затем, когда я сталкиваюсь с последовательностью завершения ('\ r \ n'), предположим, что все данные были получены?

Я имею в виду, что-то вроде этого:

typedef struct {
   int fd;
   char *data;
} CLIENT;

А затем продолжать использовать realloc для данных? Мне сказали выделить размер буфера для максимального заголовка протокола, но разве это единственный подход?

1 Ответ

1 голос
/ 30 января 2010

перераспределение буфера в размерах это нормально. Я бы выбрал немного больший буфер, чем 256 - 1024 по крайней мере или 4096. Выделение максимального размера буфера для протокола, такого как HTTP, на самом деле неосуществимо. Вы также можете создать абстракцию поверх буфера, которая может читать строки - так же, как fgets делает это с FILE *

Имейте в виду, что чтение фрагмента может читать последнюю часть заголовков HTTP и часть тела HTTP, если таковые имеются, поэтому вам нужно убедиться, что вы правильно разделите буфер, так как вы, вероятно, хотите отделить заголовок от тело. Вам также нужно будет найти заголовок Content-Length: проанализировать его, чтобы вы знали, как долго будет длиться тело.

...