--- /dev/null
+use std::env;
+use std::io::{Read, Write};
+use std::net::{Ipv6Addr, Shutdown, TcpListener, TcpStream};
+use std::time::Duration;
+
+extern crate getopts;
+use getopts::Options;
+
+fn handle_client(mut stream: TcpStream) {
+ println!("Connection from {:?}", stream.peer_addr().unwrap());
+ stream
+ .set_read_timeout(Some(Duration::from_secs(5)))
+ .expect("set_read_timeout failed");
+ let mut buffer = [0; 128];
+ match stream.read(&mut buffer) {
+ Ok(l) => {
+ let request = String::from_utf8_lossy(&buffer[..l]);
+ let name = request.trim_end();
+ println!("Got {l:?} bytes request: \"{}\"", name);
+ stream
+ .write("Got this request\r\n".as_bytes())
+ .expect("Write failed");
+ stream.write(request.as_bytes()).expect("Write data failed");
+ }
+ Err(e) => {
+ println!("Read error: {e:?}");
+ }
+ }
+ stream.shutdown(Shutdown::Both).expect("Shutdown failed");
+ println!("Finished processing client");
+}
+
+fn main() -> std::io::Result<()> {
+ let args: Vec<String> = env::args().collect();
+ let progname = args[0].clone();
+ let mut opts = Options::new();
+ opts.optopt("p", "port", "set port to listen", "79");
+ opts.optflag("h", "help", "print this help menu");
+ let mo = match opts.parse(&args[1..]) {
+ Ok(m) => m,
+ Err(e) => {
+ panic!("{}", e.to_string())
+ }
+ };
+ if mo.opt_present("h") {
+ println!("{}: there is no help!", progname);
+ return Ok(());
+ }
+ let p = match mo.opt_get_default::<u16>("p", 79) {
+ Ok(p) => p,
+ Err(e) => {
+ panic!("Bad option for port {:?}", e)
+ }
+ };
+ println!("Binding to port {:?}", p);
+ let listener = TcpListener::bind((Ipv6Addr::UNSPECIFIED, p))
+ .expect("Could not bind to finger port");
+ for stream in listener.incoming() {
+ match stream {
+ Ok(stream) => {
+ handle_client(stream);
+ }
+ Err(e) => {
+ println!("Unaccepted {e:?}");
+ }
+ }
+ }
+ Ok(())
+}