@@ -118,7 +118,7 @@ use std::task::{Context, Poll};
118118
119119use async_trait:: async_trait;
120120use futures:: future:: Future ;
121- use log:: error;
121+ use log:: { debug , error} ;
122122use russh_keys:: key;
123123use tokio:: io:: { AsyncRead , AsyncWrite , AsyncWriteExt } ;
124124use tokio:: net:: { TcpListener , ToSocketAddrs } ;
@@ -619,6 +619,8 @@ pub trait Server {
619619 type Handler : Handler + Send ;
620620 /// Called when a new client connects.
621621 fn new_client ( & mut self , peer_addr : Option < std:: net:: SocketAddr > ) -> Self :: Handler ;
622+ /// Called when an active connection fails.
623+ fn handle_session_error ( & mut self , _error : <Self :: Handler as Handler >:: Error ) { }
622624}
623625
624626/// Run a server.
@@ -636,11 +638,44 @@ pub async fn run<H: Server + Send + 'static, A: ToSocketAddrs>(
636638 config. maximum_packet_size
637639 ) ;
638640 }
639- while let Ok ( ( socket, _) ) = socket. accept ( ) . await {
640- let config = config. clone ( ) ;
641- let server = server. new_client ( socket. peer_addr ( ) . ok ( ) ) ;
642- tokio:: spawn ( run_stream ( config, socket, server) ) ;
641+
642+ let ( error_tx, mut error_rx) = tokio:: sync:: mpsc:: unbounded_channel ( ) ;
643+
644+ loop {
645+ tokio:: select! {
646+ accept_result = socket. accept( ) => {
647+ match accept_result {
648+ Ok ( ( socket, _) ) => {
649+ let config = config. clone( ) ;
650+ let handler = server. new_client( socket. peer_addr( ) . ok( ) ) ;
651+ let error_tx = error_tx. clone( ) ;
652+ tokio:: spawn( async move {
653+ let session = match run_stream( config, socket, handler) . await {
654+ Ok ( s) => s,
655+ Err ( e) => {
656+ debug!( "Connection setup failed" ) ;
657+ let _ = error_tx. send( e) ;
658+ return
659+ }
660+ } ;
661+ match session. await {
662+ Ok ( _) => debug!( "Connection closed" ) ,
663+ Err ( e) => {
664+ debug!( "Connection closed with error" ) ;
665+ let _ = error_tx. send( e) ;
666+ }
667+ }
668+ } ) ;
669+ }
670+ _ => break ,
671+ }
672+ } ,
673+ Some ( error) = error_rx. recv( ) => {
674+ server. handle_session_error( error) ;
675+ }
676+ }
643677 }
678+
644679 Ok ( ( ) )
645680}
646681
0 commit comments