Skip to content
Snippets Groups Projects
Commit 3b22204f authored by Covertness's avatar Covertness
Browse files

update mio

parent f1cf9064
No related branches found
No related tags found
No related merge requests found
......@@ -12,7 +12,8 @@ keywords = ["CoAP"]
[dependencies]
bincode = "0.3.0"
rustc-serialize = "0.3"
mio = "0.3.7"
bytes = "0.2.11"
mio = "0.4"
threadpool = "0.1"
url = "0.2.36"
num = "0.1"
......
......@@ -66,6 +66,7 @@
extern crate bincode;
extern crate rustc_serialize;
extern crate bytes;
extern crate mio;
extern crate threadpool;
extern crate url;
......
......@@ -7,6 +7,7 @@ use mio::udp::UdpSocket;
use packet::Packet;
use client::CoAPClient;
use threadpool::ThreadPool;
use bytes::RingBuf;
const DEFAULT_WORKER_NUM: usize = 4;
......@@ -27,20 +28,35 @@ impl<F> CoAPHandler for F where F: Fn(Packet, CoAPClient), F: Sync + Send + Copy
}
}
struct UdpHandler<H: CoAPHandler + 'static>(UdpSocket, ThreadPool, H);
struct UdpHandler<H: CoAPHandler + 'static> {
socket: UdpSocket,
thread_pool: ThreadPool,
coap_handler: H
}
impl<H: CoAPHandler + 'static> UdpHandler<H> {
fn new(socket: UdpSocket, thread_pool: ThreadPool, coap_handler: H) -> UdpHandler<H> {
UdpHandler {
socket: socket,
thread_pool: thread_pool,
coap_handler: coap_handler
}
}
}
impl<H: CoAPHandler + 'static> Handler for UdpHandler<H> {
type Timeout = ();
type Timeout = usize;
type Message = ();
fn readable(&mut self, _: &mut EventLoop<UdpHandler<H>>, _: Token, _: ReadHint) {
let UdpHandler(ref mut socket, ref thread_pool, coap_handler) = *self;
let mut buf = [0; 1500];
fn ready(&mut self, _: &mut EventLoop<UdpHandler<H>>, _: Token, events: EventSet) {
if events.is_readable() {
let coap_handler = self.coap_handler;
let mut buf = RingBuf::new(1500);
match socket.recv_from(&mut buf) {
Ok((nread, src)) => {
thread_pool.execute(move || {
match Packet::from_bytes(&buf[..nread]) {
match self.socket.recv_from(&mut buf) {
Ok(Some(src)) => {
self.thread_pool.execute(move || {
match Packet::from_bytes(buf.bytes()) {
Ok(packet) => {
let client = CoAPClient::new(src).unwrap();
coap_handler.handle(packet, client);
......@@ -49,7 +65,8 @@ impl<H: CoAPHandler + 'static> Handler for UdpHandler<H> {
};
});
},
Err(_) => panic!("unexpected error"),
_ => panic!("unexpected error"),
}
}
}
......@@ -68,12 +85,19 @@ pub struct CoAPServer {
impl CoAPServer {
/// Creates a CoAP server listening on the given address.
pub fn new<A: ToSocketAddrs>(addr: A) -> std::io::Result<CoAPServer> {
UdpSocket::bind(addr).and_then(|s| Ok(CoAPServer {
addr.to_socket_addrs().and_then(|mut iter| {
match iter.next() {
Some(ad) => {
UdpSocket::bound(&ad).and_then(|s| Ok(CoAPServer {
socket: s,
event_sender: None,
event_thread: None,
worker_num: DEFAULT_WORKER_NUM,
}))
},
None => Err(std::io::Error::new(std::io::ErrorKind::Other, "no address"))
}
})
}
/// Starts handling requests with the handler.
......@@ -92,7 +116,7 @@ impl CoAPServer {
tx.send(event_loop.channel()).unwrap();
event_loop.run(&mut UdpHandler(socket, thread_pool, handler)).unwrap();
event_loop.run(&mut UdpHandler::new(socket, thread_pool, handler)).unwrap();
});
match rx.recv() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment