Простая задача: необходимо передать с сервера на все клиенты по локальной сети текстовое сообщение.
Использую для этого idUDPClient и idUDPServer.
Как я понимаю, для отправки сообщений можно использовать как минимум два метода:
1 основной:
- Код: Выделить всё
idUDPClient1.Send('MsgText');
2 альтернативный:
- Код: Выделить всё
idUDPClient1.Broadcast('MsgText', RemotePort);
Настройки idUDPClient1, в том виде, в каком их обычно рекомендуют:
- Код: Выделить всё
IdUDPClient1.Host := 'RemoteHost';
IdUDPClient1.Port := RemotePort;
IdUDPClient1.Active := true;
IdUDPClient1.BroadcastEnabled := true;
В качестве IdUDPClient1.Host я использовал следующие варианты:
1 пустой: IdUDPClient1.Host = '';
2 localhost / 127.0.0.1: IdUDPClient1.Host = 'localhost';
3 широковещательный адрес сети: IdUDPClient1.Host = '192.168.1.255';
4 глобальный широковещательный адрес: IdUDPClient1.Host = '255.255.255.255';
При отправке первым способом (idUDPClient1.Send('MsgText');) клиенты в сети получают сообщение только в случае, если в качестве IdUDPClient1.Host указан широковещательный адрес сети. Во всех остальных случаях сообщение получает только localhost.
При отправке вторым способом (idUDPClient1.Broadcast('MsgText', RemotePort);) при любом значении IdUDPClient1.Host сообщение получает только localhost.
Возможно, я чего-то не понимаю. Почему не передаётся сообщение через
- Код: Выделить всё
idUDPClient1.Broadcast('MsgText', RemotePort);
?
Почему не передаётся сообщение через широковещательный глобальный адрес?
Почему не передаётся сообщение, в случае, если указан пустой хост? Мы ведь указали IdUDPClient1.BroadcastEnabled := true.
Если мы явно указываем широковещательный адрес сети, тогда нужно ли указывать IdUDPClient1.BroadcastEnabled := true?
В документации по Indy не нашёл сведений по этим вопросам.
И ещё. В единственной работоспособной конфигурации, т. е.
- Код: Выделить всё
IdUDPClient1.Host := '192.168.1.255';
IdUDPClient1.Port := 12500;
IdUDPClient1.Active := true;
IdUDPClient1.BroadcastEnabled := true;
idUDPClient1.Send('MsgText');
клиенты получают сообщения почему-то только со второй попытки.
Меня вполне бы устроил указанный работоспособный вариант отправки, но в случае, когда заранее конфигурация сети неизвестна, получение широковещательного адреса может представлять собой нетривиальную задачу, особенно если несколько сетевых адаптеров, и маска подсети отличается от 255.255.255.0...
Нельзя ли сделать это как-то попроще?
Добавлено спустя 2 минуты 43 секунды:
Разве что в настройках программы запрашивать адрес сети / маску ...