Сеть UDP вещания дизайн? - PullRequest
16 голосов
/ 16 июня 2011

Я работаю над парой клиентских приложений на сервере C ++ / .NET, в которой мой сервер (который запускает c ++ в linux) передает сообщение, чтобы показать, что он жив для всей сети, а моя программа .NET прослушивает пакеты и анализирует их. получить время работы сервера.

Как я прочитал, для отправки обычного UDP-широковещания на широковещательный адрес мне просто нужно отправить пакет на 192.168.0.255 (в моем случае 192.168.2.255) или 255.255.255.255. Это правильно? Могу ли я использовать тот же адрес порта? Есть ли другие потребности?

Я понимаю тот факт, что, если моя программа .NET прослушивает этот конкретный адрес, можно получать пакеты из других приложений, кроме моей программы на сервере C ++. Есть ли какой-либо метод "подписывания" пакета на стороне сервера C ++, чтобы моя программа .NET прочитала заголовок пакета и увидела, что он (почти) тот, который я ищу?

Ответы [ 3 ]

28 голосов
/ 16 июня 2011

Независимо от используемого вами языка, вот мой ответ:

Что касается широковещательных IP-адресов, оба адреса являются широковещательными адресами, но ограниченный широковещательный адрес (который составляет 255.255.255.255) пересылаться не будетпо роутерам.Лучше использовать адрес широковещательной рассылки, направленный на подсеть (192.168.2.255).

Чтобы отправлять / получать широковещательный адрес, необходимо определить свой широковещательный адрес (широковещательный IP-адрес и номер порта).Например: 192.168.2.255 и номер порта 3000. Клиентские приложения (отправители) ДОЛЖНЫ включить опцию сокета SO_BROADCAST следующим образом:

int enabled = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &enabled, sizeof(enabled));

, где sockfd - дескриптор сокета.

СерверПриложение будет прослушивать определенный номер порта (порт 3000).Обычно сервер будет отвечать на каждый запрос, используя одноадресное сообщение.

Конфликта не будет, если приложение не прослушивает тот же номер порта.Ваш сервер не будет работать, если другое приложение прослушивает тот же порт, если вы не включили опцию сокета SO_REUSEADDRESS.Однако, если есть конфликт, то ваша подпись зависит от вашего протокола (формат сообщения).Поэтому проверьте формат сообщения и отклоните сообщение, если оно не соответствует формату сообщения, определенному протоколом приложения.

Для клиентских приложений принятый пакет является одноадресным (если у вас нет другого проекта).Таким образом, никаких конфликтов на этой стороне.

9 голосов
/ 16 июня 2011

Вам также нужно включить опцию сокета SO_BROADCAST в C ++ для отправки широковещательного трафика, или вы получите ошибку отказа в разрешении:

int broadcastPermission = 1;
setsockopt(socketDescriptor, SOL_SOCKET, SO_BROADCAST, (void*)&broadcastPermission, sizeof(broadcastPermission))
3 голосов
/ 16 июня 2011

Если ваша программа .NET прослушивает широковещательный трафик, она получит весь широковещательный трафик в сети, отправленный через этот порт, включая трафик, не отправленный вашим сервером. Вы можете поставить «маркер» в полезную нагрузку широковещательных сообщений, отправляемых вашим сервером. Таким образом, ваша .NET-программа сможет определить, какие из них ей нужны.

Кроме того, я бы рекомендовал использовать широковещательную рассылку вместо широковещательной рассылки. Широковещательный трафик обычно ограничен узлами в одной подсети. С точки зрения непрофессионала, если у вас есть маршрутизатор в вашей сети, хост на стороне A маршрутизатора не будет видеть широковещательный трафик, отправленный хостом на стороне B (и наоборот), потому что маршрутизатор «блокирует» его. Маршрутизаторы почти всегда пересылают многоадресный трафик, если хост присоединился к группе многоадресной рассылки.

...