Я пытаюсь дооснастить API, чтобы он был совместим с IPv4. По сути, API на одном этапе создает сокет, а затем вызывает bind (), чтобы открыть порт для прослушивания. Порт указывается путем передачи sockaddr, возвращаемого функцией getaddrinfo (), с указанием порта в параметре службы. Позже у вызывающей стороны есть возможность назначить многоадресную группу, вызвав функцию API, которая устанавливает IP_ADD_MEMBERSHIP для сокета.
Проблема заключается в том, что в IPv6 (то есть семейная подсказка для getaddrinfo - AF_UNSPEC вместо AF_INET, как это было ранее), IP_ADD_MEMBERSHIP завершается ошибкой, когда пользователь запрашивает группу многоадресной рассылки IPv4. Это связано с тем, что система, по-видимому, по умолчанию предоставляет адрес IPv6, если подсказка не указана.
Решение состоит в том, чтобы заранее знать, захочет ли пользователь указать группу многоадресной рассылки IPv4 или IPv6. Однако, поскольку я пытаюсь не изменять сам API, эта информация просто считается неизвестной.
Есть ли у меня другие варианты?
Я пытался закрыть, воссоздать и заново связать сокет до IP_ADD_MEMBERSHIP, но мой второй bind () по какой-то причине не работает. (Я попытался указать SO_REUSEADDR, но это не помогло.)
Есть ли способ просто "отсоединить" сокет и привязать его к новому семейству? Или просто сменить семью, точка?