rust-tcp-echo/src/main.rs

135 lines
4.6 KiB
Rust
Raw Normal View History

2023-09-11 15:09:03 +03:00
use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};
use std::env;
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");
socket.write(b"Hello").unwrap();
let mut data = [0 as u8; 1024];
match socket.read(&mut data)
{
Ok(_) =>
{
println!("{}", from_utf8(&data).unwrap());
}
Err(e) =>
{
println!("Failed to receive data: {}", e);
return false;
}
}
}
Err(e) =>
{
println!("Failed to connect: {}", e);
return false;
}
}
return true;
}
fn s_connect() -> bool
{
let socket = TcpListener::bind("localhost:2121");
for stream in socket.expect("Panic").incoming()
{
match stream
{
Ok(mut stream) =>
{
let mut data = [0 as u8; 1024];
match stream.read(&mut data)
{
Ok(a) =>
{
if a == 0
{
println!("Connection Closed");
return false;
}
println!("{}", stream.write(&data).unwrap());
}
Err(e) =>
{
println!("Failed to Read: {}", e);
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!();
}
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()
}
}