Должен ли сокет IPv6 UDP, настроенный для приема многоадресных пакетов, также иметь возможность принимать одноадресные пакеты?
У меня есть небольшая клиентская программа, которая прослушивает многоадресную группу IPv6 (например, ff12::blah:blah%en0) для многоадресных пакетов, которые отправляются сервером. Это работает хорошо.
Сервер также хотел бы иногда отправлять одноадресный пакет моему клиенту (поскольку, если пакет относится только к одному клиенту, нет смысла беспокоить всех остальных членов многоадресной группы). Так что мой сервер просто выполняет sendto() для IP-адреса моего клиента и порта, который прослушивает многоадресный сокет IPv6 клиента.
Если мой клиент работает под MacOS/X, это работает нормально; одноадресный пакет принимается тем же сокетом, который принимает многоадресные пакеты. В Windows OTOH клиент никогда не получает одноадресный пакет (даже если он принимает многоадресные пакеты без проблем).
У меня такой вопрос: ожидается ли, что сокет IPv6-прослушивателя многоадресной рассылки также сможет принимать одноадресные пакеты на тот же порт (в этом случае, возможно, я что-то делаю не так, или Windows неправильно настроена)? Или это что-то, что "просто работает" под MacOS/X, но не гарантируется, поэтому тот факт, что это не работает для меня под Windows, просто означает, что у меня были неверные ожидания?
1 ответ
Это должно работать нормально. Пока вы связываете с IN6ADDR_ANY
затем присоединитесь к группам многоадресной рассылки, и вы сможете без проблем отправлять и получать одноадресные пакеты.
Важно связать с IN6ADDR_ANY
(или же INADDR_ANY
для IPv4) при использовании многоадресной рассылки. Если вы привязываетесь к определенному интерфейсу, это нарушает многоадресную передачу в системах Linux.