diff options
| author | citrons <citrons@mondecitronne.com> | 2025-06-07 17:43:51 -0500 |
|---|---|---|
| committer | citrons <citrons@mondecitronne.com> | 2025-06-07 17:43:51 -0500 |
| commit | 24b15604403341044fcb5f7ece18ffc9c569a2cf (patch) | |
| tree | 6789d0c3e4da2fcd26622171f7418033e97143e7 /client | |
| parent | 4fd84671877754ae3b66acb8a8af8cf0935a53c9 (diff) | |
more robust connection handling
Diffstat (limited to 'client')
| -rw-r--r-- | client/client/client.go | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/client/client/client.go b/client/client/client.go index 7c9cf03..0c563bf 100644 --- a/client/client/client.go +++ b/client/client/client.go @@ -45,19 +45,18 @@ func New(address string) Client { } func (c *Client) RunClient() { - sleep := time.Second / 4 + reconnectWait := time.Second / 4 for { - conn, err := net.Dial("tcp", c.Address) + conn, err := net.DialTimeout("tcp", c.Address, 30 * time.Second) if err != nil { c.message <- Message {func(mh MessageHandler) { mh.OnDisconnect(err) }} - time.Sleep(sleep) - sleep = min(sleep * 2, 30 * time.Second) + time.Sleep(reconnectWait) + reconnectWait = min(reconnectWait * 2, 30 * time.Second) continue } defer conn.Close() - sleep = time.Second / time.Duration(2 + rand.Int() % 4) recv, recvErr := proto.ReadLines(bufio.NewReader(conn)) send := make(chan proto.Line, 1) @@ -88,11 +87,10 @@ func (c *Client) RunClient() { }() defer close(c.send) - c.message <- Message {func(mh MessageHandler) { - mh.OnConnect() - }} - - var debugger Debugger + var ( + debugger Debugger + connected bool + ) run: for { select { case line := <-recv: @@ -101,6 +99,18 @@ func (c *Client) RunClient() { debugger.OnLine(line, false) }} } + + if !connected { + if line.Kind == '*' && line.Cmd.Kind == "hi" { + c.message <- Message {func(mh MessageHandler) { + mh.OnConnect() + }} + reconnectWait = + time.Second / time.Duration(2 + rand.Int() % 4) + connected = true + } + } + switch line.Kind { case '*': c.message <- Message {func(mh MessageHandler) { @@ -130,11 +140,13 @@ func (c *Client) RunClient() { return } } - c.message <- Message {func(mh MessageHandler) { - mh.OnDisconnect(err) - }} - time.Sleep(sleep) - sleep = min(sleep * 2, 30 * time.Second) + if connected { + c.message <- Message {func(mh MessageHandler) { + mh.OnDisconnect(err) + }} + } + time.Sleep(reconnectWait) + reconnectWait = min(reconnectWait * 2, 30 * time.Second) } } |
