В настоящее время я программирую сервер на C, который общается через сокеты с использованием TCP.Предполагается, что клиент отправит {имя файла \ n} + {содержимое файла \ n}, и сервер сохранит эту информацию, а затем отправит ответ в случае успеха.Однако мы не можем быть уверены, что клиент действительно отправит правильную информацию в структурированном протоколе.
Зачастую в более простых ситуациях мы знаем определенное количество байтов, которые должны быть отправлены ранее, и можем ждать, пока это указанное числоБыл достигнут.В этом случае мы этого не делаем, и в настоящее время код выглядит следующим образом:
//buffer is a resize-able array,
//assume it's correct + don't worry about memory leakage for now
resizeablearray_t *buffer;
char data[255];
char retry = 1;
while (retry) {
int bytes = read(socketfd, data, 255);
if (bytes <= 0) {
fprintf(stderr, "Error %s\n", strerror(errno));
return;
}
push(buffer, data, bytes);
}
Поэтому перед нами огромная проблема: как мы указываем функции read () в c, что мы 'прочитали всю информацию о предыдущем звонке, и мы не должны звонить снова?
Функциональные блоки read () пока не будут прочитаны байты на сервере.Однако в нашей модели, если мы продолжим попытку чтения из-за короткого счета и в буфере ничего не останется, мы будем ждать НАВСЕГДА.
Есть ли какие-либо идеи о том, как указать перед другим вызовом read (), без какой-либо предварительной информации о входящем сообщении и его структуре, что мы можем выйти из цикла while и прекратить попытки чтения из сокета?