rewrite sticky package function

This commit is contained in:
2019-12-16 20:02:18 +08:00
parent dac2e1bdb3
commit 5f1f98f02f
2 changed files with 67 additions and 30 deletions

View File

@@ -69,46 +69,83 @@ class Netrecv:
def process_connection(self, conn, addr): def process_connection(self, conn, addr):
print('Connection accpet %s' % str(addr)) print('Connection accpet %s' % str(addr))
data = b''
while True: while True:
data = conn.recv(RECV_BUFF) new_data = conn.recv(RECV_BUFF)
if not data: if not new_data:
conn.close() conn.close()
print('return') print('return 1')
return return
while data: data += new_data
while True:
# try unpack #
dp = Datapack(check_head=False) dp = Datapack(check_head=False)
dp.encode_data = data dp.encode_data = data
try: try:
print(data) if data:
data = dp.decode(only_head=True) data = dp.decode(only_head=True)
except Exception as e: # Not enough data else:
print('Decode error %s: %s' % (type(e), str(e))) print('Null data')
break
except Exception as e:
print('Decode error')
break break
# try unpack #
if dp.method == 'file': if dp.method == 'file':
pass pass
else: else:
length = int(dp.head['length']) length = int(dp.head['length'])
data_length = len(data) data_length = len(data)
# 3 condition
if length == data_length: if length == data_length:
print('length == data_length') print('=')
dp.body = data dp.body = data
data = b'' data = b''
elif length > data_length:
print('length > data_length')
dp.body = data
while len(dp.body) < length:
data = conn.recv(RECV_BUFF)
if not data:
conn.close()
print('Connection close, dp drop')
return
need_length = len(data) - len(dp.body)
dp.body += data[:need_length]
data = data[need_length:]
dp.encode()
print('---------------\n' + dp.encode_data.decode() + '\n---------------')
elif length > data_length:
while data_length < length:
new_data = conn.recv(RECV_BUFF)
if not new_data:
print('return 2')
return
new_data_size = len(new_data)
still_need = length - data_length
print(still_need)
if new_data_size == still_need:
print('data', data)
print('net_data', new_data)
data += new_data
data_length = len(data)
dp.body = data
data = b''
elif new_data_size < still_need:
print('data', data)
print('net_data', new_data)
data += new_data
data_length = len(data)
else:
print('else')
data += new_data[:still_need]
new_data = new_data[still_need:]
data_length = len(data)
dp.body = data
data = new_data
else:
pass
dp.encode()
print('###############\n' + dp.encode_data.decode() + '\n###############')
def _process_connection(self, conn, addr): def _process_connection(self, conn, addr):
print('Connection accpet %s' % str(addr)) print('Connection accpet %s' % str(addr))

View File

@@ -5,15 +5,15 @@ data = '''post log msw/1.0
from: network from: network
flag: abcdefgh flag: abcdefgh
num: 1/1 num: 1/1
lengt''' length: 9
data2 = '''h: 9 12345'''
123''' data2 = '''678'''
data3 ='''45678''' data3 = '''9'''
data4 = '''9post log msw/1.1 data4 = '''post log msw/1.1
from: network from: network
flag: 12345678 flag: 12345678
num: 1/1 num: 1/1
@@ -21,7 +21,7 @@ length: 3
abc''' abc'''
data_list = [data, data2, data3,data4] data_list = [data, data2, data3, data4]
code_list = [] code_list = []
for i in data_list: for i in data_list:
code_list.append(i.encode()) code_list.append(i.encode())
@@ -31,4 +31,4 @@ s.connect(('127.0.0.1', 3900))
for i in code_list: for i in code_list:
s.sendall(i) s.sendall(i)
time.sleep(1) time.sleep(0)