Как узнать IP-адрес удаленного хоста с помощью широковещательного сообщения UDP? - PullRequest
1 голос
/ 11 мая 2010

Я занимаюсь разработкой встроенной системы и очень плохо знаком с этим TCP \ IP. Моя проблема в том, что после того, как я установил свою плату в локальной сети, и эта плата будет динамически получать свой IP-адрес, она должна обмениваться данными с клиентским приложением, работающим на одном из ПК (кроме сервера DHCP) в сети. Для связи с этой новой платой клиентское приложение должно знать IP-адрес платы. Как узнать IP-адрес платы? Будет ли UDP-трансляция работать для этой цели? Если да, пожалуйста, объясните подробно, так как я не могу этого понять. Пожалуйста, предоставьте мне пример кода на языке C, если это возможно.

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Основная идея:

  • Встроенное системное программное обеспечение открывает сокет UDP, связывает его с известным портом и устанавливает параметр сокета SO_BROADCAST с помощью setsockopt(). Затем он вызывает recvfrom() для ожидания пакетов в цикле.
  • Определить формат пакета, который позволяет указывать тип пакета. Определите тип пакета «обнаружения».
  • Если встроенная система получает пакет «обнаружения», она отвечает отправителю пакетом, который может содержать его имя / серийный номер / время работы / статус.
  • Клиентское программное обеспечение открывает сокет UDP, устанавливает параметр сокета SO_BROADCAST и отправляет пакет типа «обнаружение» на известный порт и локальный широковещательный адрес.
  • Клиентское программное обеспечение ожидает ответа от каждой встроенной системы с recvfrom(), записывая адрес каждого.
  • Клиент выбирает встроенное устройство и начинает напрямую с ним общаться.
0 голосов
/ 11 мая 2010

Я не знаю, насколько ограничены ваши ресурсы, но лучшим решением было бы включить решение mDNS, например http://avahi.org/, на вашу доску. Существуют определенные конфигурации, предназначенные для встроенных платформ.

Преимущество этого заключается в том, что вы будете подключаться к стандартному механизму обнаружения сервисов, который много вам покупает, если вы умеете хорошо играть с другими. Avahi - LGPL, но есть другие версии, которые являются некоторой версией BSD и ASPL (?)

...