fix multi client

This commit is contained in:
2026-04-10 20:11:55 +08:00
parent 0a4f6338a6
commit d9461d1ef0
6 changed files with 179 additions and 62 deletions
+16 -11
View File
@@ -16,6 +16,7 @@ use std::fs;
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
use tokio::task::JoinSet;
use tokio::time::sleep;
#[tokio::main]
@@ -39,7 +40,7 @@ async fn main() -> anyhow::Result<()> {
let routers = Arc::new(build_routers());
let http_server = Arc::new(Server::new(routers.clone()));
let mut tasks = vec![];
let mut join_set = JoinSet::new();
for server_conf in &CONFIG.connect.server {
let server_conf = server_conf.clone().into_tunnel_config(Identity::Server)?;
@@ -47,7 +48,7 @@ async fn main() -> anyhow::Result<()> {
let server = TunnelListener::bind(server_conf).await?;
info!("tcp server started on {}", url);
let http_server = http_server.clone();
tasks.push(tokio::task::spawn(async move {
join_set.spawn(async move {
loop {
let endpoint = server
.accept()
@@ -59,20 +60,23 @@ async fn main() -> anyhow::Result<()> {
continue;
};
if let TunnelEndpoint::Server(connection) = endpoint {
let result = http_server.on_conn(connection).await;
if let Err(e) = result {
error!("Failed to handle connection: {}", e);
}
let http_server = http_server.clone();
tokio::task::spawn(async move {
let result = http_server.on_conn(connection).await;
if let Err(e) = result {
error!("Failed to handle connection: {}", e);
}
});
}
}
}));
});
}
for client_conf in &CONFIG.connect.client {
let client_conf = client_conf.clone().into_tunnel_config(Identity::Server);
let http_server = http_server.clone();
info!("tcp client started for {}", client_conf.url);
tasks.push(tokio::task::spawn(async move {
join_set.spawn(async move {
loop {
let endpoint = connect_tunnel(client_conf.clone())
.await
@@ -90,11 +94,12 @@ async fn main() -> anyhow::Result<()> {
}
sleep(Duration::from_secs(10)).await;
}
}));
});
}
for task in tasks {
let _ = task.await.map_err(|e| error!("{}", e));
while let Some(res) = join_set.join_next().await {
let Err(e) = res;
error!("{}", e);
}
Ok(())