Golang の Net パッケージでのマルチキャスト構成のカスタマイズ
Golang の net.ListenMulticastUDP 関数を使用すると、開発者はマルチキャスト UDP 接続を作成できます。単純なアプリケーションには便利なソリューションを提供しますが、高度なマルチキャスト構成に必要な柔軟性は提供できない場合があります。この記事は、Windows のマルチキャスト UDP 接続での IP_MULTICAST_LOOP オプションの設定の問題に対処し、golang.org/x/net/ipv4 パッケージを使用した回避策を提供することを目的としています。
net.ListenMulticastUDP 関数は、IP_MULTICAST_LOOP を自動的に設定します。オプションを false に設定します。この設定をオーバーライドしてローカル マシンでマルチキャスト パケットを受信できるようにするには、ipv4 パッケージを利用します。
Using golang.org/x/net/ipv4
ipv4 パッケージは、マルチキャスト設定を含むネットワーク構成に対する高度な制御を提供します。このパッケージを使用すると、次のことが可能になります。
IP_MULTICAST_LOOP オプションを取得および設定します。
package main import ( "fmt" "golang.org/x/net/ipv4" ) func main() { pc := ipv4.NewPacketConn(conn) if loop, err := pc.MulticastLoopback(); err == nil { fmt.Printf("MulticastLoopback status:%v\n", loop) } }
IP_MULTICAST_LOOP を true に設定してマルチキャスト ループバックを有効にします。
if err := pc.SetMulticastLoopback(true); err != nil { fmt.Printf("SetMulticastLoopback error:%v\n", err) }
実装例
以下は、 ipv4 パッケージ:
package main import ( "fmt" "net" "golang.org/x/net/ipv4" ) func main() { ... iface, err := net.InterfaceByName("wlan") if err != nil { fmt.Printf("can't find specified interface %v\n", err) return } if err := pc.JoinGroup(iface, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251)}); err != nil { return } // Set IP_MULTICAST_LOOP to true if err := pc.SetMulticastLoopback(true); err != nil { fmt.Printf("SetMulticastLoopback error:%v\n", err) return } ... }
このコードは、まずマルチキャスト グループに参加し、次に IP_MULTICAST_LOOP オプションを true に設定して、マルチキャスト パケットをローカル マシンで受信できるようにします。
以上がGolang の UDP 接続でマルチキャスト ループバックを有効にする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。