- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我需要在多播 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/
我需要在多播 UDP 连接/套接字上设置 IP_MULTICAST_LOOP,以便我可以在本地机器上发送/接收多播数据包。这是我发现应该有效的调用: l, err := net.ListenMulti
首先,我知道这里有很多关于多播主题的问题。我还看到大多数人的问题是没有启用 IP_MULTICAST_LOOP。我已经解决了这个问题,但仍然以“找不到设备”错误告终。 我正在编写一个程序,它可以与环回
我是一名优秀的程序员,十分优秀!