sujiacong / libsocks_client

SOCKS client rust implementation
MIT License
0 stars 0 forks source link

SOCKS Client Library

This Rust library provides a SOCKS client implementation supporting SOCKS4, SOCKS4a, and SOCKS5 protocols. It allows users to connect, bind, and associate UDP through a SOCKS proxy.

Features

Installation

Add the following to your Cargo.toml file:

[dependencies]
libsocks_client = "0.1.2"

Usage

Creating a SOCKS Client

You can create a SOCKS client using the SocksClientBuilder. Here’s an example of creating a SOCKS5 client:

use libsocks_client::SocksClientBuilder;

#[tokio::main]
async fn main() {
    let mut client = SocksClientBuilder::new("127.0.0.1", 1080)
        .socks5()
        .username("user")
        .password("pass")
        .build_tcp_client();

    let mut stream = client.connect("220.181.38.150", 80).await.unwrap();
    // Use the stream to send and receive data
}

Connecting to a Target Address

To connect to a target address through the SOCKS proxy use local dns lookup:

    const HTTP_REQUEST: &str = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n";
    let mut stream = client.connect("www.baidu.com", 80).await?;
    stream.write_all(&HTTP_REQUEST.as_bytes()).await?;
    let mut buf = vec![0; 1024];
    let mut response_buffer = vec![];
    loop {
        let n = stream.read(&mut buf).await?;
        if n == 0 {
            break;
        }
        response_buffer.extend(&buf[..n]);
    }
    println!("Response: {}", String::from_utf8_lossy(&response_buffer));

To connect to a target domain through the SOCKS proxy use remote dns lookup:

    const HTTP_REQUEST: &str = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n";
    let mut stream = client.connect_hostname("www.baidu.com", 80).await?;
    stream.write_all(&HTTP_REQUEST.as_bytes()).await?;
    let mut buf = vec![0; 1024];
    let mut response_buffer = vec![];
    loop {
        let n = stream.read(&mut buf).await?;
        if n == 0 {
            break;
        }
        response_buffer.extend(&buf[..n]);
    }
    println!("Response: {}", String::from_utf8_lossy(&response_buffer));

Binding to a Target Address

To bind to a target address through the SOCKS proxy:

client.bind("0.0.0.0", 80).await.unwrap();
let addr = client.get_proxy_bind_addr().unwrap();
//notify server to connect to this addr
//...
//accept server connection
let mut stream = client.accept().await.unwrap();

Associating a UDP Socket

To associate a UDP socket through the SOCKS proxy:

client.udp_associate("0.0.0.0", 0).await.unwrap();
let udp = client.get_udp_socket("0.0.0.0:0").await.unwrap();
udp.send_udp_data(b"Hello", "example.com:80").await.unwrap();
let (addr, data) = udp.recv_udp_data(5).await.unwrap();

Examples

The library includes several examples in the tests module of the lib.rs file. You can run these tests to see the library in action:

cargo test

Contributing

Contributions are welcome! Please feel free to submit a pull request or open an issue if you encounter any problems or have suggestions for improvements.

License

This project is licensed under the MIT License. See the LICENSE file for more details.