Skip to content

Commit d182c53

Browse files
committed
Publish referee messages to all interface addresses
1 parent c53c89e commit d182c53

File tree

1 file changed

+36
-25
lines changed

1 file changed

+36
-25
lines changed

internal/app/publish/publisher.go

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,58 +12,69 @@ const maxDatagramSize = 8192
1212
// Publisher can publish state and commands to the teams
1313
type Publisher struct {
1414
address string
15-
conn *net.UDPConn
15+
conns []*net.UDPConn
1616
}
1717

1818
// NewPublisher creates a new publisher that publishes referee messages via UDP to the teams
1919
func NewPublisher(address string) (p *Publisher) {
2020
p = new(Publisher)
2121
p.address = address
22-
22+
p.conns = []*net.UDPConn{}
2323
return
2424
}
2525

2626
func (p *Publisher) connect() bool {
27-
p.conn = nil
27+
p.disconnect()
2828

2929
addr, err := net.ResolveUDPAddr("udp", p.address)
3030
if err != nil {
3131
log.Printf("Could not resolve address '%v': %v", p.address, err)
3232
return false
3333
}
3434

35-
conn, err := net.DialUDP("udp", nil, addr)
36-
if err != nil {
37-
log.Printf("Could not connect to '%v': %v", addr, err)
38-
return false
39-
}
35+
iaddrs, err := net.InterfaceAddrs()
36+
for _, iaddr := range iaddrs {
37+
ip := iaddr.(*net.IPNet).IP
38+
if ip.To4() == nil {
39+
continue
40+
}
41+
laddr := &net.UDPAddr{
42+
IP: ip,
43+
}
44+
conn, err := net.DialUDP("udp", laddr, addr)
45+
if err != nil {
46+
log.Printf("Could not connect to '%v': %v", addr, err)
47+
continue
48+
}
4049

41-
if err := conn.SetWriteBuffer(maxDatagramSize); err != nil {
42-
log.Printf("Could not set write buffer to %v.", maxDatagramSize)
43-
}
44-
log.Println("Publishing referee messages to", p.address)
50+
if err := conn.SetWriteBuffer(maxDatagramSize); err != nil {
51+
log.Printf("Could not set write buffer to %v.", maxDatagramSize)
52+
}
53+
log.Printf("Publishing referee messages to %s at %s", conn.RemoteAddr(), conn.LocalAddr())
4554

46-
p.conn = conn
55+
p.conns = append(p.conns, conn)
56+
}
4757
return true
4858
}
4959

5060
func (p *Publisher) disconnect() {
51-
p.conn = nil
61+
p.conns = []*net.UDPConn{}
5262
}
5363

5464
func (p *Publisher) SendMessage(refereeMsg *state.Referee) {
55-
if p.conn == nil && !p.connect() {
65+
if len(p.conns) == 0 && !p.connect() {
5666
return
5767
}
58-
59-
bytes, err := proto.Marshal(refereeMsg)
60-
if err != nil {
61-
log.Printf("Could not marshal referee message: %v\nError: %v", refereeMsg, err)
62-
return
63-
}
64-
_, err = p.conn.Write(bytes)
65-
if err != nil {
66-
log.Printf("Could not write message: %v", err)
67-
p.disconnect()
68+
for _, conn := range p.conns {
69+
bytes, err := proto.Marshal(refereeMsg)
70+
if err != nil {
71+
log.Printf("Could not marshal referee message: %v\nError: %v", refereeMsg, err)
72+
return
73+
}
74+
_, err = conn.Write(bytes)
75+
if err != nil {
76+
log.Printf("Could not write message: %v", err)
77+
p.disconnect()
78+
}
6879
}
6980
}

0 commit comments

Comments
 (0)