コード例 #1
0
ファイル: clientd.py プロジェクト: iwanbk/roomahost
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()
コード例 #2
0
ファイル: client.py プロジェクト: iwanbk/roomahost
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")