Может ли 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.