socks5-impl 0.3.3

Fundamental abstractions and async read / write functions for SOCKS5 protocol and Relatively low-level asynchronized SOCKS5 server implementation based on tokio
Documentation
use socks5_impl::{client::UdpClientImpl, protocol::UserKey, Result};
use std::time::Duration;

/// Udp client through socks5 proxy.
#[derive(clap::Parser, Debug, Clone, PartialEq, Eq)]
#[command(author, version, about = "Udp client through socks5 proxy", long_about = None)]
pub struct CmdOpt {
    /// Socket5 proxy server address.
    #[clap(short, long, value_name = "addr:port")]
    proxy_addr: String,

    /// Udp target server address.
    #[clap(short, long, value_name = "addr:port")]
    target_addr: String,

    /// Data string to send.
    #[clap(short, long, value_name = "data")]
    data: String,

    /// User name for authentication.
    #[clap(short, long, value_name = "user name")]
    username: Option<String>,

    /// Password for authentication.
    #[clap(short = 'w', long, value_name = "password")]
    password: Option<String>,

    /// Timeout in seconds.
    #[clap(long, value_name = "seconds", default_value = "2")]
    timeout: u64,
}

#[tokio::main]
async fn main() -> Result<()> {
    let opt: CmdOpt = clap::Parser::parse();
    let user_key = match (opt.username, opt.password) {
        (Some(username), Some(password)) => Some(UserKey::new(username, password)),
        _ => None,
    };
    let timeout = Duration::from_secs(opt.timeout);
    let data = UdpClientImpl::datagram(&opt.proxy_addr, &opt.target_addr, user_key)
        .await?
        .transfer_data(opt.data.as_bytes(), timeout)
        .await?;
    println!("{}", std::str::from_utf8(data.as_slice())?);
    Ok(())
}