#socks5 #socks5-proxy #proxy #sock #async #networking #async-read

socks5-proto

SOCKS5协议的基本抽象和异步读写函数

3个不稳定版本

0.4.1 2024年4月10日
0.4.0 2023年7月10日
0.3.3 2023年1月29日
0.3.2 2022年7月30日
0.1.0 2022年5月1日

#2159 in 网络编程

Download history 328/week @ 2024-04-28 346/week @ 2024-05-05 138/week @ 2024-05-12 238/week @ 2024-05-19 133/week @ 2024-05-26 215/week @ 2024-06-02 178/week @ 2024-06-09 95/week @ 2024-06-16 131/week @ 2024-06-23 124/week @ 2024-06-30 400/week @ 2024-07-07 192/week @ 2024-07-14 157/week @ 2024-07-21 258/week @ 2024-07-28 408/week @ 2024-08-04 223/week @ 2024-08-11

1,065 个月下载量
5 crates 中使用

GPL-3.0或更高版

29KB
688

socks5-proto

本crate提供SOCKS5协议的基本抽象和异步读写函数。

Version Documentation License

查看socks5-server以获取一个精细粒度、相对低级的异步SOCKS5服务器库。

示例

use socks5_proto::{
    handshake::{
        Method as HandshakeMethod, Request as HandshakeRequest, Response as HandshakeResponse,
    },
    Address, Error, ProtocolError, Reply, Request, Response,
};
use tokio::{io::AsyncWriteExt, net::TcpListener};

#[tokio::main]
async fn main() -> Result<(), Error> {
    let listener = TcpListener::bind("127.0.0.1:5000").await?;
    let (mut stream, _) = listener.accept().await?;

    let hs_req = HandshakeRequest::read_from(&mut stream).await?;

    if hs_req.methods.contains(&HandshakeMethod::NONE) {
        let hs_resp = HandshakeResponse::new(HandshakeMethod::NONE);
        hs_resp.write_to(&mut stream).await?;
    } else {
        let hs_resp = HandshakeResponse::new(HandshakeMethod::UNACCEPTABLE);
        hs_resp.write_to(&mut stream).await?;
        let _ = stream.shutdown().await;
        return Err(Error::Protocol(
            ProtocolError::NoAcceptableHandshakeMethod {
                version: socks5_proto::SOCKS_VERSION,
                chosen_method: HandshakeMethod::NONE,
                methods: hs_req.methods,
            },
        ));
    }

    let req = match Request::read_from(&mut stream).await {
        Ok(req) => req,
        Err(err) => {
            let resp = Response::new(Reply::GeneralFailure, Address::unspecified());
            resp.write_to(&mut stream).await?;
            let _ = stream.shutdown().await;
            return Err(err);
        }
    };

    match req.command {
        _ => todo!(), // process request
    }
}

许可证

GNU通用公共许可证v3.0

依赖项

~2.4–4MB
~66K SLoC