This commit is contained in:
2020-04-01 11:15:25 +08:00
parent adc6f65bd1
commit 71d15fffea

View File

@@ -20,7 +20,6 @@ def main():
network_controller.i_did_something() network_controller.i_did_something()
class Network_controller: # manage id and connection class Network_controller: # manage id and connection
def __init__(self): def __init__(self):
self.send_queue = queue.Queue() self.send_queue = queue.Queue()
@@ -30,9 +29,13 @@ class Network_controller: # manage id and connection
self.wheel_queue = queue.Queue() self.wheel_queue = queue.Queue()
self.netlist = [] # store nagetive connection self.netlist = [] # store nagetive connection
self.addrlist = [] # store config connection self.netlist_pass = []
self.dhtlist = [] # store exchanged connection self.conflist = [] # store config connection
self.conflist_pass = []
self.mhtlist = [] # store exchanged connection
self.mhtlist_pass = []
self.proxylist = [] # store connection behind proxy self.proxylist = [] # store connection behind proxy
self.proxylist_pass = []
self.start_wheel_thread = threading.Thread(target=self.start_wheel, args=(), daemon=True) self.start_wheel_thread = threading.Thread(target=self.start_wheel, args=(), daemon=True)
self.start_wheel_thread.start() self.start_wheel_thread.start()
@@ -67,11 +70,22 @@ class Network_controller: # manage id and connection
def start_positive_connecting(self): def start_positive_connecting(self):
self.read_addrlist() self.read_addrlist()
for addr in self.addrlist:
self.try_to_connect(addr) while True:
for addr in self.conflist:
self.try_to_connect(addr, conntype='normal')
time.sleep(3)
for addr in self.mhtlist:
self.try_to_connect(addr, conntype='mht')
time.sleep(3)
time.sleep(4)
def try_to_connect(self, addr): def try_to_connect(self, addr, conntype='normal'):
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try: try:
conn.connect(addr) conn.connect(addr)
@@ -79,7 +93,7 @@ class Network_controller: # manage id and connection
print('Connect to %s failed, %s: %s' % (str(addr), type(e), str(e))) print('Connect to %s failed, %s: %s' % (str(addr), type(e), str(e)))
return return
connection = Connection(conn, addr, self, positive=True) connection = Connection(conn, addr, self, positive=True, conntype=conntype)
connection.i_did_something() connection.i_did_something()
@@ -93,9 +107,10 @@ class Network_controller: # manage id and connection
lines = raw_data.split('\n') lines = raw_data.split('\n')
for line in lines: for line in lines:
ip, port = line.split(':') ip, port = line.split(':')
ip = socket.gethostbyname(ip)
port = int(port) port = int(port)
self.addrlist.append((ip, port)) self.conflist.append((ip, port))
def i_did_something(self): # go f**k your yeallow line def i_did_something(self): # go f**k your yeallow line
@@ -104,7 +119,11 @@ class Network_controller: # manage id and connection
def process_command(self, dp): def process_command(self, dp):
if dp.body == b'status': if dp.body == b'status':
print('Online %s' % str(list(self.id_dict.keys()))) print('Online %s' % str(self.id_dict))
print('conflist %s' % str(self.conflist))
print('conflist_pass %s' % str(self.conflist_pass))
print('mhtlist %s' % str(self.mhtlist))
print('mhtlist_pass %s' % str(self.mhtlist_pass))
elif dp.body == b'mht' and dp.method == 'get': elif dp.body == b'mht' and dp.method == 'get':
ndp = dp.reply() ndp = dp.reply()
@@ -114,13 +133,22 @@ class Network_controller: # manage id and connection
connections = self.id_dict[id] connections = self.id_dict[id]
for connection in connections: for connection in connections:
ip, port = connection.conn.getpeername() ip, port = connection.conn.getpeername()
listen_port = connection.listen_port port = int(connection.listen_port)
connection_list.append((ip, listen_port)) connection_list.append((ip, port))
ndp.body = json.dumps(connection_list).encode() ndp.body = json.dumps(connection_list).encode()
send_queue.put(ndp) send_queue.put(ndp)
elif dp.method == 'reply':
mhtstr = dp.body.decode()
mhtlist = json.loads(mhtstr)
with self.lock:
for addr in mhtlist:
addr = (addr[0], addr[1])
if not addr in self.mhtlist and not addr in self.mhtlist_pass:
self.mhtlist.append(addr)
else: else:
print('Received unknown command', dp) print('Received unknown command', dp)
@@ -184,26 +212,59 @@ class Network_controller: # manage id and connection
connection.i_did_something() connection.i_did_something()
def set_connection(self, id, connection): def set_connection(self, connection):
id = connection.id
with self.lock: with self.lock:
if not self.id_dict.get(id): if not self.id_dict.get(id):
self.id_dict[id] = [] self.id_dict[id] = []
self.id_dict[id].append(connection) self.id_dict[id].append(connection)
self.all_connection_list.append(connection) self.all_connection_list.append(connection)
xxxlist, xxxlist_pass = self.getlist(connection.conntype)
addr = (connection.addr[0], connection.listen_port)
if addr in xxxlist:
xxxlist.remove(addr)
if not addr in xxxlist_pass:
xxxlist_pass.append(addr)
print('%s connected' % id) print('%s connected' % id)
def del_connection(self, id, connection): def del_connection(self, connection):
id = connection.id
with self.lock: with self.lock:
self.id_dict[id].remove(connection) self.id_dict[id].remove(connection)
self.all_connection_list.remove(connection) self.all_connection_list.remove(connection)
if id in self.id_dict and not self.id_dict.get(id): # del the empty user if id in self.id_dict and not self.id_dict.get(id): # del the empty user
del(self.id_dict[id]) del(self.id_dict[id])
if connection.listen_port: # avoid "None" addr port
xxxlist, xxxlist_pass = self.getlist(connection.conntype)
addr = (connection.addr[0], connection.listen_port)
if not addr in xxxlist:
xxxlist.append(addr)
if addr in xxxlist_pass:
xxxlist_pass.remove(addr)
print('%s disconnected' % id) print('%s disconnected' % id)
def getlist(self, conntype):
if conntype == 'net':
return self.netlist, self.netlist_pass
elif conntype == 'conf':
return self.conflist, self.conflist_pass
elif conntype == 'mht':
return self.mhtlist, self.mhtlist_pass
elif conntype == 'proxy':
return self.proxylist, self.proxylist_pass
else:
print('Could not find conntype %s' % conntype)
return None, None
class Connection: class Connection:
def __init__(self, conn, addr, netowrk_controller, positive=False): def __init__(self, conn, addr, netowrk_controller, positive=False, conntype='normal'):
self.conn = conn self.conn = conn
self.addr = addr self.addr = addr
self.netowrk_controller = netowrk_controller self.netowrk_controller = netowrk_controller
@@ -212,7 +273,16 @@ class Connection:
self.padding_queue = queue.Queue() self.padding_queue = queue.Queue()
self.thread_send = None self.thread_send = None
self.positive = positive self.positive = positive
self.listen_port = None self.listen_port = addr[1]
self.conntype = conntype
if self.conntype == 'normal':
if self.positive == True:
self.conntype = 'conf'
else:
self.conntype = 'net'
# type list
# normal(positive=True:conf, positive=False:net), mht, proxy
self.thread_recv = threading.Thread(target=self._init, args=(), daemon=True) self.thread_recv = threading.Thread(target=self._init, args=(), daemon=True)
self.thread_recv.start() self.thread_recv.start()
@@ -223,8 +293,9 @@ class Connection:
if err_code: if err_code:
print('<%s> Init connection failed, connection closed, code: %s' % (flag, err_code)) print('<%s> Init connection failed, connection closed, code: %s' % (flag, err_code))
self.conn.close() self.conn.close()
return
self.netowrk_controller.set_connection(self.id, self) self.netowrk_controller.set_connection(self)
self.thread_send = threading.Thread(target=self.send_func, args=(), daemon=True) self.thread_send = threading.Thread(target=self.send_func, args=(), daemon=True)
self.thread_send.start() self.thread_send.start()
@@ -290,7 +361,7 @@ class Connection:
# below code are using to closed connection # below code are using to closed connection
self.conn.close() self.conn.close()
self.netowrk_controller.del_connection(self.id, self) self.netowrk_controller.del_connection(self)
def check_id(self): def check_id(self):
@@ -331,7 +402,7 @@ class Connection:
return 3, dp.head.get('flag') return 3, dp.head.get('flag')
self.id = dp.head['id'] self.id = dp.head['id']
self.listen_port = dp.head.get('listen_port') self.listen_port = int(dp.head.get('listen_port'))
if self.id == jsondata.try_to_read_jsondata('id', 'unknown_id'): if self.id == jsondata.try_to_read_jsondata('id', 'unknown_id'):
print('you connect to your self') print('you connect to your self')