dejsem.1.5/python/dejsem.pycharm/meter.py
author hh
Wed, 27 Nov 2019 09:50:16 +0100
changeset 0 676905a3b03c
permissions -rw-r--r--
--
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
hh
parents:
diff changeset
     1
# coding=utf8
hh
parents:
diff changeset
     2
hh
parents:
diff changeset
     3
import socket, time, sys
hh
parents:
diff changeset
     4
from d import D
hh
parents:
diff changeset
     5
from parms import Parms
hh
parents:
diff changeset
     6
hh
parents:
diff changeset
     7
class Meter():
hh
parents:
diff changeset
     8
hh
parents:
diff changeset
     9
	def __init__(self, d):
hh
parents:
diff changeset
    10
		self.d = D("{}, troughput measuring daemon".format(d.debid))
hh
parents:
diff changeset
    11
hh
parents:
diff changeset
    12
	def run(self):
hh
parents:
diff changeset
    13
		self.d.log("started", sev=3)
hh
parents:
diff changeset
    14
		ssc, sc = None, None
hh
parents:
diff changeset
    15
		ssc = self.bindwait('', Parms.baseport)
hh
parents:
diff changeset
    16
		try:
hh
parents:
diff changeset
    17
			while True:
hh
parents:
diff changeset
    18
				self.d.log("accepting...", sev=3)
hh
parents:
diff changeset
    19
				sc = ssc.accept()[0]
hh
parents:
diff changeset
    20
				self.d.log("accepted", sev=3)
hh
parents:
diff changeset
    21
				n1 = 0
hh
parents:
diff changeset
    22
				n0 = len(sc.recv(16 * 1024))
hh
parents:
diff changeset
    23
				while n0 > 0:
hh
parents:
diff changeset
    24
					n1 = n1 + n0
hh
parents:
diff changeset
    25
					if self.d.ll(5): self.d.log("n0={}, n1={}".format(n0, n1))
hh
parents:
diff changeset
    26
					if n1 >= 16 * 1024:
hh
parents:
diff changeset
    27
						if self.d.ll(5): self.d.log("{} received, sending acknoledgement".format(n1))
hh
parents:
diff changeset
    28
						sc.send(bytes("=>{:08d}".format(n1), "utf8"))
hh
parents:
diff changeset
    29
						n1 = 0
hh
parents:
diff changeset
    30
					n0 = len(sc.recv(16 * 1024))
hh
parents:
diff changeset
    31
				sc.close()
hh
parents:
diff changeset
    32
		except KeyboardInterrupt:
hh
parents:
diff changeset
    33
			pass
hh
parents:
diff changeset
    34
		except Exception as e:
hh
parents:
diff changeset
    35
			self.d.abendMsg("measuring", e=e)
hh
parents:
diff changeset
    36
		self.d.log("closing ssc...", sev=4)
hh
parents:
diff changeset
    37
		if sc: sc.close()
hh
parents:
diff changeset
    38
		if ssc: ssc.close()
hh
parents:
diff changeset
    39
hh
parents:
diff changeset
    40
	def bindwait(self, host, port):
hh
parents:
diff changeset
    41
		ssc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
hh
parents:
diff changeset
    42
		while True:
hh
parents:
diff changeset
    43
			try:
hh
parents:
diff changeset
    44
				ssc.bind((host, port))
hh
parents:
diff changeset
    45
				break
hh
parents:
diff changeset
    46
			except Exception as e:
hh
parents:
diff changeset
    47
				if e.strerror == "Address already in use":
hh
parents:
diff changeset
    48
					self.d.log("Address {}:{} already in use, waiting 10 secs...".format(host, port))
hh
parents:
diff changeset
    49
					time.sleep(10)
hh
parents:
diff changeset
    50
					continue
hh
parents:
diff changeset
    51
				self.d.abend("bind", e)
hh
parents:
diff changeset
    52
				sys.exit(1)
hh
parents:
diff changeset
    53
		ssc.listen(1)
hh
parents:
diff changeset
    54
		self.d.log("bound to {}:{}".format(host, port), sev=2)
hh
parents:
diff changeset
    55
		return ssc