Большинство функций приема дейтаграмм, таких как c's recv или read, класс javas DatagramPacket или pythons SocketServer, включают возможность узнать количество полученных данных.
c:
int amount = recv(sock, buf, n, MSG_WAITALL);
Джава:
int amount = datagramSocket.getLength();
питон:
class MyUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
amount = len (self.request[0])
Надежны ли они? Или возможно, что принимаются только части сообщения, например, из-за фрагментации пакета или задержки в сети?
Другими словами: когда я отправляю блок данных переменной длины через udp и получаю его на другом конце, эти значения суммы точно равны размеру исходного чанка?
Редактировать:
ninjalj сделал хорошее замечание, и я хочу включить его сюда. Что происходит, когда приемная функция прерывается, например, сигналом? Что происходит, когда два потока одновременно пытаются получить данные из одного и того же сокета?