add client timeout via net/Conn SetDeadline

This commit is contained in:
Reese Norris
2025-07-06 17:40:11 -07:00
parent 8c49beeb8c
commit 8affb6210e
4 changed files with 14 additions and 1 deletions

View File

@@ -108,6 +108,8 @@ func (s *Server) eventLoop(client *Client) {
go client.senderWorker()
for {
// Set deadline and attempt to read
client.conn.SetReadDeadline(getTimeBySecondsInFuture(s.cfg.ConnectionTimeoutSeconds))
if !client.scanner.Scan() {
return
}

View File

@@ -35,9 +35,11 @@ func (s *Server) handleConn(ctx context.Context, conn net.Conn) {
fmt.Println(err)
}
}()
defer conn.Close()
// Set timeout for login phase
conn.SetDeadline(getTimeBySecondsInFuture(s.cfg.ConnectionTimeoutSeconds))
if err := sendServerIdent(conn); err != nil {
fmt.Printf("Error sending server ident: %v\n", err)
return

View File

@@ -16,6 +16,9 @@ type ServerConfig struct {
NumMetarWorkers int `env:"NUM_METAR_WORKERS, default=4"` // Number of METAR fetch workers to run
ServiceHTTPListenAddr string `env:"SERVICE_HTTP_LISTEN_ADDR, default=:13618"`
// Seconds after which a connection will be closed for inactivity
ConnectionTimeoutSeconds int `env:"CONNECTION_TIMEOUT_SECONDS, default=30"`
}
func loadServerConfig(ctx context.Context) (config *ServerConfig, err error) {

View File

@@ -7,6 +7,7 @@ import (
"slices"
"strconv"
"strings"
"time"
)
// FSD error codes
@@ -418,3 +419,8 @@ func sendSendFastPacket(client *Client, enabled bool) {
client.send(builder.String())
}
// getTimeBySecondsInFuture returns time.Now + seconds
func getTimeBySecondsInFuture(seconds int) time.Time {
return time.Now().Add(time.Duration(seconds) * time.Second)
}