Передача сообщений через UDP Indy

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Передача сообщений через UDP Indy

Сообщение wwswowsogon » 11.12.2023 12:45:38

Всем доброго времени суток!

Простая задача: необходимо передать с сервера на все клиенты по локальной сети текстовое сообщение.
Использую для этого 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 секунды:
Разве что в настройках программы запрашивать адрес сети / маску ... :)
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

Re: Передача сообщений через UDP Indy

Сообщение wwswowsogon » 20.12.2023 19:14:02

И ещё вопрос.
Вот такой код для отправки нескольких сообщений
Код: Выделить всё
idUDPClient1.Connect;

    if idUDPClient1.Connected then
      begin

        s1:= 'Test 111';
        s2 := 'Test 333';
        s3 := 'Test 555';

        idUDPClient1.Send(s1);
        idUDPClient1.Send(s2);
        idUDPClient1.Send(s3);
    end;

Выполняется как-то странно.
Почти рандомно отправляет любую из строк, как правило, первую, иногда первую и вторую, иногда первую и третью, и почти никогда - все три. Неужели это так ненадёжно работает UDP? :D Я думаю, дело в чём-то другом.
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

Re: Передача сообщений через UDP Indy

Сообщение sts » 22.12.2023 13:56:01

UDP не гарантирует доставку пакета, не гарантирует порядок доставки
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

Рейтинг@Mail.ru
cron