ombrac_client/endpoint/socks/
mod.rs1mod 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}