2014-08-31 4 views
2

Я прочитал некоторые противоречивые вещи о том, как работают каналы дейтаграммы UDP/Java. Мне нужно знать несколько вещей:java datagramchannel потеря данных

  • ли UDP имеют наследовать путь, если сказать пакет, принимаемый целиком, так и в порядке, до .read (ByteBuffer б) называется? Я прочитал хотя бы одну статью, в которой говорится, что UDP inherit'ly сбрасывает неполные или неточные данные.

  • Является ли datagramchannel обрабатывать одну отправку (буфер ..) как один пакет дейтаграмм? что, если его частичная передача?

  • Может ли читать (..) читать более одного пакета данных, в результате чего данные отбрасываются, если буфер, предоставленный в качестве аргумента команд, предназначен только для обработки одного пакета данных?

ответ

5

ли UDP имеют [присущий] способ сказать, если пакет, который получил целое, и в порядке, до .read (ByteBuffer б) называется? Я прочитал хотя бы одну статью, в которой говорится, что UDP inherit'ly сбрасывает неполные или неточные данные.

Ни одно утверждение не является правильным. Было бы точнее сказать, что IP имеет возможность узнать, все ли фрагменты дейтаграммы пришли, а затем и только тогда он даже представляет его для UDP. За сборку отвечает уровень IP, а не UDP. Если фрагменты не поступают, UDP даже не видит этого. Если они истекают до завершения сборки, IP отбрасывает их.

До/после read() называется неактуальным.

Имеет ли datagramchannel один send(buffer..) как один пакет дейтаграмм?

Да.

Что делать, если это частичная отправка?

В UDP такой вещи нет.

Может read(..) читать больше, чем один пакет данных

UDP, чтение будет возвращать точно и только один датаграмм или неудачу.

В результате данные отбрасываются, если буфер, предоставленный в качестве аргумента команд, предназначен только для обработки одного пакета данных?

Не может быть.

Повторите свой комментарий ниже, что касается совершенно другого вопроса, обычной методикой обнаружения усечения является использование буфера, большего, чем самая большая ожидаемая датаграмма. Затем, если вы когда-нибудь получите датаграмму такого размера, (i) это ошибка протокола приложения, и (ii) она также может быть усечена.

+1

«Не может быть.«Я ссылался на эту строку из api о чтении: если в дейтаграмме больше байт, чем осталось в данном буфере, оставшаяся часть дейтаграммы отбрасывается молча. Есть ли способ рассказать размер пакета перед чтением чтобы избежать этого? – user1908813

+1

@ user1908813 №. Обычным методом является использование буфера, большего, чем самая большая ожидаемая датаграмма. Затем, если вы когда-либо получаете дейтаграмму такого размера, (i) это ошибка протокола приложения, и (ii) она может были также усечены. – EJP

+0

Также вы сказали, что IP-учетные записи для отсутствующих пакетов, но что из-за порядка? – user1908813

Смежные вопросы