есть ли способ изменить семейство сокетов после привязки? (Проблема, связанная с IPv6) - PullRequest
0 голосов
/ 25 октября 2010

Я пытаюсь дооснастить 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, но это не помогло.)

Есть ли способ просто "отсоединить" сокет и привязать его к новому семейству? Или просто сменить семью, точка?

1 Ответ

1 голос
/ 25 октября 2010

Не возможно. Обычное решение kludgey - оставить две розетки, одну для AF_INET, одну для AF_INET6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...