0

IPv6 を介した UDP マルチキャストが機能しません。これを行おうとしているプラ​​ットフォームは iOS (Swift を使用) です。私は持っていて、次のGCDAsyncUdpSocketように構成します:

self.socket!.setIPv4Enabled(false)
self.socket!.setIPv6Enabled(true)
do {
    try self.socket!.bindToPort(Announcement.ipv6BroadcastPort, interface: "en0")
}
catch let error {
    print("bind failed: \(error)")
    throw error
}
do {
    try self.socket!.joinMulticastGroup("ff32::5222", onInterface: "en0")
}
catch let e {
    print("join multicast failed: \(e)")
}

その後、いくつかのデータをマルチキャスト アドレスに送信しようとします。

socket.sendData(data, toHost:"ff32::5222", port: 21026, withTimeout: 5, tag: 0)

その時点で、GCDAsyncUDPSocket コードをステップ実行するとsendto、メソッド内で が呼び出されますdoSend(3919 行目)。この呼び出しは -1 を返し、エラーは「ホストへのルートがありません」です。これをiOSシミュレーターで実行しています。利用可能なすべてのネットワーク インターフェイスを列挙すると、次のようになります。

Name: lo0
Address: Optional("::1ebc:680b:100:0")
Family: NetUtils.Interface.Family.ipv6
Supports multicast: true

Name: lo0
Address: Optional("::2bc:680b:100:0")
Family: NetUtils.Interface.Family.ipv4
Supports multicast: true

Name: lo0
Address: Optional("fe80::1ebc:680b:100:0")
Family: NetUtils.Interface.Family.ipv6
Supports multicast: true

Name: en0
Address: Optional("fe80::1ebc:680b:100:0")
Family: NetUtils.Interface.Family.ipv6
Supports multicast: true

Name: en0
Address: Optional("2001:984:3427:1:1ebc:680b:100::")
Family: NetUtils.Interface.Family.ipv6
Supports multicast: true

Name: en0
Address: Optional("2001:984:3427:1:1ebc:680b:100::")
Family: NetUtils.Interface.Family.ipv6
Supports multicast: true

Name: en0
Address: Optional("::2bc:680b:100:0")
Family: NetUtils.Interface.Family.ipv4
Supports multicast: true

Name: awdl0
Address: Optional("fe80::1ebc:680b:100:0")
Family: NetUtils.Interface.Family.ipv6
Supports multicast: true

Name: utun0
Address: Optional("fe80::1ebc:680b:100:0")
Family: NetUtils.Interface.Family.ipv6
Supports multicast: true

Name: utun0
Address: Optional("fde6:4b33:67e4:9d5e:1ebc:680b:100::")
Family: NetUtils.Interface.Family.ipv6
Supports multicast: true

どんな助けでも大歓迎です!

4

1 に答える 1

2

問題は解決しました。IPv6 UDP マルチキャストを介した送受信に成功しました。問題は、問題の組み合わせであることが判明しました。

  • これらのメッセージを送信するには、ソケット オプションを設定する必要がありますがIPV6_MULTICAST_IF、これGCDAsyncUdpSocketは行いません。(受信は必要ないようです。)
  • メッセージを送信するときは、送信する前にバインドする必要があります (ただし、特定のポートにバインドしないでください。バインドしているのは送信元ポートであり、宛先ポートではありません)。
  • Swift オブジェクトを Objective-C オブジェクトのデリゲートとして設定しようとするときは、Swift オブジェクトが から継承されていることを確認してくださいNSObject。警告もエラーもありません。デリゲートは単に呼び出されません。
  • Wireshark は再び私の友人でした :)。ICMPv6 の「Multicast Listener Report v2」が送信されたため、ソケットがリッスンを開始したことがわかりました。内容は「Multicast Address Record Changed to exclude: ff12::5222」です。「除外」とは、フィルター処理されないこと、つまり、渡されることを意味することに注意してください。(ありがとうポール!)

ここでの概念実証: https://source.ind.ie/project/pulse-swift/blob/28bd0f48e3d4fa99f6095321a89036863c3f7a83/pulse-swift/discovery/Greeter.swift

于 2015-08-11T22:16:49.957 に答える