Большинство функций приема дейтаграмм, таких как 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 сделал хороший точку, и я хочу включить ее сюда. Что происходит, когда функция приема прерывается, например, сигналом? Что происходит, когда два потока одновременно пытаются получить из одного и того же сокета?