2009-08-12 20 views
4

這是一個稍微隱晦的問題,但我很難過,我想也許有人會在這個問題上有更多的線索。MacBook Pro上的鏈接範圍IPv6多播數據包突然無法路由?

我的同事已經成功運行了一個內部應用程序,該應用程序在他的MacBook Pro上使用IPv6多播幾個月,但今天Mac決定停止路由多播數據包。特別地,程序打印這個錯誤:

SendDataUDP(FF02 ::珠:半寸:契:飼料@ 4)發生故障的網絡接口上的[名稱= [EN0]描述= [] IP = [FE80 :: 222: 41ff:fe21:dfd4 @ 4] Netmask = [ffff:ffff:ffff:ffff ::] Broadcast = [::]](errno = 65 /沒有路由到主機)。

......它很好地描述出了什麼問題......它試圖sendto()一個UDP包到顯示的IP地址,send()失敗,出現errno = EHOSTUNREACH。

我不明白的是,什麼可能導致IPv6鏈路範圍多播地址「不可達」?如果我對鏈路範圍多播的理解是正確的,那麼數據包只需要從本地以太網端口(在這種情況下,即在該機器上運行的en0)出去。

是否有某些方面的組播,我錯過了,或者是他的機器只是borked?他說他沒有任何改變,只是神祕地停止了工作。

+0

嗯。你能發佈一個最小的代碼示例嗎?我會在我的Mac上測試它,看看我能否在這裏重現/調試它。 – 2009-08-20 21:17:49

回答

2

這可能有助於查看kernel source。 (尤其是出口IPv6數據包出口路徑ip6_output.c)當你在那裏時,你也可以看看導致它的套接字調用等。

對於多播,假設你是使其爲ip6_output(),它看起來像得到這個錯誤的唯一可能的方式是不指定接口發送。 (這很奇怪,因爲你的錯誤信息明確提到了接口)

當MacBook上的無線接口不在以前有可能被啓用時,現在「鏈接本地」多播的想法是曖昧?你使用套接字時是否明確地指定了接口?地址末尾的@ 4對我來說看起來很奇怪。 (這是一個接口索引嗎?)約定通常使用%作爲接口scope-id,但正如前面的回答及其評論所指出的那樣,它沒有得到普遍支持。

+2

我們終於找到了這裏的問題....至少在MacOS/X下,將接口索引放入sendto()調用的目標地址是不夠的。操作系統可以並且有時會選擇使用自己的接口索引,而忽略提供的接口索引並導致問題。解決方法是根據需要在套接字上調用setsockopt(fd,IPPROTO_IPV6,IPV6_MULTICAST_IF,&myIdx,sizeof(myIdx)),而不是(或者除此之外)在sendto()地址參數中指定接口索引。我不確定這是一個錯誤還是一個「功能」... – 2010-01-18 01:42:46

2

要測試EN0是否仍然能夠傳輸鏈路本地組播請求,嘗試

ping6 ff02::1%en0 

該聯繫人的所有主機,所以你應該得到足夠的響應(爲了好玩,嘗試添加-w)。

+1

有趣,這沒有奏效,我不得不使用'-I'選項來指定ping6的以太網地址。 的JDK-MBP:〜jeffk $ ping6 FF02 :: 1%EN0 ping6:UDP連接:沒有到主機的路由 的JDK-MBP:〜jeffk $ ping6 -I EN0 FF02 :: 1 PING6(56 = 40 + 8 + 8字節)fe80 :: 21f:f3ff:fed8:3680%en0 - > ff02 :: 1 來自fe80 :: 21f的16個字節:f3ff:fed8:3680%en0,icmp_seq = 0 hlim = 64 time = 0.131毫秒 – jdkoftinoff 2009-08-12 16:55:41

相關問題