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()
|
|
|
|
}
|
|
|
|
}
|