Skip to content

Commit 6677d86

Browse files
committed
update examples
1 parent cb18ea0 commit 6677d86

File tree

3 files changed

+25
-31
lines changed

3 files changed

+25
-31
lines changed

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@ tokio = { version = "1", default-features = false, features = [
3333

3434
[dev-dependencies]
3535
clap = { version = "4", features = ["derive"] }
36-
ctrlc2 = { version = "3", features = ["tokio", "termination"] }
36+
ctrlc2 = { version = "3", features = ["async", "termination"] }
3737
dotenvy = "0.15"
3838
env_logger = "0.11"
3939
hickory-proto = "0.25"
4040
log = "0.4"
4141
moka = { version = "0.12", features = ["future"] }
4242
rand = "0.9"
4343
tokio = { version = "1", features = ["rt-multi-thread"] }
44+
tokio-util = { version = "0.7", features = [] }
4445

4546
[[example]]
4647
name = "demo-client"

examples/echo-server.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,12 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
7979
Ok::<(), std::io::Error>(())
8080
});
8181

82-
let (tx, mut rx) = tokio::sync::mpsc::channel::<()>(1);
83-
84-
ctrlc2::set_async_handler(async move {
85-
tx.send(()).await.unwrap();
82+
let ctrlc = ctrlc2::AsyncCtrlC::new(|| {
8683
log::info!("Ctrl-C received, shutting down...");
87-
})
88-
.await;
84+
true
85+
})?;
8986

90-
rx.recv().await.unwrap();
87+
ctrlc.await?;
9188
log::info!("Exiting...");
9289

9390
Ok(())

examples/s5-server.rs

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ use socks5_impl::{
55
};
66
use std::{
77
net::{SocketAddr, ToSocketAddrs},
8-
sync::{Arc, atomic::AtomicBool},
8+
sync::Arc,
99
};
1010
use tokio::{
1111
io,
1212
net::{TcpStream, UdpSocket},
1313
sync::Mutex,
1414
};
15+
use tokio_util::sync::CancellationToken;
1516

1617
/// Simple socks5 proxy server.
1718
#[derive(clap::Parser, Debug, Clone, PartialEq, Eq)]
@@ -55,52 +56,47 @@ async fn main() -> Result<()> {
5556
let default = format!("{}={:?}", module_path!(), opt.verbosity);
5657
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(default)).init();
5758

58-
let exiting_flag = Arc::new(AtomicBool::new(false));
59-
let exiting_flag_clone = exiting_flag.clone();
59+
let token = CancellationToken::new();
60+
let cloned_token = token.clone();
6061

61-
let local_addr = opt.listen_addr;
62-
63-
ctrlc2::set_async_handler(async move {
64-
exiting_flag_clone.store(true, std::sync::atomic::Ordering::Relaxed);
65-
66-
let addr = if local_addr.is_ipv6() {
67-
SocketAddr::from((std::net::Ipv6Addr::LOCALHOST, local_addr.port()))
68-
} else {
69-
SocketAddr::from((std::net::Ipv4Addr::LOCALHOST, local_addr.port()))
70-
};
71-
let _ = std::net::TcpStream::connect(addr);
62+
let ctrlc = ctrlc2::AsyncCtrlC::new(move || {
7263
log::info!("");
7364
log::info!("Ctrl-C received, shutting down...");
74-
})
75-
.await;
65+
cloned_token.cancel();
66+
true
67+
})?;
7668

7769
match (opt.username, opt.password) {
7870
(Some(username), password) => {
7971
let password = password.unwrap_or_default();
8072
let auth = Arc::new(auth::UserKeyAuth::new(&username, &password));
81-
main_loop(auth, opt.listen_addr, Some(exiting_flag)).await?;
73+
main_loop(auth, opt.listen_addr, token).await?;
8274
}
8375
_ => {
8476
let auth = Arc::new(auth::NoAuth);
85-
main_loop(auth, opt.listen_addr, Some(exiting_flag)).await?;
77+
main_loop(auth, opt.listen_addr, token).await?;
8678
}
8779
}
8880

81+
ctrlc.await?;
82+
8983
Ok(())
9084
}
9185

92-
async fn main_loop<S>(auth: auth::AuthAdaptor<S>, listen_addr: SocketAddr, exiting_flag: Option<Arc<AtomicBool>>) -> Result<()>
86+
async fn main_loop<S>(auth: auth::AuthAdaptor<S>, listen_addr: SocketAddr, token: CancellationToken) -> Result<()>
9387
where
9488
S: Send + Sync + 'static,
9589
{
9690
let server = Server::bind(listen_addr, auth).await?;
9791

98-
while let Ok((conn, _)) = server.accept().await {
99-
if let Some(exiting_flag) = &exiting_flag {
100-
if exiting_flag.load(std::sync::atomic::Ordering::Relaxed) {
92+
loop {
93+
let (conn, _) = tokio::select! {
94+
_ = token.cancelled() => {
95+
log::info!("CancellationToken fired, session will be closed");
10196
break;
10297
}
103-
}
98+
conn = server.accept() => conn?,
99+
};
104100
tokio::spawn(async move {
105101
if let Err(err) = handle(conn).await {
106102
log::error!("{err}");

0 commit comments

Comments
 (0)