From: Eugene Crosser <crosser@average.org>
Date: Thu, 16 Jun 2022 21:17:25 +0000 (+0200)
Subject: collector: enable SO_KEEPALIVE on accepted conn.
X-Git-Tag: 0.99~11
X-Git-Url: http://average.org/gitweb/?a=commitdiff_plain;h=b955a03a2d2146a705ac4d19047cc26b38cdd878;p=loctrkd.git

collector: enable SO_KEEPALIVE on accepted conn.

Terminals have a bad habit to drop off the network without closing the
connection. That will leave the server with orphan connections
accumulating over time.
---

diff --git a/gps303/collector.py b/gps303/collector.py
index c2efd79..ef80cc5 100644
--- a/gps303/collector.py
+++ b/gps303/collector.py
@@ -3,7 +3,14 @@
 from configparser import ConfigParser
 from logging import getLogger
 from os import umask
-from socket import socket, AF_INET6, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
+from socket import (
+    socket,
+    AF_INET6,
+    SOCK_STREAM,
+    SOL_SOCKET,
+    SO_KEEPALIVE,
+    SO_REUSEADDR,
+)
 from struct import pack
 from time import time
 from typing import Dict, List, Optional, Tuple
@@ -206,6 +213,7 @@ def runserver(conf: ConfigParser, handle_hibernate: bool = True) -> None:
                             break
                 elif sk == tcpfd:
                     clntsock, clntaddr = tcpl.accept()
+                    clntsock.setsockopt(SOL_SOCKET, SO_KEEPALIVE, 1)
                     topoll.append((clntsock, clntaddr))
                 elif fl & zmq.POLLIN:
                     received = clients.recv(sk)