Функция recv()
не \0
завершает буфер, обнуляет буфер в функции recv_sckt()
.
ssize_t recv_sckt ( char *const msg )
{
// Zero out the buffer
memset(msg, '\0', MAX_LEN_MEG);
ssize_t recv_ret = recv( clientID, msg, MAX_LEN_MSG, 0 );
if ( recv_ret == -1 )
{
printf( "Error, recv()\n" );
fprintf( stderr, "recv: %s (%d)\n", strerror( errno ), errno );
exit( EXIT_FAILURE );
}
msg[ strcspn( msg, "\n" ) ] = 0;
msg[ recv_ret ] = 0;
return recv_ret;
}
Обновление:
А-а-а, я только что понял- строка msg[strcspn(msg, '\n')] = 0;
заменяет первый \n
на 0 (или \0
).
Таким образом, фактически он делает часть буфера нечитаемой.
Возможно вместо
return recv_ret;
Попробуйте:
return strlen(msg);
Надеюсь, что это решит, я не уверен, что сервер на самом деле отправляет вам.
Альтернативный метод может бытьудалите эту строку msg[strcspn(msg, '\n')] = 0;
, хотя я не уверен, какой мусор может находиться за пределами этого \n
, поэтому могут иметь нежелательные результаты.
Кроме того, вам все равно нужно убедиться, что буфер правильно завершен.
Обновление # 2
Я не уверен насчет сервера и того, что он отправляет, в той строке, которую я указал:
msg[strcspn(msg, '\n')] = 0;`
В основном находит первый \n
символв буфере возврата и превращая его в символ 0 или \0
.\0
сообщает таким функциям, как printf()
, где заканчивается буфер.
Однако функция recv()
возвращает число, сообщающее, сколько байтов получено.Представим себе в качестве аргументов, что сервер возвращает эту строку:
George\nabcdef
Строка msg[strcspn(msg, '\n')] = 0;
находит это \n
и заменяет его на \0
(или буквальное значение 0).
Итак, recv()
говорит вам, эй, смотрите - я на самом деле читал в 13
байтах, но вы сделали некоторые из этих байтов недоступными, потому что они лежат за пределами \0
терминатора.Вы найдете множество вещей о завершении строки в c здесь на SO и с поиском Google.Вы можете сделать, как я сказал в моем первоначальном ответе, и завершить нулем весь буфер:
memset(msg, '\0', buffer_size);
Чтобы данные заканчивались нулем, я бы попробовал - удалите строку msg[strcspn(msg, '\n')] = 0;
и напечатайтеполный буфер, включая этот \n
и все, что находится за его пределами, может быть, мусор, может быть, просто пробел ... кто знает?!
Надеюсь, это имеет смысл.