Подтвердить что ты не робот

Всегда ли дейтаграммы получаются полностью?

Большинство функций приема дейтаграммы, таких как c recv или read, javas Класс DatagramPacket или питоны SocketServer, включают возможность узнать количество полученных данных.

с:

int amount = recv(sock, buf, n, MSG_WAITALL);

Java:

int amount = datagramSocket.getLength();

питон:

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        amount = len (self.request[0])

Являются ли они надежными? Или возможно, что принимаются только части сообщения из-за, например, фрагментации пакетов или задержки сети?
Другими словами: когда я посылаю переменную длину блока данных через udp и получаю его на другом конце, являются ли эти значения величин равными размеру исходного фрагмента?

Edit:
ninjalj сделал хороший момент, и я хочу включить его здесь. Что происходит, когда функция приема прерывается, например, сигналом? Что происходит, когда два потока одновременно пытаются получить из одного и того же сокета?

4b9b3361

Ответ 1

датаграммы UDP не могут быть частично доставлены¹; они поставляются как есть или нет. Итак, вы можете быть уверены, что полученная датаграмма была отправлена ​​точно так же, как вы видите ее на конце приемника.

Изменить для включения комментариев воли, который является лучшим правилом (т.е. технически):

¹ Они могут быть фрагментированы на уровне IP, но сетевой стек на стороне получателя либо полностью восстановит датаграмму, либо передаст ее в процесс прослушивания, как отправленный, или не признает, что все данные были получены.

Ответ 2

Частичные дейтаграммы допустимы только с UDP Lite.