#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
знает, сколько байтов он получил.