Skip to content

Commit fa8c9a7

Browse files
committed
[bugfix] Make network connection more robust, avoid crash without network
1 parent 153f1aa commit fa8c9a7

File tree

1 file changed

+25
-7
lines changed

1 file changed

+25
-7
lines changed

internal/app/controller/publisher.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const maxDatagramSize = 8192
1212

1313
// Publisher can publish state and commands to the teams
1414
type Publisher struct {
15+
address string
1516
conn *net.UDPConn
1617
message RefMessage
1718
}
@@ -23,7 +24,22 @@ type RefMessage struct {
2324

2425
// NewPublisher creates a new publisher that publishes referee messages via UDP to the teams
2526
func NewPublisher(address string) (publisher Publisher, err error) {
26-
addr, err := net.ResolveUDPAddr("udp", address)
27+
28+
publisher.address = address
29+
30+
// initialize default referee message
31+
publisher.message = RefMessage{send: publisher.send, referee: new(refproto.Referee)}
32+
initRefereeMessage(publisher.message.referee)
33+
34+
err = publisher.connect()
35+
36+
return
37+
}
38+
39+
func (p *Publisher) connect() (err error) {
40+
p.conn = nil
41+
42+
addr, err := net.ResolveUDPAddr("udp", p.address)
2743
if err != nil {
2844
return
2945
}
@@ -36,16 +52,16 @@ func NewPublisher(address string) (publisher Publisher, err error) {
3652
if err := conn.SetWriteBuffer(maxDatagramSize); err != nil {
3753
log.Printf("Could not set write buffer to %v.", maxDatagramSize)
3854
}
39-
log.Println("Publishing to", address)
40-
41-
publisher.conn = conn
42-
publisher.message = RefMessage{send: publisher.send, referee: new(refproto.Referee)}
43-
44-
initRefereeMessage(publisher.message.referee)
55+
log.Println("Publishing to", p.address)
4556

57+
p.conn = conn
4658
return
4759
}
4860

61+
func (p *Publisher) disconnect() {
62+
p.conn = nil
63+
}
64+
4965
func initRefereeMessage(m *refproto.Referee) {
5066
m.PacketTimestamp = new(uint64)
5167
m.Stage = new(refproto.Referee_Stage)
@@ -88,6 +104,7 @@ func (p *RefMessage) Publish(state *State) {
88104

89105
func (p *Publisher) send() {
90106
if p.conn == nil {
107+
go p.connect()
91108
return
92109
}
93110

@@ -99,6 +116,7 @@ func (p *Publisher) send() {
99116
_, err = p.conn.Write(bytes)
100117
if err != nil {
101118
log.Printf("Could not write message: %v", err)
119+
p.disconnect()
102120
}
103121
}
104122

0 commit comments

Comments
 (0)