Я бы сказал, что цель этой функции - прочитать строку, заканчивающуюся \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-байтовая дейтаграмма).
Надеюсь, я ничего не пропустил.