1pub mod codec;
11pub mod messages;
12pub mod server;
13pub mod session;
14pub use messages::*;
15use server::ProxyServer;
16pub use session::*;
17pub mod proxy;
18pub mod ws;
19use crate::codec::{VisitorCodec, T};
20use actix::prelude::StreamHandler;
21use actix::{Actor, Addr};
22use actix_rt::net::TcpListener;
23use std::net::SocketAddr;
24use std::str::FromStr;
25use tokio::io::split;
26use tokio::task::JoinHandle;
27use tokio_util::codec::FramedRead;
28
29pub struct NetWork;
30use log::info;
31#[allow(clippy::unused_unit)]
32impl NetWork {
33 pub fn start<F>(
34 &self,
35 ip: &str,
36 port: usize,
37 listen_success: F,
38 server: Addr<ProxyServer>,
39 ) -> JoinHandle<()>
40 where
41 F: FnOnce() -> () + 'static,
42 {
43 let ip = format!("{}:{}", ip, port);
44 let addr = SocketAddr::from_str(&ip).unwrap();
45 actix::spawn(async move {
46 let listener = TcpListener::bind(&addr).await.unwrap();
47 listen_success();
48 info!("Sock5 proxy server, Listening on socks5://{}", ip);
49 while let Ok((stream, socket_addr)) = listener.accept().await {
50 info!(
51 "New Client comming: ip={}, port={}",
52 socket_addr.ip(),
53 socket_addr.port()
54 );
55 VisitorSession::create(|ctx| {
56 let server = server.clone();
57 let (r, w) = split(stream);
58 VisitorSession::add_stream(FramedRead::new(r, VisitorCodec::default()), ctx);
59 VisitorSession::new(
60 0,
61 server.recipient(),
62 codec::DstAddress {
63 t: T::IPv4,
64 addr: socket_addr.ip().to_string(),
65 port: socket_addr.port(),
66 },
67 actix::io::FramedWrite::new(w, VisitorCodec::default(), ctx),
68 )
69 });
70 }
71 })
72 }
73}