rust-tcp-echo/src/main.rs

162 lines
6 KiB
Rust
Raw Normal View History

2023-09-11 15:09:03 +03:00
use std::net::{TcpListener, TcpStream};
2023-09-13 03:51:33 +03:00
use std::io::{Read, Write, self};
use std::{env, thread};
2023-09-12 03:06:32 +03:00
use std::str::from_utf8;
2023-09-11 15:09:03 +03:00
enum EnvArg
{
Client,
Server,
}
2023-09-12 03:06:32 +03:00
impl EnvArg
{
fn c_connect() -> bool
{
match TcpStream::connect("localhost:2121")
{
Ok(mut socket) =>
{
println!("Connected");
2023-09-13 03:51:33 +03:00
let socket_clone = socket.try_clone().expect("Cloning Failed");
thread::spawn(move || {Self::c_send(&socket_clone)});
let stay = true;
while stay
2023-09-12 03:06:32 +03:00
{
2023-09-13 03:51:33 +03:00
let mut data = [0 as u8; 1024];
match socket.read(&mut data)
2023-09-12 03:06:32 +03:00
{
2023-09-13 03:51:33 +03:00
Ok(_) =>
{
if data[0] != 0
{
println!("{}", from_utf8(&data).unwrap());
}
}
Err(e) =>
{
println!("Failed to receive data: {}", e);
return false;
}
2023-09-12 03:06:32 +03:00
}
}
}
Err(e) =>
{
println!("Failed to connect: {}", e);
return false;
}
}
return true;
}
2023-09-13 03:51:33 +03:00
fn c_send(mut socket:&TcpStream)
{
let stay = true;
while stay
{
socket.write(take_string().as_bytes()).unwrap();
}
}
2023-09-12 03:06:32 +03:00
fn s_connect() -> bool
{
let socket = TcpListener::bind("localhost:2121");
for stream in socket.expect("Panic").incoming()
{
match stream
{
Ok(mut stream) =>
{
2023-09-13 03:51:33 +03:00
let stay = true;
while stay
2023-09-12 03:06:32 +03:00
{
2023-09-13 03:51:33 +03:00
let mut data = [0 as u8; 1024];
match stream.read(&mut data)
2023-09-12 03:06:32 +03:00
{
2023-09-13 03:51:33 +03:00
Ok(a) =>
2023-09-12 03:06:32 +03:00
{
2023-09-13 03:51:33 +03:00
if a == 0
{
println!("Connection Closed");
return false;
}
println!("{}", stream.write(&data).unwrap());
}
Err(e) =>
{
println!("Failed to Read: {}", e);
2023-09-12 03:06:32 +03:00
return false;
}
}
}
}
Err(e) =>
{
println!("Something Happened: {}", e);
}
}
}
return true;
}
}
2023-09-11 15:09:03 +03:00
fn take_arg() -> EnvArg
{
let args:Vec<String> = env::args().collect();
match args.len()
{
1 => println!("Give an argument"),
2 =>
{
if args[1] == "c"
{
return EnvArg::Client;
}
else if args[1] == "s"
{
return EnvArg::Server;
}
else
{
println!("Give valid argument, c or s");
}
},
_ => println!("Only one argument is allowed"),
}
panic!();
}
2023-09-13 03:51:33 +03:00
fn take_string() -> String
{
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to Read from Console");
input
}
2023-09-11 15:09:03 +03:00
fn client()
{
println!("Client");
2023-09-12 03:06:32 +03:00
if EnvArg::c_connect() != true
{
panic!();
}
2023-09-11 15:09:03 +03:00
}
fn server()
{
println!("Server");
2023-09-12 03:06:32 +03:00
if EnvArg::s_connect() != true
{
panic!();
}
2023-09-11 15:09:03 +03:00
}
fn main()
{
println!("Hello, world!");
match take_arg()
{
EnvArg::Client => client(),
EnvArg::Server => server()
}
}