打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用Go语言实现组播:任意源和指定源

源代码地址:

https://github.com/tongxinCode/mping.git

该项目有幸列入2020北极代码保险库。

核心内容:

socket编程组播技术多网卡

注意事项:

1.Golang自带的net库实现不了任意源和指定源,要使用“golang.org/x/net/ipv4 详情见https://godoc.org/golang.org/x/net/ipv42.Windows上指定源接收异常,这是由于“golang.org/x/net/ipv4”库Windows部分 未完成,Linux x86Linux arm均正常


文件目录

.├── build├── LICENSE├── main.go├── mping├── multicast│   ├── broadcaster.go│   └── listener.go└── README.md

难点解析:

1.socket编程对于发包而言构造包相对较麻烦,构造出相对完整的数据包结构体是必要的: type Packet struct { TTL int Port int Address net.IP RouterAlert bool Raw bool IGMPVersion int // 1, 2, or 3 Interface *net.Interface Message []byte Protocol string // 'udp' or 'ip:2'/'ip4:2' TargetAddr *net.UDPAddr LocalAddress *net.UDPAddr udpConn *net.UDPConn packetConn *ipv4.PacketConn ipConn net.PacketConn rawConn *ipv4.RawConn padding []byte TOS int    }2.组播技术对于收包而言,组播收发要分为指定源和任意源两个部分进行实现,每个部分分为加入和离开两个函数,每个函数要调用相应的syscall(这部分golang.org/x/net/ipv4已经封装好了),最后针对两个部分做一层封装。3.多网卡Linux设备上实体网卡、虚拟网卡、bridge、loopback多重多样,调用正确的网卡十分关键,这里不推荐使用网卡名称、mac地址过滤网卡设备,尽量选取ip地址作过滤。func getifi(addr string) (*net.Interface, error) { host, _, err := net.SplitHostPort(addr) if err != nil { return nil, err } if host == "127.0.0.1" { return nil, nil } netInterfaces, err := net.Interfaces() if err != nil { return nil, err } for i := 0; i < len(netInterfaces); i++ { if (netInterfaces[i].Flags & net.FlagUp) != 0 { addrs, _ := netInterfaces[i].Addrs() for _, address := range addrs { ipv4 := ipReg.FindString(address.String()) if ipv4 == host { ifi := &netInterfaces[i]          } return ifi, nil } } } } return nil, nil}

此外,该项目还使用了flag库进行了help指令提示的编写,使用log库进行了日志模块的编写,编译的二进制文件可用性较高。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Golang获取机器码(MachineCode、PhysicalId)
gRPC服务发现&负载均衡
IPv6学习笔记
用Golang实现 echo服务器/客户端
golang中net/http包的简单使用
Golang开发支持平滑升级(优雅重启)的HTTP服务(转)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服