multicast: add readOnly flag (#423)

This commit is contained in:
Alessandro Ros
2023-09-16 11:03:32 +02:00
committed by GitHub
parent e6f7c4dea4
commit 99773e19af
3 changed files with 103 additions and 90 deletions

View File

@@ -25,6 +25,7 @@ type MultiConn struct {
// NewMultiConn allocates a MultiConn.
func NewMultiConn(
address string,
readOnly bool,
listenPacket func(network, address string) (net.PacketConn, error),
) (Conn, error) {
addr, err := net.ResolveUDPAddr("udp4", address)
@@ -67,42 +68,47 @@ func NewMultiConn(
return nil, fmt.Errorf("no multicast-capable interfaces found")
}
writeConns := make([]*net.UDPConn, len(enabledInterfaces))
writeConnIPs := make([]*ipv4.PacketConn, len(enabledInterfaces))
var writeConns []*net.UDPConn
var writeConnIPs []*ipv4.PacketConn
for i, intf := range enabledInterfaces {
tmp, err := listenPacket("udp4", "224.0.0.0:"+strconv.FormatInt(int64(addr.Port), 10))
if err != nil {
for j := 0; j < i; j++ {
writeConns[j].Close() //nolint:errcheck
if !readOnly {
writeConns = make([]*net.UDPConn, len(enabledInterfaces))
writeConnIPs = make([]*ipv4.PacketConn, len(enabledInterfaces))
for i, intf := range enabledInterfaces {
tmp, err := listenPacket("udp4", "224.0.0.0:"+strconv.FormatInt(int64(addr.Port), 10))
if err != nil {
for j := 0; j < i; j++ {
writeConns[j].Close() //nolint:errcheck
}
readConn.Close() //nolint:errcheck
return nil, err
}
readConn.Close() //nolint:errcheck
return nil, err
}
writeConn := tmp.(*net.UDPConn)
writeConn := tmp.(*net.UDPConn)
writeConnIP := ipv4.NewPacketConn(writeConn)
writeConnIP := ipv4.NewPacketConn(writeConn)
err = writeConnIP.SetMulticastInterface(intf)
if err != nil {
for j := 0; j < i; j++ {
writeConns[j].Close() //nolint:errcheck
err = writeConnIP.SetMulticastInterface(intf)
if err != nil {
for j := 0; j < i; j++ {
writeConns[j].Close() //nolint:errcheck
}
readConn.Close() //nolint:errcheck
return nil, err
}
readConn.Close() //nolint:errcheck
return nil, err
}
err = writeConnIP.SetMulticastTTL(multicastTTL)
if err != nil {
for j := 0; j < i; j++ {
writeConns[j].Close() //nolint:errcheck
err = writeConnIP.SetMulticastTTL(multicastTTL)
if err != nil {
for j := 0; j < i; j++ {
writeConns[j].Close() //nolint:errcheck
}
readConn.Close() //nolint:errcheck
return nil, err
}
readConn.Close() //nolint:errcheck
return nil, err
}
writeConns[i] = writeConn
writeConnIPs[i] = writeConnIP
writeConns[i] = writeConn
writeConnIPs[i] = writeConnIP
}
}
return &MultiConn{