From 24b15604403341044fcb5f7ece18ffc9c569a2cf Mon Sep 17 00:00:00 2001 From: citrons Date: Sat, 7 Jun 2025 17:43:51 -0500 Subject: more robust connection handling --- client/client/client.go | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) (limited to 'client') 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) } } -- cgit v1.2.3