ombrac_client/endpoint/socks/
mod.rs

1mod v5;
2
3use std::error::Error;
4use std::net::SocketAddr;
5use std::sync::Arc;
6
7use ombrac::request::Address;
8use ombrac::Provider;
9use ombrac_macros::{info, try_or_return};
10use tokio::io::{AsyncRead, AsyncWrite};
11use tokio::net::{TcpListener, TcpStream};
12
13use crate::Client;
14
15pub struct Server {}
16
17pub enum Request {
18    TcpConnect(TcpStream, Address),
19}
20
21impl Server {
22    pub async fn listen<T, S>(addr: SocketAddr, ombrac: Client<T>) -> Result<(), Box<dyn Error>>
23    where
24        T: Provider<Item = S> + Send + Sync + 'static,
25        S: AsyncRead + AsyncWrite + Unpin + Send + Sync + 'static,
26    {
27        use ombrac::io::util::copy_bidirectional;
28
29        let ombrac = Arc::new(ombrac);
30        let listener = TcpListener::bind(addr).await?;
31
32        while let Ok((stream, _addr)) = listener.accept().await {
33            let ombrac = ombrac.clone();
34
35            tokio::spawn(async move {
36                let request = try_or_return!(Self::handler_v5(stream).await);
37
38                match request {
39                    Request::TcpConnect(mut inbound, address) => {
40                        let mut outbound =
41                            try_or_return!(ombrac.tcp_connect(address.clone()).await);
42
43                        let bytes =
44                            try_or_return!(copy_bidirectional(&mut inbound, &mut outbound).await);
45
46                        info!(
47                            "TcpConnect {:?} send {}, receive {}",
48                            address, bytes.0, bytes.1
49                        );
50                    }
51                };
52            });
53        }
54
55        Ok(())
56    }
57}