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

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

c:

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

] java:

int amount = datagramSocket.getLength();

python:

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

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

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

14
задан XZS 29 October 2011 в 07:50
поделиться