|
6 | 6 | "sync" |
7 | 7 | "time" |
8 | 8 |
|
| 9 | + "github.com/libp2p/go-reuseport" |
9 | 10 | "golang.org/x/net/ipv4" |
10 | 11 | ) |
11 | 12 |
|
@@ -84,22 +85,31 @@ func (r *MulticastServer) connectToInterface(ifi net.Interface) bool { |
84 | 85 | return false |
85 | 86 | } |
86 | 87 |
|
87 | | - r.connection, err = net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: addr.Port}) |
| 88 | + // Listen using go-reuseport which sets SO_REUSEADDR and SO_REUSEPORT |
| 89 | + listenAddr := &net.UDPAddr{IP: net.IPv4zero, Port: addr.Port} |
| 90 | + packetConn, err := reuseport.ListenPacket("udp4", listenAddr.String()) |
88 | 91 | if err != nil { |
89 | 92 | log.Printf("Could not listen at %v on %v: %v", r.multicastAddress, ifi.Name, err) |
90 | 93 | return false |
91 | 94 | } |
92 | 95 |
|
| 96 | + var ok bool |
| 97 | + r.connection, ok = packetConn.(*net.UDPConn) |
| 98 | + if !ok { |
| 99 | + log.Printf("Could not cast to UDPConn") |
| 100 | + return false |
| 101 | + } |
| 102 | + |
93 | 103 | if err := r.connection.SetReadBuffer(maxDatagramSize); err != nil { |
94 | 104 | log.Println("Could not set read buffer: ", err) |
95 | 105 | } |
96 | 106 |
|
97 | | - packetConn := ipv4.NewPacketConn(r.connection) |
98 | | - if err := packetConn.JoinGroup(&ifi, addr); err != nil { |
| 107 | + ipv4PacketConn := ipv4.NewPacketConn(r.connection) |
| 108 | + if err := ipv4PacketConn.JoinGroup(&ifi, addr); err != nil { |
99 | 109 | log.Printf("Could not join group %v: %v", ifi.Name, err) |
100 | 110 | return false |
101 | 111 | } |
102 | | - if err := packetConn.SetMulticastLoopback(true); err != nil { |
| 112 | + if err := ipv4PacketConn.SetMulticastLoopback(true); err != nil { |
103 | 113 | log.Printf("Could not set multicast loopback %v: %v", ifi.Name, err) |
104 | 114 | return false |
105 | 115 | } |
|
0 commit comments