Может ли udpclient быть как многоадресным, так и одноадресным

Я пытаюсь создать библиотеку сокетов клиент-сервер, которая будет абстрагироваться от сложностей отправки и получения данных. Мне было интересно, если у вас есть настройки сервера UDP для группы многоадресной рассылки. Может ли он по-прежнему отправлять и получать индивидуальные запросы конкретным клиентам, если это необходимо? Или вам нужно открыть две розетки для обработки любого типа?

1 ответ

Решение

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

Вы можете отправлять и получать любые многоадресные и / или одноадресные UDP-пакеты, чередующиеся в любом случае, так что даже если вы хотите общаться со многими разными одноранговыми узлами, некоторым многоадресным, некоторым одноадресным, вы можете использовать один сокет для этого, и на самом деле это часто полезно сделать это с точки зрения сложности приложения.

Некоторые вещи для рассмотрения:

В Linux вам захочется bind() ваш сокет UDP к желаемому порту и IP-адресу 0.0.0.0 (INADDR_ANY). Это позволит вам получать пакеты UDP, предназначенные для любого многоадресного адреса и любого одноадресного адреса. Указание конкретного IP-адреса для bind() UDP имеет эффект фильтрации и позволяет только UDP-пакетам ориентироваться на этот конкретный UDP-адрес, что на практике редко используется, так как все многоадресные серверы обычно также хотят, чтобы один и тот же трафик поступал прозрачно.

В Windows привязка к фиксированному ненулевому IP-адресу имеет другую семантику: она привязывает сокет UDP к определенному интерфейсу (тот, который имеет данный IP-адрес). Отправка и получение трафика UDP для многоадресной / одноадресной передачи должны работать в Windows даже без привязки к 0.0.0.0.

Другие вопросы по тегам