2016-02-24 5 views
0

У меня есть небольшая клиентская программа, которая прослушивает многоадресную группу IPv6 (например, ff12 :: blah: blah% en0) для многоадресных пакетов, которые отправляются сервером. Это работает хорошо.Должен ли сокет IPv6 UDP, который настроен на прием многоадресных пакетов, также может получать одноадресные пакеты?

Сервер также хотел бы иногда отправлять одноадресный пакет моему клиенту (поскольку, если пакет относится только к одному клиенту, нет смысла беспокоить всех остальных членов группы многоадресной передачи). Таким образом, мой сервер просто передает sendto() на IP-адрес моего клиента и порт, который прослушивает многоадресный сокет клиента IPv6.

Если мой клиент работает под MacOS/X, это работает нормально; одноадресный пакет принимается одним и тем же сокетом, который принимает многоадресные пакеты. В Windows OTOH клиент никогда не получает одноадресный пакет (даже если он принимает многоадресные пакеты без каких-либо проблем).

Вопрос в том, должен ли приемник IPv6 UDP многоадресного прослушивателя получать одноадресные пакеты на том же порту (в этом случае, возможно, я что-то делаю неправильно или неправильно сконфигурирован Windows)? Или это то, что «просто срабатывает» под MacOS/X, но не гарантировано, поэтому тот факт, что он не работает для меня под Windows, просто означает, что у меня были неправильные ожидания?

+0

Он должен работать, если сокет не привязан * к многоадресному адресу. – EJP

ответ

0

Должно работать нормально. Пока вы привязываетесь к IN6ADDR_ANY, присоединяйтесь к группам многоадресной рассылки, вы сможете без проблем отправлять и получать одноадресные пакеты.

При использовании многоадресной передачи важно связать с IN6ADDR_ANY (или INADDR_ANY для IPv4). Если вы привязываетесь к определенному интерфейсу, это прерывает многоадресную рассылку в системах Linux.

+1

Ему не нужно связываться с INADDR_ANY, если IP-адрес, на который он ссылается, является локальным IP-адресом, и все отправители могут его достичь. Важно не использовать странную функцию Linux привязки к многоадресному адресу. – EJP

+0

@EJP. Если вы хотите, чтобы многоадресная работа работала. См. Мое редактирование. – dbush

+0

Спасибо - виновник оказался брандмауэром Windows, который блокировал входящие одноадресные пакеты от моего клиента Windows, но не входящие многоадресные пакеты. Отключение брандмауэра позволяет моему клиенту получать оба типа, как и ожидалось. –