Короткий ответ на ваш вопрос заключается в том, что я буду читать по одному байту за раз. К сожалению, это один из тех случаев, когда есть плюсы и минусы для обоих случаев.
Для использования буфера является тот факт, что реализация может быть более эффективной с точки зрения сетевого ввода-вывода. Против использования буфера, я думаю, что код будет более сложным, чем однобайтовая версия. Таким образом, компромисс между эффективностью и сложностью. Хорошая новость заключается в том, что вы можете сначала внедрить простое решение, профилировать результат и «обновить» до буферизованного подхода, если тестирование покажет его целесообразность.
Также, просто чтобы заметить, в качестве мысленного эксперимента я написал некоторый псевдокод для цикла, который выполняет чтение http-пакетов на основе буфера, включенный ниже. Сложность реализации буферизованного чтения не кажется плохой. Обратите внимание, что я не уделял много внимания обработке ошибок или проверял, будет ли это работать вообще. Однако следует избегать чрезмерной «двойной обработки» данных, что важно, поскольку это приведет к снижению эффективности, которая была целью этого подхода.
#define CHUNK_SIZE 1024
nextHttpBytesRead = 0;
nextHttp = NULL;
while (1)
{
size_t httpBytesRead = nextHttpBytesRead;
size_t thisHttpSize;
char *http = nextHttp;
char *temp;
char *httpTerminator;
do
{
temp = realloc(httpBytesRead + CHUNK_SIZE);
if (NULL == temp)
...
http = temp;
httpBytesRead += read(httpSocket, http + httpBytesRead, CHUNK_SIZE);
httpTerminator = strstr(http, "\r\n\r\n");
}while (NULL == httpTerminator)
thisHttpSize = ((int)httpTerminator - (int)http + 4; // Include terminator
nextHttpBytesRead = httpBytesRead - thisHttpSize;
// Adding CHUNK_SIZE here means that the first realloc won't have to do any work
nextHttp = malloc(nextHttpBytesRead + CHUNK_SIZE);
memcpy(nextHttp, http + thisHttpSize, nextHttpSize);
http[thisHttpSize] = '\0';
processHttp(http);
}