diff --git a/tcp-connection.go b/tcp-connection.go index 05e3a4a..e9700ac 100644 --- a/tcp-connection.go +++ b/tcp-connection.go @@ -1,8 +1,10 @@ package main import ( + "bufio" "encoding/binary" "fmt" + "io" "log" "net" "time" @@ -130,6 +132,7 @@ func WaitForFrame(conn net.Conn, resultChan chan<- FrameWithPayload) error { payload := make([]byte, frame.Length) _, err = conn.Read(payload) if err != nil { + conn.Close() return err } resultChan <- FrameWithPayload{ @@ -169,21 +172,28 @@ func (c *Connection) Listen() (*GenericListener, error) { } const ( - MaxCallDuration = 900 * time.Millisecond + MaxCallDuration = 300 * time.Millisecond ListenerKeepalive = 5 * time.Second ) func (l *GenericListener) HandleConnection(conn net.Conn) { - for !l.StopListener { - ch := make(chan FrameWithPayload, 1) - //conn.SetReadDeadline(time.Now().Add(MaxCallDuration)) - go WaitForFrame(conn, ch) - frame := <-ch - err := l.HandleFrame(conn, &frame) - if err != nil { - log.Fatalf("Error in handler: %v\n", err) - } + var err error + var frame Frame + b := bufio.NewReader(conn) + for err != io.EOF { + err = binary.Read(b, binary.LittleEndian, &frame) + + if err == nil && frame.IsValid() { + payload := make([]byte, frame.Length) + _, err = b.Read(payload) + if err == nil { + err = l.HandleFrame(conn, &FrameWithPayload{ + Frame: frame, + Payload: payload, + }) + } + } } }