def handle_client(sock, addr): """Client handler.""" LOG.debug("new client %s:%s" % addr) #client authentication user, auth_res = client_auth(sock, addr) if auth_res != AUTH_RES_OK: LOG.debug("AUTH failed.addr = %s:%s" % addr) return cli = Client(user, sock, addr) #register to client manager if register_client(cli.user, cli.in_mq) == False: LOG.fatal("REGISTER failed.user = %s" % cli.user) return while True: #process incoming messages cli.process_msg() #select() sock wlist = [] if len(cli.req_pkt) > 0 or cli.wait_ping_rsp == True or len(cli.ctrl_pkt) > 0: wlist.append(sock) rsocks, wsocks, _ = select.select([sock], wlist, [], 0.1) if len(rsocks) > 0: ba_pkt, err = packet.get_all_data_pkt(sock) if ba_pkt is None or err is not None: LOG.debug("read client sock err.exiting") break if ba_pkt[0] == packet.TYPE_DATA_RSP or ba_pkt[0] == packet.TYPE_CTRL: cli.process_rsp_pkt(ba_pkt, len(ba_pkt)) elif ba_pkt[0] == packet.TYPE_PING_REQ: cli.wait_ping_rsp = True if len(wsocks) > 0: if cli.send_ctrl_pkt() == False: break #forward http request packet to client if cli.req_pkt_fwd() == False: break #send PING-RSP to client if cli.ping_rsp_send() == False: break gevent.sleep(0) unregister_client(cli) cli.disconnect()
def client_loop(server, port, user, passwd, host_host, host_port): """Main client loop.""" #connect to server server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) mysock.setkeepalives(server_sock) ret, err = mysock.connect(server_sock, (server, port)) if err != None: LOG.error("can't connect to server") return if do_auth(user, passwd, server_sock) == False: sys.exit(1) LOG.info("Authentication successfull") client = Client(server_sock) #start looping while True: #cek last_ping client.cek_ping_req() #server_sock select() wsock = [] if client.any_pkt_to_server() or any_host_response(): wsock.append(server_sock) to_read, to_write, _ = select.select([server_sock], wsock, [], 1) if len(to_read) > 0: #read sock ba_pkt, err = packet.get_all_data_pkt(server_sock) if ba_pkt is None or err != None: LOG.error("Connection to server closed") break #request packet if ba_pkt[0] == packet.TYPE_DATA_REQ: local_status, ses_id = forward_incoming_req_pkt(ba_pkt, len(ba_pkt), host_host, host_port) if local_status == LOCAL_STATUS_DOWN: client.send_ctrl_local_down(ses_id) #ping rsp elif ba_pkt[0] == packet.TYPE_PING_RSP: #print "PING-RSP ", datetime.datetime.now() client.handle_ping_rsp(ba_pkt) #ctrl packet elif ba_pkt[0] == packet.TYPE_CTRL: LOG.debug("CTRL Packet. subtype = %d" % ba_pkt[1]) client.handle_ctrl_pkt(ba_pkt) else: LOG.error("Unknown packet.type = %d" % ba_pkt[0]) LOG.fatal("exiting...") sys.exit(-1) if len(to_write) > 0: forward_host_rsp(server_sock) if client.send_to_server_pkt() == False: break clean_host_conn() #select() untuk host sock rlist = [] for h_conn in HOST_CONNS_DICT.itervalues(): if h_conn.sock != None and h_conn.ended == False: rlist.append(h_conn.sock) if len(rlist) > 0: h_read, _, _ = select.select(rlist, [], [], 0.5) if len(h_read) > 0: for sock in h_read: accept_host_rsp(sock) #cek ping rsp if client.cek_ping_rsp() == False: LOG.error("PING-RSP timeout") break LOG.error("Client disconnected")