Это немного неясный вопрос, но я в тупике и подумал, что, возможно, кто-то может иметь больше подсказок по этой проблеме.

Мой коллега несколько месяцев успешно запускал собственное приложение, использующее многоадресную рассылку IPv6 на его MacBook Pro, но сегодня Mac решил прекратить маршрутизацию многоадресных пакетов. В частности, программа выводит такую ​​ошибку:

SendDataUDP (ff02 :: bead: cede: deed: feed @ 4) не удалось на сетевом интерфейсе [Name = [en0] Description = [] IP = [fe80 :: 222: 41ff: fe21: dfd4 @ 4] Netmask = [ffff: ffff: ffff: ffff ::] Broadcast = [::]] (errno = 65 / Нет маршрута к хосту).

... что довольно хорошо описывает, что пошло не так ... он попытался sendto () UDP-пакет на указанный IP-адрес, и send () не удалось с errno = EHOSTUNREACH.

Я не понимаю, что могло привести к тому, что адрес многоадресной рассылки IPv6 может стать «недоступным»? Если я правильно понимаю многоадресную рассылку в области связи, пакет должен выходить только через локальный порт Ethernet (в данном случае en0, который запущен и работает на этой машине).

Есть ли какой-то аспект многоадресной рассылки, который мне не хватает, или его машина просто перестала работать? Он говорит, что ничего не менял, просто загадочным образом перестало работать.

4
Jeremy Friesner 12 Авг 2009 в 12:35
Хм. Не могли бы вы опубликовать минимальный образец кода? Я протестирую его на своем Mac и посмотрю, смогу ли я воспроизвести / отладить его здесь.
 – 
Cody Casterline
21 Авг 2009 в 01:17

2 ответа

Лучший ответ

Может быть полезно взглянуть на ядро ​​источник. (В частности, исходящий путь исходящего пакета IPv6, ip6_output.c) Находясь там, вы также можете взглянуть на вызовы сокетов, ведущие к нему, и т. Д.

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

Возможно ли, что беспроводной интерфейс на этом MacBook был включен, когда этого не было раньше, и теперь идея многоадресной рассылки «локально по ссылке» неоднозначна? Вы явно указываете интерфейс при использовании сокета? @ 4 в конце адреса мне кажется странным. (Это индекс интерфейса?) Обычно в качестве идентификатора области действия интерфейса используется %, но, как отмечалось в предыдущем ответе и его комментариях, он не поддерживается повсеместно.

2
mpontillo 18 Окт 2009 в 05:23
2
Мы наконец-то выяснили, в чем проблема ... в MacOS / X, по крайней мере, недостаточно поместить индекс интерфейса в адрес назначения вызова sendto (). ОС может, а иногда и выбирает собственный индекс интерфейса для использования, игнорируя тот, который предоставляется, и вызывает проблемы. Обходной путь заключается в вызове setsockopt (fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, & myIdx, sizeof (myIdx)) в сокете по мере необходимости вместо (или в дополнение к) указания индекса интерфейса в аргументе адреса sendto (). Я не уверен, ошибка это или "особенность" ...
 – 
Jeremy Friesner
18 Янв 2010 в 04:42

Чтобы проверить, может ли en0 по-прежнему передавать локальные запросы многоадресной рассылки, попробуйте

ping6 ff02::1%en0

Это связывается со всеми хостами, поэтому вы должны получить много ответов (для удовольствия попробуйте добавить -w).

3
Martin v. Löwis 12 Авг 2009 в 20:46
1
Забавно, это не сработало, мне пришлось использовать опцию '-I', чтобы указать адрес Ethernet для ping6. jdks-mbp: ~ jeffk $ ping6 ff02 :: 1% en0 ping6: UDP connect: нет маршрута к хосту jdks-mbp: ~ jeffk $ ping6 -I en0 ff02 :: 1 PING6 (56 = 40 + 8 + 8 байт) fe80 :: 21f: f3ff: fed8: 3680% en0 -> ff02 :: 1 16 байтов от fe80 :: 21f: f3ff: fed8: 3680% en0, icmp_seq = 0 hlim = 64 time = 0.131 мс
 – 
jdkoftinoff
12 Авг 2009 в 20:55