extern crate env_logger;
extern crate futures;
extern crate tokio_core;
extern crate trust_dns;
extern crate tokio_socks5;
use std::env;
use std::net::SocketAddr;
use std::str;
use futures::future;
use futures::{Future, Stream};
use tokio_core::net::TcpListener;
use tokio_core::reactor::Core;
use trust_dns::client::ClientFuture;
use trust_dns::udp::UdpClientStream;
use tokio_socks5::Client;
fn main() {
drop(env_logger::init());
let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string());
let addr = addr.parse::<SocketAddr>().unwrap();
let mut lp = Core::new().unwrap();
let handle = lp.handle();
let listener = TcpListener::bind(&addr, &handle).unwrap();
let dns = "8.8.8.8:53".parse().unwrap();
let (stream, sender) = UdpClientStream::new(dns, handle.clone());
let client = ClientFuture::new(stream, sender, handle.clone(), None);
println!("Listening for socks5 proxy connections on {}", addr);
let clients = listener.incoming().map(move |(socket, addr)| {
(Client {
dns: client.clone(),
handle: handle.clone(),
}.serve(socket), addr)
});
let handle = lp.handle();
let server = clients.for_each(|(client, addr)| {
handle.spawn(client.then(move |res| {
match res {
Ok((a, b)) => {
println!("proxied {}/{} bytes for {}", a, b, addr)
}
Err(e) => println!("error for {}: {}", addr, e),
}
future::ok(())
}));
Ok(())
});
lp.run(server).unwrap();
}