Наконец, оправдание, чтобы выкопать мои книги Стивенса из моих старых офисных коробок.
Если буфер достаточно большой, стандартные функции сокетов recv()
и recvfrom()
Беркли никогда не будут возвращать частичную дейтаграмму. Дейтаграмма не доступна приложению, пока ядро полностью не получит и не соберет дейтаграмму.
Интересно, что сегодня это не так уж много (вообще?), Другие сетевые программные интерфейсы не согласны с поведением, когда предоставленный буфер слишком мал:
Традиционная версия сокетов API в Беркли обрезает дейтаграмму, отбрасывая лишние данные. Будет ли приложение уведомлено, зависит от версии. (4.3BSD Reno и более поздние версии могут уведомить приложение о том, что датаграмма была усечена.)
API сокетов в SVR4 (включая Solaris 2.x) не усекает дейтаграмму. Любые лишние данные возвращаются в последующих чтениях. Приложение не уведомлено о том, что из одной дейтаграммы UDP выполняется несколько операций чтения.
API TLI не сбрасывает данные. Вместо этого возвращается флаг, указывающий, что доступно больше данных, и последующие чтения приложением возвращают оставшуюся часть дейтаграммы.
(Стивенс, иллюстрированный TCP / IP, том 1, стр. 160)