diff -uNr a/logotron/MANIFEST.TXT b/logotron/MANIFEST.TXT --- a/logotron/MANIFEST.TXT 4f46ccc238ff725712306588453e7a1ce18e29d69ed1589988e1e276dc7a6d0f1f0de31a86c47d08541e68150b83c55177499fa4c704453ac8c4edf372495daa +++ b/logotron/MANIFEST.TXT 821d10b9c27ed198b61373776b0a45bc7f9bf6e8896c070c358ad7a68af1b3b0a5fb4e7768a32af1e8a470e48476ea881bc3e3f2e39862b5bc0db14e649395f9 @@ -10,3 +10,4 @@ 594463 raw_line_fix lobbes "Fix to raw line export in reader.py to remove semi-colon from right side of nick on action lines" 595435 irssi_format diana_coman "Updates the irssi2tmsr converter to work on out-of-the-box irssi format. Updated README file too with example of format." 596907 sept_fixes asciilifeform "Several small improvements to bot and reader." +597604 active_disconnect bvt "Close current connection before opening a new one. Disable Nagle's algorithm. s/Listen/Receive/." diff -uNr a/logotron/bot.py b/logotron/bot.py --- a/logotron/bot.py 7980970a1d40b7a348a8fed795896d0cfa4568e3b4464768a0ea118efde16645bcdf2e934ba1ed42bc1d7708bccb9ef28f0645c13cbdc80754d00d8dd47a6729 +++ b/logotron/bot.py eda2c9e8930f8207a7588763084768f494b4cad89c6cccec07e9c7412ae8ce238a07b970a7f937048b7cae1f5d7d92cf67ed88e9802a7694ce0cb274d9a81dd3 @@ -14,7 +14,7 @@ ############################################################################## # Version. If changing this program, always set this to same # as in MANIFEST -Ver = 596907 +Ver = 597604 ############################################################################## @@ -129,15 +129,32 @@ # Used to compute 'uptime' time_last_conn = datetime.now() -# Init socket: -sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - -# Set keepalive: -sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) +# Socket will be here: +sock = None; # Initially we are not connected to anything connected = False +def init_socket(): + global sock + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + # Disable Nagle's algorithm for transmit operations + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + # Disable Nagle's algorithm for receive operation, Linux-only + try: + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_QUICKACK, 1) + except Exception as e: + logging.warning(e) + + connected = False + +def deinit_socket(): + global connected + global sock + sock.close() + connected = False + # Connect to given host:port; return whether connected def connect(host, port): logging.info("Connecting to %s:%s" % (host, port)) @@ -176,7 +193,7 @@ sock.send(message.encode("utf-8")) except (socket.timeout, socket.error) as e: logging.warning("Socket could not send! Disconnecting.") - connected = False + deinit_socket() return False except Exception as e: logging.exception(e) @@ -227,6 +244,10 @@ def irc(): global connected global time_last_conn + global sock + + # Initialize a socket + init_socket() # Connect to one among the specified servers, in given priority : while not connected: @@ -254,20 +275,20 @@ try: data = sock.recv(Buf_Size) except socket.timeout as e: - logging.debug("Listen timed out") + logging.debug("Receive timed out") continue except socket.error as e: - logging.warning("Listen socket error, disconnecting.") - connected = False + logging.warning("Receive socket error, disconnecting.") + deinit_socket() continue except Exception as e: logging.exception(e) - connected = False + deinit_socket() continue else: if len(data) == 0: - logging.warning("Listen socket closed, disconnecting.") - connected = False + logging.warning("Receive socket closed, disconnecting.") + deinit_socket() continue try: try: