Проблемы с читателем буфера сокета - PullRequest
0 голосов
/ 28 мая 2019

Мне дали этот код для назначения, в нем должны быть ошибки, но я не могу понять, что должна делать эта функция, не говоря уже о том, есть ли с ней проблемы ...

Я предполагаю, что он должен считывать буфер построчно, но я никогда не видел, чтобы это делалось таким образом до

Буфер, отправляемый в функцию, пуст.

int read_line(int sock, char *buffer) {
    size_t length = 0;

    while (1) {
        char data;
        int result = recv(sock, &data, 1, 0);

        if ((result <= 0) || (data == EOF)){
            perror("Connection closed");
            exit(1);
        }

        buffer[length] = data;
        length++;

        if (length >= 2 && buffer[length-2] == '\r' && buffer[length-1] == '\n') {
            buffer[length-2] = '\0';
            return length;
        }
    }
}

Заранее спасибо!

1 Ответ

2 голосов
/ 28 мая 2019

Я бы сказал, что цель этой функции - прочитать строку, заканчивающуюся \r\n, из потока сокетов и сохранить ее в массиве символов в виде строки, поэтому \0 (символ завершения строки).

Хорошо, так что не так с кодом?

Я бы начал с входного параметра char *buffer - внутри функции вы не знаете его размера, поэтому вы не можете проверить, превышает ли он ограничение по размеру и может ли это привести к переполнению буфера. Поэтому было бы лучше отправить длину буфера в качестве параметра и проверить каждый полученный байт, можно ли его сохранить.

EOF - он определен как -1 и в этом случае на самом деле не имеет никакого смысла, потому что ничто не будет устанавливать вашу переменную data равной EOF. Единственное, на что нужно обратить внимание - это конец потока сокета ( документация recv ). И здесь является примером использования EOF. Не стесняйтесь снимать (data == EOF) из условия.

Допустим, вы получаете все регулярно и получаете последний вход, и соединение закрывается, поэтому вы вводите этот случай:

if ((result <= 0) || (data == EOF)){
    perror("Connection closed");
    exit(1);
}

Проблема в том, что вы не обработаете свою последнюю строку, и программа просто завершится. Хотя я могу ошибаться, поскольку не знаю, когда соединение регулярно отключается. И небольшое замечание: результат, равный 0, не рассматривается как ошибка, но является обычным завершением соединения (или получена 0-байтовая дейтаграмма).

Надеюсь, я ничего не пропустил.

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