Буфер в сокетах чтения

Если возвращаемое значение read() совпадает с размером буфера, как мне прочитать остальную информацию? Если чтение будет вызвано снова, будет ли оно считывать следующий фрагмент данных или снова читать с самого начала, или информация, не прочитанная в буфер, будет безвозвратно утеряна?


person Siyuan Ren    schedule 29.07.2011    source источник


Ответы (1)


В сокете TCP (SOCK_STREAM) вы получаете следующий блок данных. Чтение из сокетов TCP аналогично чтению из файла.

В сокете дейтаграмм UDP (SOCK_DGRAM), если вашего буфера недостаточно для использования всей дейтаграммы, вы теряете остальную часть дейтаграммы. Последующее чтение будет потреблять следующую поступившую дейтаграмму.

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