Я отправляю очень большие (64000 байт) датаграммы. Я понимаю, что MTU намного меньше, чем 64000 байт (типичное значение составляет около 1500 байт, из моего чтения), но я бы заподозрил, что произойдет одна из двух вещей: либо никакие датаграммы не пройдут (все больше 1500 байт будет автоматически отключен или вызвать ошибку/исключение) или 60 000 байтовых дейтаграмм будут переданы в около 43 1500 байтовых сообщений и переданы прозрачно.
В течение длительного времени (2000+ 64000 байт-дейтаграмм) около 1% (что кажется ненормально высоким для даже локальной сети) датаграмм снижается. Я мог бы ожидать этого по сети, где дейтаграммы могут выходить из строя, отбрасываться, фильтроваться и т.д. Однако я не ожидал этого при работе на локальном хосте.
Что вызывает неспособность отправлять/получать данные локально? Я понимаю, что UDP ненадежен, но я не ожидал, что он будет настолько ненадежным на локальном хосте. Мне интересно, просто ли это проблема времени, так как отправляющие и принимающие компоненты находятся на одной машине.
Для полноты я включил код для отправки/получения дейтаграмм.
Отправка
DatagramSocket socket = new DatagramSocket(senderPort);
int valueToSend = 0;
while (valueToSend < valuesToSend || valuesToSend == -1) {
byte[] intBytes = intToBytes(valueToSend);
byte[] buffer = new byte[bufferSize - 4];
//this makes sure that the data is put into an array of the size we want to send
byte[] bytesToSend = concatAll(intBytes, buffer);
System.out.println("Sending " + valueToSend + " as " + bytesToSend.length + " bytes");
DatagramPacket packet = new DatagramPacket(bytesToSend,
bufferSize, receiverAddress, receiverPort);
socket.send(packet);
Thread.sleep(delay);
valueToSend++;
}
Прием:
DatagramSocket socket = new DatagramSocket(receiverPort);
while (true) {
DatagramPacket packet = new DatagramPacket(
new byte[bufferSize], bufferSize);
System.out.println("Waiting for datagram...");
socket.receive(packet);
int receivedValue = bytesToInt(packet.getData(), 0);
System.out.println("Received: " + receivedValue
+ ". Expected: " + expectedValue);
if (receivedValue == expectedValue) {
receivedDatagrams++;
totalDatagrams++;
}
else {
droppedDatagrams++;
totalDatagrams++;
}
expectedValue = receivedValue + 1;
System.out.println("Expected Datagrams: " + totalDatagrams);
System.out.println("Received Datagrams: " + receivedDatagrams);
System.out.println("Dropped Datagrams: " + droppedDatagrams);
System.out.println("Received: "
+ ((double) receivedDatagrams / totalDatagrams));
System.out.println("Dropped: "
+ ((double) droppedDatagrams / totalDatagrams));
System.out.println();
}