застрял на одном интерфейсе - PullRequest
2 голосов
/ 17 августа 2010

Я использую recvfrom для получения многоадресных сообщений из сети.В системе есть два сетевых интерфейса, и recvfrom получает только от первого интерфейса.Когда второй интерфейс работает, recvfrom блокируется на неопределенный срок и получает пакет только после переключения на первый интерфейс.SO_REUSEADDR используется в параметрах набора при открытии сокета. Удаление этого также не помогает.Есть идеи??Я застрял.

Ответы [ 2 ]

0 голосов
/ 23 августа 2010

Мне удалось решить эту проблему с помощью DROP_MEMBERSHIP и ADD_MEMBERSHIP на сокете многоадресной рассылки при изменении сетевого интерфейса. Мне также пришлось внести изменения в библиотеку сокетов, где первоначально она использовалась для возврата первого доступного интерфейса с поддержкой многоадресной рассылки (даже если IP не назначен), чтобы вернуть тот интерфейс, для которого включена многоадресная рассылка, а также назначен IP-адрес.

0 голосов
/ 17 августа 2010

Я бы создал один сокет для каждого интерфейса и привязал бы его явно к интерфейсу вместо использования INADDR_ANY.

Проблема с использованием INADDR_ANY заключается в том, что, как только вы получили дейтаграмму, сокет, вероятно, неявно привязан к интерфейсу, на который поступила дейтаграмма, ИМХО, это должно быть так, чтобы вы могли отправить ответ отинтерфейс, на который поступила датаграмма ...

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