ソケットの待ち受け時に別の処理を実行する
私はソケットを用いてシンプルなサーバーとクライアントを作成しました。
use std::env;
#[macro_use]
extern crate log;
mod client;
mod server;
fn main() {
env::set_var("RUST_LOG", "debug");
env_logger::init();
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
error!("Please specify [server|client] [addr:port].");
std::process::exit(1);
}
let role: &str = &args[1];
let address = &args[2];
match role {
"server" => {
server::serve(address).unwrap_or_else(|e| error!("{}", e));
}
"client" => {
client::connect(address).unwrap_or_else(|e| error!("{}", e));
}
_ => {
missing_role();
}
}
}
fn missing_role() {
error!("Please specify server or client on the 1st argument.");
std::process::exit(1);
}
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
use std::{str, thread};
pub fn serve(address: &str) -> Result<(), failure::Error> {
let listener = TcpListener::bind(address)?;
loop {
let (stream, _) = listener.accept()?;
thread::spawn(move || {
handler(stream).unwrap_or_else(|error| error!("{:?}", error));
});
}
}
fn handler(mut stream: TcpStream) -> Result<(), failure::Error> {
debug!("Handling data from {}", stream.peer_addr()?);
let mut buffer = [0u8; 1024];
loop {
let nbytes = stream.read(&mut buffer)?;
if nbytes == 0 {
debug!("Connection closed.");
return Ok(());
}
print!("{}", str::from_utf8(&buffer[..nbytes])?);
stream.write_all(&buffer[..nbytes])?;
}
}
use std::io::{self, Write};
use std::net::TcpStream;
use std::str;
pub fn connect(address: &str) -> Result<(), failure::Error> {
let mut stream = TcpStream::connect(address)?;
loop {
let mut input = String::new();
io::stdin().read_line(&mut input)?;
stream.write_all(input.as_bytes())?;
}
}
私はmain.rs
でserverのソケット待ち受け時に別の処理を実行したいと考えています。
しかし、以下のように書いてもserver::serve(address).unwrap_or_else(|e| error!("{}", e));
以降は実行されません。
use std::env;
#[macro_use]
extern crate log;
mod client;
mod server;
fn main() {
env::set_var("RUST_LOG", "debug");
env_logger::init();
let args: Vec<String> = env::args().collect();
if args.len() != 3 {
error!("Please specify [server|client] [addr:port].");
std::process::exit(1);
}
let role: &str = &args[1];
let address = &args[2];
match role {
"server" => {
server::serve(address).unwrap_or_else(|e| error!("{}", e));
println!("hogehoge");
}
"client" => {
client::connect(address).unwrap_or_else(|e| error!("{}", e));
}
_ => {
missing_role();
}
}
}
fn missing_role() {
error!("Please specify server or client on the 1st argument.");
std::process::exit(1);
}
これは、ソケットの待ち受け状態に入っていて、関数が終了していないためだと考えています。
どうすれば、ソケットの待ち受け時に別の処理を実行できるでしょうか?