gpt4 book ai didi

go - 如何在 Golang 中的组播 UDPConn 上设置 IP_MULTICAST_LOOP

转载 作者:IT王子 更新时间:2023-10-29 02:03:23 26 4
gpt4 key购买 nike

我需要在多播 UDP 连接/套接字上设置 IP_MULTICAST_LOOP,以便我可以在本地机器上发送/接收多播数据包。这是我发现应该有效的调用:

l, err := net.ListenMulticastUDP("udp4", nil, addr)
file, err := l.File()
fd := syscall.Handle(file.Fd())

err = syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, 1)

但是它失败并显示“不受 Windows 支持”。我很确定 Windows 中的套接字支持这一点,只是不在 Go net 包中。关于如何在我的连接上设置此标志的任何想法? (我是 Go 语言的新手,我可能忽略了一些明显的东西)。这是在 Windows 上,我还没有机会在 Linux 上测试。

最佳答案

作为doc说,net.ListenMulticastUDP只是为了方便简单的小应用程序。您可以使用 golang.org/x/net/ipv4对于一般用途,此包为您提供了有关多播的更多选项。实际上,net.ListenMulticastUDP() 的源代码将 IP_MULTICAST_LOOP 设置为 false:

func listenIPv4MulticastUDP(c *UDPConn, ifi *Interface, ip IP) error {
if ifi != nil {
if err := setIPv4MulticastInterface(c.fd, ifi); err != nil {
return err
}
}
if err := setIPv4MulticastLoopback(c.fd, false); err != nil {
return err
}
if err := joinIPv4Group(c.fd, ifi, ip); err != nil {
return err
}
return nil
}

setIPv4MulticastLoopback() 是为不同的操作系统实现的,它不会导出。对于 Windows,它在 sockoptip_windows.go 中:

func setIPv4MulticastLoopback(fd *netFD, v bool) error {
if err := fd.incref(); err != nil {
return err
}
defer fd.decref()
return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v)))
}

下面是golang.org/x/net/ipv4的例子,你可以获取/设置MulticastLoopback

package main

import (
"fmt"
"net"
"golang.org/x/net/ipv4"
)

func main() {
ipv4Addr := &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251), Port: 5352}
conn, err := net.ListenUDP("udp4", ipv4Addr)
if err != nil {
fmt.Printf("ListenUDP error %v\n", err)
return
}

pc := ipv4.NewPacketConn(conn)

// assume your have a interface named wlan
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
}

// test
if loop, err := pc.MulticastLoopback(); err == nil {
fmt.Printf("MulticastLoopback status:%v\n", loop)
if !loop {
if err := pc.SetMulticastLoopback(true); err != nil {
fmt.Printf("SetMulticastLoopback error:%v\n", err)
}
}
}

if _, err := conn.WriteTo([]byte("hello"), ipv4Addr); err != nil {
fmt.Printf("Write failed, %v\n", err)
}


buf := make([]byte, 1024)
for {
if n, addr, err := conn.ReadFrom(buf); err != nil {
fmt.Printf("error %v", err)
} else {
fmt.Printf("recv %s from %v\n", string(buf[:n]), addr)
}
}

return
}

关于go - 如何在 Golang 中的组播 UDPConn 上设置 IP_MULTICAST_LOOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43109552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com