Хорошо Вы могли использовать шаблонный шаблон метода, где существует несколько точек переопределения, что у всех есть реализации по умолчанию, но где объединенные реализации по умолчанию собой не законны - любая функциональная реализация должна разделить на подклассы.
(И да, мне не нравится шаблонный шаблон метода;))
Вызов malloc (4)
действительно выделяет только четыре байта. Просто совпадение, что следующий байт в памяти оказался NUL, который завершил вашу строку для вас.
В случае, когда вы разместили буфер символов [4]
на в стеке следующим байтом оказался 'x'
, за которым следовало что-то другое, поэтому ваша строка просто продолжалась до тех пор, пока не был найден следующий байт NUL.
Функции сокета работают только с байтами, и не Не обрабатывайте байты как строки с завершающим NUL или чем-то еще. Вы получаете именно то, о чем просите.
Для правильного завершения NULL необходимо 5 символов. Завершающий NULL считается за единицу, поэтому, если нам нужно N символов, выделите N + 1. Или, наоборот, для выделения N у вас есть доступный N-1 для вашего контента.
Я подозреваю, что разница - совпадение. Когда вы используете буфер как строку, например, в printf (), он будет считываться за его предел, пока не будет найден '\ 0'.
В обоих случаях следует использовать buffer [5] или malloc (5). В memset () нет необходимости, лучше поставить буфер [4] = '\ 0' после recv ().
Вы не можете получить более 4 char
s, так как вы только запросили recv
, чтобы в ваш файл было помещено не более 4 байтов. буфер. Вы должны проверить возвращаемое значение recv
, чтобы увидеть, сколько байтов было фактически возвращено.
Я подозреваю, что проблема в том, что вы не заботитесь о выводе только 4 char
s из любой подпрограммы, генерирующей вывод. Один из способов отображения начального содержимого буфера char
, который, возможно, не завершается нулевым символом, состоит в следующем.
printf("%.4s\n", buffer);
Полный фрагмент вызова recv
может быть таким:
#define MAX_BUF_LEN (512)
char buffer[MAX_BUF_LEN];
ssize_t count = recv(socket, buffer, MAX_BUF_LEN, 0);
if (count > 0)
printf("%.*s\n", count, buffer);