diff --git a/easytier/src/common/global_ctx.rs b/easytier/src/common/global_ctx.rs index 6e7f8c3..086046f 100644 --- a/easytier/src/common/global_ctx.rs +++ b/easytier/src/common/global_ctx.rs @@ -29,6 +29,7 @@ pub enum GlobalCtxEvent { ListenerAdded(url::Url), ListenerAddFailed(url::Url, String), // (url, error message) + ListenerAcceptFailed(url::Url, String), // (url, error message) ConnectionAccepted(String, String), // (local url, remote url) ConnectionError(String, String, String), // (local url, remote url, error message) diff --git a/easytier/src/easytier-core.rs b/easytier/src/easytier-core.rs index 5fc091e..46808dc 100644 --- a/easytier/src/easytier-core.rs +++ b/easytier/src/easytier-core.rs @@ -183,7 +183,7 @@ and the vpn client is in network of 10.14.14.0/24" #[arg( long, - help = "path to the log file, if not set, will print to stdout", + help = "latency first mode, will try to relay traffic with lowest latency path, default is using shortest path", default_value = "false" )] latency_first: bool, @@ -528,6 +528,13 @@ pub async fn async_main(cli: Cli) { )); } + GlobalCtxEvent::ListenerAcceptFailed(p, msg) => { + print_event(format!( + "listener accept failed. listener: {}, msg: {}", + p, msg + )); + } + GlobalCtxEvent::ListenerAdded(p) => { if p.scheme() == "ring" { continue; diff --git a/easytier/src/instance/listeners.rs b/easytier/src/instance/listeners.rs index 7cb4e3a..be0a8f4 100644 --- a/easytier/src/instance/listeners.rs +++ b/easytier/src/instance/listeners.rs @@ -143,7 +143,20 @@ impl ListenerManage let mut l = listener.lock().await; global_ctx.add_running_listener(l.local_url()); global_ctx.issue_event(GlobalCtxEvent::ListenerAdded(l.local_url())); - while let Ok(ret) = l.accept().await { + loop { + let ret = match l.accept().await { + Ok(ret) => ret, + Err(e) => { + global_ctx.issue_event(GlobalCtxEvent::ListenerAcceptFailed( + l.local_url(), + e.to_string(), + )); + tracing::error!(?e, ?l, "listener accept error"); + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + continue; + } + }; + let tunnel_info = ret.info().unwrap(); global_ctx.issue_event(GlobalCtxEvent::ConnectionAccepted( tunnel_info.local_addr.clone(), @@ -164,7 +177,6 @@ impl ListenerManage } }); } - tracing::warn!("listener exit"); } pub async fn run(&mut self) -> Result<(), Error> {