diff -ur v2/sock_ut.py v3/sock_ut.py --- v2/sock_ut.py 2021-06-10 21:09:48.000000000 +0900 +++ v3/sock_ut.py 2021-06-24 21:26:04.000000000 +0900 @@ -9,6 +9,8 @@ import thr import dbg +can_read = lambda sc, tmout=0: select.select( [ sc ], [], [], tmout )[ 0 ] == [ sc ] + def port_conn( port, host='localhost' ): cs = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) try: @@ -29,6 +31,15 @@ bt = sc.recv( bufmax ) return bt +def recv_bt_all( sc ): + buf = b'' + while not buf or can_read( sc ): + bt = recv_bt( sc ) + if not bt: + break + buf += bt + return buf + def send_str( sc, s ): bt = s.encode( 'utf-8' ) return send_bt( sc, bt ) @@ -73,11 +84,15 @@ q = thr.que_new() srvs[ name ] = q + dbg.out( 'srv {} start'.format( name ) ) while True: s = q.get() if not send_str( sc, s ): break + srvs.pop( name ) + dbg.out( 'srv {} quit'.format( name ) ) + def base_th_accept( sc, s ): if s not in reqs: return @@ -131,7 +146,16 @@ sc.close() +def ping_th( port ): + id = 'ping' + for ( name, q ) in srvs.items(): + s = 'port={},srv={},id={}'.format( port, name, id ) + q.put( s ) + def base_srv( port ): + th_p = thr.loop_new( ping_th, ( port, ), wait_tmout=1.0 ) + thr.ths.start( th_p ) + ss = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) ss.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) ss.bind( ( '', port ) ) @@ -143,6 +167,7 @@ th = thr.th_new( base_th, ( port, cs, ev_quit ) ) thr.ths.start( th ) + th_p.quit_ev.set() dbg.out( 'base_srv quit' ) def server( port, name ): @@ -156,7 +181,7 @@ return None return ss -def accept( ss ): +def accept_inner( ss ): s = recv_str( ss ) if not s: return None @@ -165,6 +190,9 @@ if not is_accept_dic( d ): return None + if d.get( 'id' ) == 'ping': + return 'ping' + port = int( d.get( 'port' ) ) cs = port_conn( port ) if not send_str( cs, s ): @@ -176,6 +204,15 @@ return None return cs +def accept( ss ): + cs = None + while True: + cs = accept_inner( ss ) + if cs != 'ping': + break + #dbg.out( 'accept ping' ) + return cs + def srv_loop( port, name, th_func ): ss = server( port, name ) if not ss: