extern crate asyncio;
extern crate time;
use std::io;
use asyncio::*;
use asyncio::ip::*;
use asyncio::socket_base::*;
struct DaytimeTcp {
soc: TcpSocket,
buf: String,
}
impl DaytimeTcp {
fn start(ctx: &IoContext, soc: TcpSocket) {
let daytime = IoContext::strand(ctx, DaytimeTcp {
soc: soc,
buf: format!("{}\r\n", time::now().ctime())
});
daytime.dispatch(Self::on_start);
}
fn on_start(daytime: Strand<Self>) {
daytime.soc.async_write_some(daytime.buf.as_bytes(), daytime.wrap(Self::on_send));
}
fn on_send(_: Strand<Self>, _: io::Result<usize>) {
}
}
fn on_start(sv: Strand<TcpListener>) {
sv.set_option(ReuseAddr::new(true)).unwrap();
sv.bind(&TcpEndpoint::new(IpAddrV4::any(), 13)).unwrap();
sv.listen().unwrap();
sv.async_accept(sv.wrap(on_accept));
}
fn on_accept(sv: Strand<TcpListener>, res: io::Result<(TcpSocket, TcpEndpoint)>) {
if let Ok((soc, ep)) = res {
println!("connected from {:?}", ep);
DaytimeTcp::start(sv.as_ctx(), soc);
sv.async_accept(sv.wrap(on_accept));
}
}
fn main() {
let ctx = &IoContext::new().unwrap();
let sv = IoContext::strand(ctx, TcpListener::new(ctx, Tcp::v4()).unwrap());
sv.dispatch(on_start);
ctx.run();
}