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