diff --git a/mtprotoproxy.py b/mtprotoproxy.py index 54b153c..039f9af 100755 --- a/mtprotoproxy.py +++ b/mtprotoproxy.py @@ -639,24 +639,31 @@ async def handle_handshake(reader, writer): return False +def try_setsockopt(sock, level, option, value): + try: + sock.setsockopt(level, option, value) + except OSError as E: + pass + + def set_keepalive(sock, interval=40, attempts=5): sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) if hasattr(socket, "TCP_KEEPIDLE"): - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, interval) + try_setsockopt(sock, socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, interval) if hasattr(socket, "TCP_KEEPINTVL"): - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval) + try_setsockopt(sock, socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval) if hasattr(socket, "TCP_KEEPCNT"): - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, attempts) + try_setsockopt(sock, socket.IPPROTO_TCP, socket.TCP_KEEPCNT, attempts) def set_ack_timeout(sock, timeout): if hasattr(socket, "TCP_USER_TIMEOUT"): - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_USER_TIMEOUT, timeout*1000) + try_setsockopt(sock, socket.IPPROTO_TCP, socket.TCP_USER_TIMEOUT, timeout*1000) def set_bufsizes(sock, recv_buf, send_buf): - sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, recv_buf) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, send_buf) + try_setsockopt(sock, socket.SOL_SOCKET, socket.SO_RCVBUF, recv_buf) + try_setsockopt(sock, socket.SOL_SOCKET, socket.SO_SNDBUF, send_buf) async def open_connection_tryer(addr, port, limit, timeout, max_attempts=3):