From 5f1f98f02fe339f35feb5e3acd4aa89900de998f Mon Sep 17 00:00:00 2001 From: heimoshuiyu Date: Mon, 16 Dec 2019 20:02:18 +0800 Subject: [PATCH] rewrite sticky package function --- plugins/net.py | 83 ++++++++++++++++++++++++++++++++++++-------------- test_file.py | 14 ++++----- 2 files changed, 67 insertions(+), 30 deletions(-) diff --git a/plugins/net.py b/plugins/net.py index 4664146..57132ff 100644 --- a/plugins/net.py +++ b/plugins/net.py @@ -69,46 +69,83 @@ class Netrecv: def process_connection(self, conn, addr): print('Connection accpet %s' % str(addr)) + data = b'' while True: - data = conn.recv(RECV_BUFF) - if not data: + new_data = conn.recv(RECV_BUFF) + if not new_data: conn.close() - print('return') + print('return 1') return - while data: + data += new_data + + while True: + + # try unpack # dp = Datapack(check_head=False) dp.encode_data = data try: - print(data) - data = dp.decode(only_head=True) - except Exception as e: # Not enough data - print('Decode error %s: %s' % (type(e), str(e))) + if data: + data = dp.decode(only_head=True) + else: + print('Null data') + break + except Exception as e: + print('Decode error') break + # try unpack # + if dp.method == 'file': pass else: length = int(dp.head['length']) data_length = len(data) + + # 3 condition if length == data_length: - print('length == data_length') + print('=') dp.body = data 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): print('Connection accpet %s' % str(addr)) diff --git a/test_file.py b/test_file.py index 209ca6d..a191a03 100644 --- a/test_file.py +++ b/test_file.py @@ -5,15 +5,15 @@ data = '''post log msw/1.0 from: network flag: abcdefgh 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 flag: 12345678 num: 1/1 @@ -21,7 +21,7 @@ length: 3 abc''' -data_list = [data, data2, data3,data4] +data_list = [data, data2, data3, data4] code_list = [] for i in data_list: code_list.append(i.encode()) @@ -31,4 +31,4 @@ s.connect(('127.0.0.1', 3900)) for i in code_list: s.sendall(i) - time.sleep(1) \ No newline at end of file + time.sleep(0) \ No newline at end of file