diff -ur v6/sock_ut.py v7/sock_ut.py --- v6/sock_ut.py 2021-07-02 21:40:11.000000000 +0900 +++ v7/sock_ut.py 2021-07-14 22:40:49.000000000 +0900 @@ -59,8 +59,9 @@ if not send_bt( sc_to, bt ): break -# srv=name -# port=xxx,srv=name,id=xxx +# srv=name,port=xxx,host=xxx +# srv=name,id=xxx,port=xxx,host=xxx +# srv=name,id=xxx # kill=name # kill_base_srv # name @@ -70,15 +71,20 @@ return {} return dict( map( lambda t: t.split( '=' ), s.split( ',' ) ) ) +is_keys_dic = lambda d, ks: len( d ) == len( ks ) and all( map( lambda k: k in d, ks ) ) + is_key_dic = lambda d, k: len( d ) == 1 and k in d -is_srv_dic = lambda d: is_key_dic( d, 'srv' ) +is_srv_dic = lambda d: is_keys_dic( d, [ 'srv', 'port', 'host' ] ) is_kill_dic = lambda d: is_key_dic( d, 'kill' ) -def is_accept_dic( d ): - ks = [ 'port', 'srv', 'id' ] - return len( d ) == len( ks ) and all( map( lambda k: k in d, ks ) ) +is_accept_dic = lambda d: is_keys_dic( d, [ 'srv', 'id', 'port', 'host' ] ) + +def get_port_host_from_dic( d ): + port = int( d.get( 'port' ) ) + host = d.get( 'host' ) + return ( port, host ) srvs = {} reqs = {} @@ -88,6 +94,8 @@ if name in srvs: return + ( port, host ) = get_port_host_from_dic( d ) + q = thr.que_new() srvs[ name ] = q @@ -96,6 +104,7 @@ s = q.get() if s == 'kill': break + s += ',port={},host={}'.format( port, host ) if not send_str( sc, s ): break @@ -103,6 +112,7 @@ dbg.out( 'srv {} quit'.format( name ) ) def base_th_accept( sc, s ): + s = ','.join( s.split( ',' )[ : -2 ] ) if s not in reqs: return @@ -116,11 +126,11 @@ pipe_loop( sc, sc2 ) -def base_th_connect( port, sc, s ): +def base_th_connect( sc, s ): name = s q = srvs.get( name ) id = sc.fileno() - s = 'port={},srv={},id={}'.format( port, name, id ) + s = 'srv={},id={}'.format( name, id ) ev = thr.event_new() reqs[ s ] = [ sc, ev ] q.put( s ) @@ -157,18 +167,18 @@ send_str( sc, 'next' ) elif s in srvs: - base_th_connect( port, sc, s ) + base_th_connect( sc, s ) sc.close() -def ping_th( port ): +def ping_th(): id = 'ping' for ( name, q ) in srvs.items(): - s = 'port={},srv={},id={}'.format( port, name, id ) + s = 'srv={},id={}'.format( name, id ) q.put( s ) def base_srv( port ): - th_p = thr.loop_new( ping_th, ( port, ), wait_tmout=1.0 ) + th_p = thr.loop_new( ping_th, wait_tmout=1.0 ) thr.ths.start( th_p ) ss = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) @@ -185,12 +195,12 @@ th_p.quit_ev.set() dbg.out( 'base_srv quit' ) -def server( port, name ): - ss = port_conn( port ) +def server( port, name, host='localhost' ): + ss = port_conn( port, host ) if not ss: return None - s = 'srv=' + name + s = 'srv={},port={},host={}'.format( name, port, host ) if not send_str( ss, s ): ss.close() return None @@ -222,8 +232,8 @@ if not r: return None ( s, d ) = r - port = int( d.get( 'port' ) ) - cs = port_conn( port ) + ( port, host ) = get_port_host_from_dic( d ) + cs = port_conn( port, host ) if not send_str( cs, s ): cs.close() return None @@ -237,8 +247,8 @@ r = accept_recv( ss ) return accept_conn( r ) -def srv_loop( port, name, th_func ): - ss = server( port, name ) +def srv_loop( port, name, th_func, host='localhost' ): + ss = server( port, name, host ) if not ss: return while True: @@ -263,8 +273,8 @@ return empty.new( locals() ) -def connect( port, name ): - cs = port_conn( port ) +def connect( port, name, host='localhost' ): + cs = port_conn( port, host ) if not cs: return None @@ -278,8 +288,8 @@ return None return cs -def kill_srv( port, name ): - cs = port_conn( port ) +def kill_srv( port, name, host='loaclhost' ): + cs = port_conn( port, host ) if not cs: return s = 'kill=' + name @@ -287,8 +297,8 @@ send_str( cs, s ) cs.close() -def kill_base_srv( port ): - cs = port_conn( port ) +def kill_base_srv( port, host='loaclhost' ): + cs = port_conn( port, host ) if not cs: return dbg.out( 'kill_base_srv' ) @@ -296,20 +306,20 @@ r = recv_str( cs ) cs.close() - cs = port_conn( port ) # for accept loop + cs = port_conn( port, host ) # for accept loop if cs: cs.close() def help(): lst = [ '\\', - 'port base', - 'port srv upper', - 'port srv eval', - 'port cli upper word word word ...', - 'port cli eval word word word ...', - 'port kill_base', - 'port kill srv_name ( srv_name is upper, eval or ... )' + 'base [ port=13579 ]', + 'srv [ host=localhost ][ port=13579 ] upper', + 'srv [ host=localhost ][ port=13579 ] eval', + 'cli [ host=localhost ][ port=13579 ] upper word word word ...', + 'cli [ host=localhost ][ port=13579 ] eval word word word ...', + 'kill_base [ host=localhost ][ port=13579 ]', + 'kill [ host=localhost ][ port=13579 ] srv_name ( srv_name is upper, eval or ... )' ] dbg.help_exit( '\n'.join( lst ) ) @@ -324,7 +334,15 @@ help() return argv.pop( 0 ) - port = int( pop() ) + def popk( k, dv=None ): + for i in range( len( argv ) ): + if argv[ i ].startswith( k ): + return argv.pop( i )[ len( k ) : ] + return dv + + host = popk( 'host=', 'localhost' ) + port = int( popk( 'port=', '13579' ) ) + names = { 'upper': lambda s: s.upper(), 'eval': lambda s: str( eval( s ) ), @@ -338,11 +356,11 @@ if name in names: cb = names.get( name ) srv_func = srv_func_new( cb ) - srv_loop( port, name, srv_func.func ) + srv_loop( port, name, srv_func.func, host ) elif cmd == 'cli': name = pop() if name in names: - sc = connect( port, name ) + sc = connect( port, name, host ) if not sc: return while len( argv ) > 0: @@ -356,10 +374,10 @@ sc.close() elif cmd == 'kill': name = pop() - kill_srv( port, name ) + kill_srv( port, name, host ) elif cmd == 'kill_base': - kill_base_srv( port ) + kill_base_srv( port, host ) if __name__ == "__main__":