handle buffer correctly
This commit is contained in:
36
src/main.rs
36
src/main.rs
@ -1,5 +1,5 @@
|
|||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use std::io;
|
use std::io::{self, Read, Write};
|
||||||
use std::net::{TcpStream, ToSocketAddrs, UdpSocket};
|
use std::net::{TcpStream, ToSocketAddrs, UdpSocket};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
@ -99,12 +99,42 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
|
|
||||||
let stdin_thread = thread::spawn(move || {
|
let stdin_thread = thread::spawn(move || {
|
||||||
let mut stdin = io::stdin();
|
let mut stdin = io::stdin();
|
||||||
io::copy(&mut stdin, &mut stream_clone).ok();
|
let mut buffer = [0u8; 1024]; // 1KB buffer
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match stdin.read(&mut buffer) {
|
||||||
|
Ok(0) => break, // EOF
|
||||||
|
Ok(n) => {
|
||||||
|
if stream_clone.write_all(&buffer[..n]).is_err() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if stream_clone.flush().is_err() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => break,
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let stdout_thread = thread::spawn(move || {
|
let stdout_thread = thread::spawn(move || {
|
||||||
let mut stdout = io::stdout();
|
let mut stdout = io::stdout();
|
||||||
io::copy(&mut stream, &mut stdout).ok();
|
let mut buffer = [0u8; 1024]; // 1KB buffer
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match stream.read(&mut buffer) {
|
||||||
|
Ok(0) => break, // EOF
|
||||||
|
Ok(n) => {
|
||||||
|
if stdout.write_all(&buffer[..n]).is_err() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if stdout.flush().is_err() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => break,
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
stdin_thread.join().unwrap();
|
stdin_thread.join().unwrap();
|
||||||
|
Reference in New Issue
Block a user