Количество байтов recv()’d больше, чем объем данных, хранящихся в буфере?

#c #sockets

#c #сокеты

Вопрос:

Мой код выглядит примерно так:

 char buffer[BUFSIZE];
while (1) {
    memset(buffer, 0, BUFSIZE);
    ssize_t received = recv(csock, buffer, BUFSIZE, 0);
    printf("Received %lu blen %lun", received, strlen(buffer));
    ...
}
  

Иногда вывод моего оператора printf:

 Received 1045 buffer GETFILE OK 233174

���� blen 25
  

Как это возможно? Если recv() хранит все полученные данные в буфере, не strlen(buffer) должно быть количество полученных байтов?

Комментарии:

1. recv() не записывает '' (если он не прочитал один). strlen() это неправильный инструмент, потому что нет гарантии, что «буфер» является строкой

2. Вы имеете в виду, что я должен обнулить буфер путем добавления buffer[received] = '' , прежде чем использовать в нем какие-либо строковые функции?

3. Если это то, что вы хотите, да . Убедитесь, что вы избегаете переполнения буфера.

4. @bard лучшим решением является использование received значения, которое recv() возвращается, и вообще не полагаться на изменение содержимого buffer . char buffer[BUFSIZE]; ssize_t received; while ( (received = recv(csock, buffer, BUFSIZE, 0)) > 0 ) { printf("Received %lun%.*sn", received, received, buffer); }

Ответ №1:

strlen подсчитывает количество байтов до тех пор, пока один из байтов не станет равным 0.

Он не сообщает вам, сколько байтов получено. Это просто не то, что он делает.

Только recv знает, сколько байтов он получил.