Как послать бродкастный пакет udp
Перейти к содержимому

Как послать бродкастный пакет udp

Как послать бродкастный пакет udp

Протокол UDP позволяет рассылать сообщения с помощью широковещательной групповой рассылки. При такой рассылке клиенту достаточно отправить одно сообщение, и его получат все остальные клиенты, которые подключены к группе. И нет надобности отправлять одно сообщение каждому отдельному клиенту.

При использовании широковещательной передачи надо учитывать, что передача не идет дальше локальных сетей, так как маршрутизаторы подобные рассылки не пропускают.

Ключевым в данном случае является метод JoinMulticastGroup() , который позволяет присоединиться клиенту к группе в локальной сети. Благодаря этому объект UdpClient сможет получать дейтаграммы, которые предназначаются всей группы объектов UdpClient.

Для присоединения к группе в метод JoinMulticastGroup передается адрес группы. В качестве адреса может использоваться один из адресов в диапазоне от 224.0.0.0 до 239.255.255.255.

Создадим приложение, которое будет использовать широковещательную рассылку. Если оталкиваться от проекта из прошлой темы, то для поддержки групповой рассылки достаточно добавить в потоке получения данных вызов метода JoinMulticastGroup() :

Метод JoinMulticastGroup() принимает два параметра: адрес групповой рассылки (должен быть одним и тем же для всей группы клиентов) и число проходов через маршрутизаторы. То есть пока сообщение достигнет получателя, оно может пройти через некоторое число маршрутизаторов, которые направят его по нужному пути. В данном случае число 50 означает, что чтобы пройти от компьютера-отправителя к компьютеру-получателю, дейтаграмма может миновать 50 маршрутизаторов.

На основе Udp-чата из прошлой темы сделаем консольный чат с применением широковещательной рассылки:

Теперь для групповой рассылки в локальной сети будет использоваться адрес «235.5.5.11», в качестве порта — 8001. Причем поскольку отправленное пользователем сообщение будет транслироваться всем в группе, в том числе и ему самому, то чтобы сообщение не дублировать в консоли, то в данном случае проверяется адрес отправителя с помощью вспомогательного метода LocalIPAddress(). Если адрес отправителя и получателя совпадает, то ему сообщение не выводится.

После построения проекта мы можем запустить скомпилированное приложение на разных машинах в локальной сети.

Как посылать сообщения с UDP broadcast сервера и прослушивать их на подключенном к нему клиенте?

Всем привет. Хочу сделать так, чтобы мой сервер мог посылать свои сообщения на широковещательный канал. Клиенты в свою очередь к этому UPD-серверу должны быть подключены и получали от него пакеты.

Как я понимаю это всё должно быть просто (Сторона сервера):

  • Сначала я создаю instance UdpClient:
  • Далее я рассылаю сообщения в broadcast
  • Тут я просто инициализирую клиента и в конструкторе указываю какой сервер нужно прослушивать:
  • Собственно жду, пока broadcast сервер начнёт вещать:

Уже второй день мучаюсь с этой казалось бы лёгкой вещью. С теоретической т.з. я хорошо понимаю о чём тут идёт речь, но почему я просто не могу прослушать то, что посылает сервер клиентам?

Как сделать broadcast рассылку сообщений по UDP используя Socket?

К нему подключаются клиенты, шлют что-то, он в отдельном потоке потихоньку это что-то слушает и реагирует.
Тут всё работает.
В какой-то момент времени нужно всем клиентам рассказать, что что-то произошло.
Я по наивности своей решил, что это делается вот так:

И получаю в этом месте исключение

Было у меня подозрение, что косяк в том, что сокет просто занят в данный момент времени прослушиванием, поэтому ему не до отправки. Но проверка показала, что это не так.
Прошу подсказки: куда копать?

Заранее всем спасибо за советы

  • Вопрос задан более года назад
  • 302 просмотра
  • Facebook
  • Вконтакте
  • Twitter

VariusRain

Сам спросил, сам ответил.
Оказывается, нужно было чуть внимательнее читать документацию, хотя там и не всё так очевидно.

Цитата с сайта майкрософт:

Ну и применять вместо Send нужно SendTo, просто ему вместо конкретного адреса в EndPoint передавать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *