inn_network/
lib.rs

1//-------------------------------------------------------------------
2// MIT License
3// Copyright (c) 2022 black-mongo
4// @author CameronYang
5// @doc
6//
7// @end
8// Created : 2022-04-14T11:20:34+08:00
9//-------------------------------------------------------------------
10pub 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}