From d3c266de90caac09562ba29d9ad75a5b89875cd8 Mon Sep 17 00:00:00 2001 From: Andreas Wrede Date: Mon, 11 Jul 2016 15:54:52 -0400 Subject: [PATCH] reopen UDP socket periodically --- hbc | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/hbc b/hbc index bcc7e62..a7e93ac 100755 --- a/hbc +++ b/hbc @@ -22,6 +22,7 @@ import syslog PORT = 50003 INTERVAL = 10 +REOPENC = 6 PIDFILE = '/tmp/hbc.pid' VER = 4 MAXRECV = 32767 @@ -54,13 +55,22 @@ class Conn: self.send = 0 self.lastsend = 0 # time() last msg was sent self.rtts = [0] - self.sock=socket.socket(af, socket.SOCK_DGRAM) + self.sock = None + + + def open(self): + self.sock=socket.socket(self.af, socket.SOCK_DGRAM) self.sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, \ self.sock.getsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR) | 1) + def sendto(self, msg, ID = 'HTB'): # default ID is HearTBeat global warned1 + if self.send % REOPENC == 0: + self.close() + if not self.sock: + self.open() msg['name'] = shortname(iam) msg['id'] = self.conId msg['ver'] = VER @@ -73,6 +83,7 @@ class Conn: except socket.error as e: if not warned1: log("socket error: %s %s:%s" % (e, self.addr, self.port)) warned1 = True + self.close() return self.send += 1 self.lastsend = time.time() @@ -252,15 +263,16 @@ def restart(): def process(): global running, dorestart - ifiles = {} - conIds = {} - for conn in conns: - ifiles[conns[conn].sock.fileno()] = conns[conn].sock - conIds[conns[conn].sock.fileno()] = conn nextReport = time.time() while running: while time.time() < nextReport: + ifiles = {} + conIds = {} + for conn in conns: + ifiles[conns[conn].sock.fileno()] = conns[conn].sock + conIds[conns[conn].sock.fileno()] = conn + sleep=nextReport - time.time() if sleep <= 0: break