Solstice client.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

85 lines
2.1 KiB

mod server;
mod proto;
mod config;
#[macro_use] extern crate log;
extern crate mio;
extern crate byteorder;
extern crate crypto;
use std::io;
use std::net::ToSocketAddrs;
use mio::{EventLoop, EventSet, Handler, PollOpt, Token};
use mio::tcp::TcpStream;
use proto::Connection;
use server::ServerConnection;
const SERVER_TOKEN: Token = Token(0);
#[derive(Debug)]
struct ConnectionHandler {
server_conn: Connection<ServerConnection>,
server_stream: TcpStream,
}
impl ConnectionHandler {
fn new(server_conn: Connection<ServerConnection>, server_stream: TcpStream)
-> Self {
ConnectionHandler{
server_conn: server_conn,
server_stream: server_stream,
}
}
}
impl Handler for ConnectionHandler {
type Timeout = ();
type Message = ();
fn ready(&mut self, event_loop: &mut EventLoop<Self>,
token: Token, event_set: EventSet) {
match token {
SERVER_TOKEN =>
if event_set.is_readable() {
self.server_conn.ready_to_read(&mut self.server_stream)
} else {
self.server_conn.ready_to_write(&mut self.server_stream)
},
_ => unreachable!("Unknown token"),
}
}
}
fn connect(hostname: &str, port: u16) -> io::Result<TcpStream> {
for sock_addr in try!((hostname, port).to_socket_addrs()) {
if let Ok(stream) = TcpStream::connect(&sock_addr) {
return Ok(stream)
}
}
Err(io::Error::new(io::ErrorKind::Other,
format!("Cannot connect to {}:{}", hostname, port)))
}
fn main() {
let host = config::SERVER_HOST;
let port = config::SERVER_PORT;
let stream = connect(host, port).unwrap();
println!("Connected to {}:{}", host, port);
let mut event_loop = EventLoop::new().unwrap();
event_loop.register(
&stream,
SERVER_TOKEN,
EventSet::readable() | EventSet::writable(),
PollOpt::edge()).unwrap();
let server_conn = Connection::new(ServerConnection::new());
let mut handler = ConnectionHandler::new(server_conn, stream);
event_loop.run(&mut handler).unwrap();
}