2015-04-15 4 views
1

Я хочу отправить дейтаграмму широковещательной передачи UDP на несколько устройств в сети, включая само устройство-отправитель. Цель состоит в том, чтобы все устройства получали данные в то же самое время (хорошо, +/- 5 мс в порядке).принудительное распространение UDP по сети (отключить loopback)

Проблема заключается в том, что сетевой интерфейс на передающем устройстве зацикливается данные обратно, поэтому он сразу же получил (в отличие от других устройств, где задержка сети входит в игру - совсем немного для Wi-Fi, например)

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

Другая идея, которую я имел: Возможно ли создать виртуальный сетевой интерфейс для отправки широковещательного пакета и прослушивания на другом интерфейсе, который получает его только через сеть?

Я пытаюсь сделать это на C на машине Linux. Любая помощь будет принята с благодарностью!

+1

Я думаю, вы неправильно поняли, как работают сети. Вы не можете отправить сообщение себе, подождите его в кабеле/​​воздухе за X миллисекунды, а затем вернитесь. Вы хотите, чтобы какой-либо целевой ящик/маршрутизатор возвращал вам сообщение? Вам нужен какой-то отложенный интерфейс обратной петли? – tux3

+1

Передаваемые/многоадресные пакеты фактически не отправляются. Они всегда ставятся в очередь в очереди ввода интерфейса, поэтому вы всегда получаете их ** перед ** удаленным сайтом. Кстати, вы не можете получить пакет в ТОЧНОМ месте, так как они находятся в разных местах, и вам приходится учитывать задержку передачи, мосты, маршрутизацию и несколько других вещей, которые могут задержать поставки. Почему вы считаете, что 5 мс в порядке, а не 0,5 с? Сетевые полосы варьируются от bps до Gbps (даже Tbps, теперь). –

+1

Лучше объясните, что является вашей ** настоящей ** проблемой, а не тем, что у вас есть в голове, чтобы спланировать решение. –

ответ

2

UDP отправляются как полезная информация IP. Маршрутизация IP-пакетов является доменом IP-стека. Он решает, как пакет переносится в пункт назначения. Когда IP-стек обнаруживает, что конечным пунктом является локальный хост, он будет устанавливать пакет в очереди приема, и пакет будет доступен немедленно. Если очереди отправки ваших адаптеров заполняются, у вас будет задержка. Таким образом, вы не можете синхронизировать эту концепцию.

Если вам нужна жесткая синхронизация, вы должны использовать NTP или SNTP, чтобы синхронизировать часы и определить время начала комментария для желаемой общей операции.

Редактировать: Протокол (S) NTP предназначен для синхронизации на уровне миллисекунды. Вы получите точность, которую вы не сможете достичь с помощью любой передачи UDP-пакетов из-за причины, описанной выше.

+0

И в linux гораздо более удобно синхронизировать часы с помощью NTP и выбрать подходящую эпоху, чтобы начать процесс в то же время на нескольких машинах. –

+0

NTP не работает в моем случае. Часы на целевых устройствах недостаточно точны (старое и дешевое оборудование). Мне нужно быть в диапазоне <10 мс ... – Daniel

+0

@ Даниэль вы можете уточнить, что вы имеете в виду под «неточным». Является ли частота кристаллов неправильной, неустойчивая частота? Кристаллы 32768 кГц обычно имеют лучшую точность, чем высокочастотные кристаллы ПК и микроконтроллера. – harper

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