Каждый раз, когда вы вызываете read( s, buf, buf_size )
, ядро копирует min( buf_size, bytes_available )
в buf
, где bytes_available
- число байтов, уже полученных и ожидающих в буфере приема сокета . Системный вызов read(2)
возвращает количество байтов, помещенных в буфер приложения, или -1
в случае ошибки, или 0
для подачи сигнала EOF
, то есть close(2)
сокета на передающей стороне. Таким образом, при повторном использовании буфера только его часть может быть перезаписана новыми данными. Также обратите внимание, что -1
оценивается как true
в C и C ++. Это, вероятно, тот случай, когда вы бьете.
printf(3)
ожидает строка с нулевым символом в конце для спецификатора формата %s
. Байты, считанные из сокета, могут не содержать байт '\0'
, что позволяет печатать printf(3)
до тех пор, пока он не найдет ноль где-то ниже. Это может привести к переполнению буфера .
Точки здесь:
- Всегда проверяйте значение, возвращаемое с
read(2)
- Если вы печатаете строки, считанные из сокета - всегда заканчивайте их нулем вручную.
Надеюсь, это поможет.