C Socket Reading слишком много данных - PullRequest
0 голосов
/ 16 ноября 2018

Я делаю сервер, который должен иметь возможность принимать запросы от нескольких клиентов.Чтобы убедиться, что я правильно читаю большие запросы, я сделал следующий фрагмент кода.

Запросы приходят в виде <START_REQUEST>a long message<END_REQUEST>

read(fd, buffer, BUFFER_SIZE);
// Keep Reading If Entire Message Not Recieved
int buffer_len = strlen(buffer);
char *end_tag = &buffer[buffer_len-strlen("<END_REQUEST>")];
while(strcmp(end_tag, "<END_REQUEST>") != 0) {

    char *temp_buffer;
    temp_buffer = malloc(BUFFER_SIZE);

    valread = read(fd, temp_buffer, BUFFER_SIZE);
    strcat(buffer, temp_buffer);

    free(temp_buffer);

    buffer_len = strlen(buffer);
    end_tag = &buffer[buffer_len-strlen("<END_REQUEST>")];
}

Однако иногда (очень часто) содержимое буферачто-то вроде: <START_REQUEST>a long message<END_REQUEST>somegarbagedataheremaybefromanotherequest? и, таким образом, цикл никогда не заканчивается.

Почему это может происходить?

1 Ответ

0 голосов
/ 16 ноября 2018

Как вы ожидаете, что strcat узнает, сколько байтов добавляется в буфер?

valread = read(fd, temp_buffer, BUFFER_SIZE);
strcat(buffer, temp_buffer);

После вызова read, valread содержит количество прочитанных вами байтов, и это единственное, что содержит эту информацию. Однако вы пытаетесь добавить данные, считанные в существующий буфер, без использования этого значения - поэтому невозможно, чтобы strcat мог знать, сколько байтов добавить в буфер. Неудивительно, что вы добавляете ненужную информацию, которую читали раньше.

Подобная проблема здесь:

read(fd, buffer, BUFFER_SIZE);
// Keep Reading If Entire Message Not Recieved
int buffer_len = strlen(buffer);

Здесь вы игнорируете возвращаемое значение read, поэтому у вас нет возможности узнать, сколько байтов вы прочитали. Как вы ожидаете, что strlen выяснит, сколько байтов read помещено в буфер?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...