コード例 #1
0
 def __init__(self, delay=0.0):
     self.netstream = netstream.netstream()
     self.delay = int(delay * 1000) / 2
     self.noisy = int(self.delay * 2 / 3)
     self.tbase = time.time()
     self.block = 0
     self.sendmsg = []
     self.recvmsg = []
コード例 #2
0
	def on_connect (self, **kw):
		self.mask = 0
		ipv6 = False
		bracket = False
		text = self.remote.get().strip('\r\n\t ')
		addr = ''

		for ch in text:
			if not bracket:
				if ch == '[': bracket = True
			else:
				ipv6 = True
				if ch == ']': bracket = False
				elif ch == ':': ch = '.'
			addr += ch

		if not ':' in addr:
			return self.address_error(text)

		part = addr.split(':')

		if not len(part) in (2, 3):
			return self.address_error(text)
		port = 0
		try: 
			port = int(part[1])
		except: 
			return self.address_error(text)
		if port == 0:
			self.append('port can not be zero\n', COLOR_ERROR)
			return 0
		head = -1
		
		if len(part) == 3:
			try:
				head = int(part[2])
				if head < 0 or head > 13:
					self.append('format must >= 0 and <= 13\n', COLOR_ERROR)
					return 0
			except:
				pass
			names = { 'WORDLSB': 0, 'WORDMSB':1, 'DWORDLSB':2, 'DWORDMSB':3,
				'BYTELSB': 4, 'BYTEMSB': 5, 'EWORDLSB': 6, 'EWORDMSB': 7,
				'EDWORDLSB': 8, 'EDWORDMSB': 9, 'EBYTELSB': 10,
				'EBYTEMSB': 11, 'DWORDMASK': 12, 'RAWDATA': 13, 'RAW': 13 }
			if head < 0 and part[2].upper() in names:
				head = names.get(part[2].upper(), -1)
			if head < 0:
				self.append('format "%s" invalid\n'%part[2], COLOR_ERROR)
				return 0

		ips = part[0].split('.')

		if not ipv6:
			if len(ips) != 4:
				return self.address_error(text)

			try:
				n = [ int(x) for x in ips ]
				for x in n:
					if x < 0 or x > 255:
						self.append('ip address "%s" invalid\n'%part[0], COLOR_ERROR)
						return 0
			except:
				self.append('ip address "%s" invalid\n'%part[0], COLOR_ERROR)
				return 0

		if self.sock:
			self.sock.close()
			self.sock = None
		
		ip = part[0].replace('[', ' ').replace(']', ' ').strip('\r\n\t ')

		if ipv6: ip = ip.replace('.', ':')
		self.sock = netstream.netstream(head)

		try:
			self.sock.connect(ip, port, head)
		except Exception, e:
			self.append('ip address "%s" invalid: %s\n'%(text, str(e)), COLOR_ERROR)
			self.sock.close()
			self.sock = None
			return 0
コード例 #3
0
ファイル: test.py プロジェクト: konlil/CarPot
#coding: gbk
import netstream

client = netstream.netstream()
client.connect('127.0.0.1', 32005)
client.nodelay(0)
client.nodelay(1)

report = {
	'cid':		0x01, 
	'ctype':	0x11, 
	'scnt': 	198, 
	'iostat':	0xAA,		#0xAA, 0x55
	'stot':		200, 
	'stat':		0x00, 
	'counter':	0x01,
}
client.send_report(report)

client.close()
コード例 #4
0
ファイル: nethost.py プロジェクト: konlil/CarPot
	def process(self):
		current = time.time()
		if self.state != gvars.NET_STATE_ESTABLISHED:
			return 0
		sock = None
		try:
			sock, remote = self.sock.accept()
			sock.setblocking(0)
		except:
			pass
		# 最大支持65536个客户端连接
		if self.count >= 0x10000:
			try:
				sock.close()
			except:
				pass
		if sock:
			pos = -1
			#找到空位
			for i in xrange(len(self.clients)):
				if self.clients[i] == None:
					pos = i
					break
			#没找到空位则新增
			if pos < 0:
				pos = len(self.clients)
				self.clients.append(None)

			hid = (pos & 0xffff) | (self.index << 16)
			self.index += 1
			if self.index >= 0x7fff:
				self.index = 1

			client = netstream.netstream()
			client.assign(sock)
			client.hid = hid
			client.tag = -1
			client.active = current
			client.peername = sock.getpeername()
			self.clients[pos] = client
			self.count += 1
			self.queue.append((gvars.NET_NEW, hid, 0, repr(client.peername)))
			log.info('client connected, peer: %s, pos: %d, index: %d'%(client.peername, pos, self.index-1))

		for pos in xrange(len(self.clients)):
			client = self.clients[pos]
			if not client:
				continue

			#handle client message
			client.process()
			# log.debug('try recv client data...., client stats: %d'%client.status())
			while client.status() == gvars.NET_STATE_ESTABLISHED:
				data = client.recv()
				if data is None:
					break
				self.queue.append((gvars.NET_DATA, client.hid, client.tag, data))
				client.active = current

			# handle client leave
			timeout = current - client.active
			if (client.status() == gvars.NET_STATE_STOP) or (timeout >= self.timeout):
				hid, tag = client.hid, client.tag
				self.queue.append((gvars.NET_LEAVE, hid, tag, ''))
				self.clients[pos] = None
				client.close()
				log.info('client leave, peer: %s, pos: %d'%(client.peername, pos))
				del client
				self.count -= 1

		current = long(time.time()* 1000)
		if current - self.timeslap > 100000:
			self.timeslap = current
		period = self.period
		if period > 0:
			while self.timeslap < current:
				self.queue.append(gvars.NET_TIMER, 0, 0, '')
				self.timeslap += period
		
		return 0