def handle_register(self,data) : logging.debug("register receive {}".format(data)) if not protocol.can_parse(data) : logging.info("receive invalid data") raise Exception("receive invalid data ") ty = protocol.view_frame_type(data) body = protocol.get_frame_data(data) if ty != protocol.FRAME_REGISTER : logging.info("receive invalid data") raise Exception("receive invalid data") tports ,_ = protocol.parse_register_data(body) print(tports) try : for tport in tports : listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listen_socket.bind(('127.0.0.1', tport[1])) listen_socket.listen(5) logging.debug("register port ... ") logging.debug(listen_socket) self.proxy_sockets.append(listen_socket) self.proxy_socket_map[listen_socket] = tport[0] except : body = protocol.terminate_data(Server.maver,Server.miver,0x21) data = protocol.add_frame_head(protocol.FRAME_TERMINATE,body) self.ssock.send(data) raise logging.info("port register success ") return
def handle_recv(self, sock): stream = self.stream_sock_map.get_v(sock) data = stream.recv_msg() if data == b'': # 目标socket close self.reset_stream(stream.stream_id, 0x0) return if stream.closed: return msg = protocol.add_frame_head(protocol.FRAME_DATA, data, stream.stream_id) self.ssock_queue.put(msg) return
def reset_stream(self, stream_id, code): # 发送关闭流帧 logging.debug(" clost stream id={} code={}".format(stream_id, code)) body = protocol.reset_stream_data(code) msg = protocol.add_frame_head(protocol.FRAME_RST_STREAM, body, stream_id) self.ssock_queue.put(msg) # 将流更改为close ,并加入到待销毁 stream = self.stream_map[stream_id] stream.closed = True self.add_stream_destory(stream) return
def init(self): logging.info(" connect server ... ") # 与服务端建立连接 ,并且发送认认证和端口注册信息 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((self.server_ip, self.server_port)) self.ssock = sock self.stream_manager = stream.StreamManager(self.ssock, self.ssock_queue) # 认证信息 auth_body = protocol.auth_data(Client.mar_version, Client.min_version, self.uname, self.passwd) auth_msg = protocol.add_frame_head(protocol.FRAME_AUTH, auth_body) self.ssock_queue.put(auth_msg) # 端口信息 register_body = protocol.register_data(self.tcp_ports, self.udp_ports) print(register_body) register_msg = protocol.add_frame_head(protocol.FRAME_REGISTER, register_body) self.ssock_queue.put(register_msg) return
def handle_auth(self,data): logging.info("handle auth receive {}".format(data)) if not protocol.can_parse(data): logging.info("receive invalid data ") raise Exception("receive invalid data ") ty = protocol.view_frame_type(data) body = protocol.get_frame_data(data) if ty != protocol.FRAME_AUTH : logging.info("receive invalid data ") raise Exception("receive invalid data ") maver ,miver ,uname,passwd = protocol.parse_auth_data(body) logging.info('version={}.{} uname={} passwd={}'.format(maver,miver,uname,passwd)) if (maver,miver) != (Server.maver,self.miver) : body = protocol.terminate_data(Server.maver,Server.miver,0x2) data = protocol.add_frame_head(protocol.FRAME_TERMINATE,body) self.ssock.send(data) raise Exception(" version error ") if (uname,passwd) != (self.uname,self.passwd) : body = protocol.terminate_data(Server.maver,Server.miver,0x12) data = protocol.add_frame_head(protocol.FRAME_TERMINATE,body) self.ssock.send(data) raise Exception(" uname or passwd error ") logging.info("client auth success") return
def open_stream(self, ty, rport, sock): # 发送对应帧 stream_id = self.generate_stream_id() logging.debug("open stream id={} ty={} rport={}".format( stream_id, ty, rport)) body = protocol.open_stream_data(ty, rport, stream_id) msg = protocol.add_frame_head(protocol.FRAME_OPEN_STREAM, body) self.ssock_queue.put(msg) # 建立对应流 stream = Stream(stream_id, sock) self.stream_map[stream_id] = stream self.stream_sock_map.put(stream, sock) self.inputs.append(sock) return