Подтвердить что ты не робот

Проектирование сети UDP?

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

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

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

4b9b3361

Ответ 1

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

Что касается широковещательных 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. Однако, если есть конфликт, то ваша подпись зависит от вашего протокола (формат сообщения). Итак, проверьте формат сообщения и отклоните сообщение, если оно не соответствует формату сообщения, определенному вашим протоколом приложения.

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

Ответ 2

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

int broadcastPermission = 1;
setsockopt(socketDescriptor, SOL_SOCKET, SO_BROADCAST, (void*)&broadcastPermission, sizeof(broadcastPermission))

Ответ 3

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

Помимо этого, я бы рекомендовал использовать многоадресную рассылку вместо трансляции. Широковещательный трафик обычно ограничен хостами в той же подсети. В условиях неспециалиста, если у вас есть маршрутизатор в вашей сети, хост на стороне A маршрутизатора не будет видеть широковещательный трафик, отправленный хостом на стороне B (и наоборот), потому что маршрутизатор "блокирует" его. Маршрутизаторы почти всегда будут перенаправлять многоадресный трафик, если хост присоединился к группе многоадресной рассылки.