История изменений
Исправление firkax, (текущая версия) :
Нет, UDP-пакет это буфер целиком. Шлёт один раз 3000 байт - примешь их именно целиком как 3000 байт. Принять их двумя частями нельзя. И наоборот, если отправил два раза по 10 байт - примешь именно 2 раза по 10 байт, принять сразу 20 нельзя. То, что они где-то на низком уровне могут передаваться частями - от приложения всё так же прячется, то есть про это можешь не думать.
А насчёт порядка пакетов - дело вот в чём. Если ты сделаешь два send() то они могут приняться двумя recv-ами не в том порядке как их отправляли. Или вообще не дойти до получателя. Или продублироваться (сделал один send, а принялся он два раза - скорее всего одинаковых).
На практике нарушение порядка пакетов или их дублирование в современном инете это очень редкое событие. А вот потеряться пакет может легко, особенно в каком-нить мобильном подключении.
К TCP это всё неприменимо вообще, у него понятия «пакет» на уровне системных вызовов send() и recv() не существует. Просто байты один за другим идут и очередь соблюдается средствами ОС. То есть в TCP, в отличие от UDP, можно послать 2 раза по 10 байт и принять один раз 20, или наоборот послать 20 и принять 2 по 10.
Исправление firkax, :
Нет, UDP-пакет это буфер целиком. Шлёт один раз 3000 байт - примешь их именно целиком как 3000 байт. Принять их двумя частями нельзя. И наоборот, если отправил два раза по 10 байт - примешь именно 2 раза по 10 байт, принять сразу 20 нельзя.
А насчёт порядка пакетов - дело вот в чём. Если ты сделаешь два send() то они могут приняться двумя recv-ами не в том порядке как их отправляли. Или вообще не дойти до получателя. Или продублироваться (сделал один send, а принялся он два раза - скорее всего одинаковых).
На практике нарушение порядка пакетов или их дублирование в современном инете это очень редкое событие. А вот потеряться пакет может легко, особенно в каком-нить мобильном подключении.
К TCP это всё неприменимо вообще, у него понятия «пакет» на уровне системных вызовов send() и recv() не существует. Просто байты один за другим идут и очередь соблюдается средствами ОС. То есть в TCP, в отличие от UDP, можно послать 2 раза по 10 байт и принять один раз 20, или наоборот послать 20 и принять 2 по 10.
Исходная версия firkax, :
Нет, UDP-пакет это буфер целиком. Шлёт один раз 3000 байт - примешь их именно целиком как 3000 байт. Принять их двумя частями нельзя. И наоборот, если отправил два раза по 10 байт - примешь именно 2 раза по 10 байт, принять сразу 20 нельзя.
А насчёт порядка пакетов - дело вот в чём. Если ты сделаешь два send() то они могут приняться двумя recv-ами не в том порядке как их отправляли. Или вообще не дойти до получателя. Или продублироваться (сделал один send, а принялся он два раза - скорее всего одинаковых).
К TCP это всё неприменимо вообще, у него понятия «пакет» на уровне системных вызовов send() и recv() не существует. Просто байты один за другим идут и очередь соблюдается средствами ОС. То есть в TCP, в отличие от UDP, можно послать 2 раза по 10 байт и принять один раз 20, или наоборот послать 20 и принять 2 по 10.