From a8260e5e891d70e63a113d6eccdd76284462661a Mon Sep 17 00:00:00 2001 From: Gavin Tweedie <59038163+gavintweedie@users.noreply.github.com> Date: Sun, 10 Aug 2025 19:36:32 +0800 Subject: [PATCH] Update NetClient.py to enable TCP Keepalives Enable TCP Keepalives for two purposes: - Keep sessions alive - Detect lost sessions quicker to recover --- src/airtouch2/common/NetClient.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/airtouch2/common/NetClient.py b/src/airtouch2/common/NetClient.py index bdd3e69..4806bfb 100644 --- a/src/airtouch2/common/NetClient.py +++ b/src/airtouch2/common/NetClient.py @@ -1,7 +1,8 @@ import asyncio import errno import logging -from socket import gaierror +import socket +#from socket import gaierror from typing import Callable from airtouch2.common.interfaces import CoroCallback, Serializable, TaskCreator @@ -33,8 +34,14 @@ def __init__(self, host: str, port: int, on_connect: CoroCallback, handle_messag async def connect(self) -> bool: """Opens connection to the server, returns True/False if successful/unsuccessful""" _LOGGER.debug(f"Connecting to {self._host_ip} on port {self._host_port}") + try: self._reader, self._writer = await asyncio.open_connection(self._host_ip, self._host_port) + sock = self._writer.get_extra_info('socket') + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # Enable keep-alive + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60) # Idle time before sending probes (seconds) + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 10) # Interval between probes (seconds) + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5) # Number of probes before considering connection dead except OSError as e: _LOGGER.warning(f"Could not connect to host {self._host_ip}") if isinstance(e, gaierror): @@ -117,4 +124,4 @@ async def _try_reconnect(self) -> None: retries += 1 if not retries % 60 or retries == 4: _LOGGER.info("Server is not responding, will continue trying to reconnect every 10s") - _LOGGER.info("Reconnected") \ No newline at end of file + _LOGGER.info("Reconnected")