mirror of
https://github.com/sigcn/pg.git
synced 2025-11-02 21:04:01 +08:00
implement PacketBroadcaster
This commit is contained in:
24
disco/udp.go
24
disco/udp.go
@@ -2,6 +2,7 @@ package disco
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"net"
|
||||
@@ -299,6 +300,29 @@ func (n *UDPConn) WriteToUDP(p []byte, peerID peer.PeerID) (int, error) {
|
||||
return 0, ErrUseOfClosedConnection
|
||||
}
|
||||
|
||||
func (c *UDPConn) Broadcast(b []byte) (peerCount int, err error) {
|
||||
c.peersMapMutex.RLock()
|
||||
peerCount = len(c.peersMap)
|
||||
peers := make([]peer.PeerID, 0, peerCount)
|
||||
for k := range c.peersMap {
|
||||
peers = append(peers, k)
|
||||
}
|
||||
c.peersMapMutex.RUnlock()
|
||||
|
||||
var errs []error
|
||||
for _, peer := range peers {
|
||||
_, err := c.WriteToUDP(b, peer)
|
||||
if err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
|
||||
if len(errs) > 0 {
|
||||
err = errors.Join(errs...)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func ListenUDP(port int, disableIPv4, disableIPv6 bool, id peer.PeerID) (*UDPConn, error) {
|
||||
conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: port})
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user