Если возвращаемое значение read() совпадает с размером буфера, как мне прочитать остальную информацию? Если чтение будет вызвано снова, будет ли оно считывать следующий фрагмент данных или снова читать с самого начала, или информация, не прочитанная в буфер, будет безвозвратно утеряна?
Буфер в сокетах чтения
Ответы (1)
В сокете TCP (SOCK_STREAM) вы получаете следующий блок данных. Чтение из сокетов TCP аналогично чтению из файла.
В сокете дейтаграмм UDP (SOCK_DGRAM), если вашего буфера недостаточно для использования всей дейтаграммы, вы теряете остальную часть дейтаграммы. Последующее чтение будет потреблять следующую поступившую дейтаграмму.
person
selbie
schedule
29.07.2011
Как я говорю с любым ответом относительно сокетов TCP, даже если удаленная конечная точка вызвала отправку или запись с буфером N байтов, это не означает, что вы будете recv() или read() N байтов на вашей конечной точке. Сегментация, фрагментация, полоса пропускания и задержка могут привести к тому, что функции read() и recv() будут возвращать меньше запрошенного количества байтов. Будьте готовы зацикливаться на вызове чтения, пока не получите все байты, необходимые для продолжения.
- person selbie; 29.07.2011