main.rs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. extern crate mio;
  2. #[macro_use]
  3. extern crate log;
  4. use std::io::Write;
  5. //use std::net::SocketAddr;
  6. use mio::*;
  7. use mio::tcp::TcpListener;
  8. use log::*;
  9. const LISTENADDR : &'static str = "127.0.0.1:13265";
  10. struct StderrLogger;
  11. impl StderrLogger {
  12. fn init() -> Result<(), SetLoggerError> {
  13. log::set_logger(|max_log_level| {
  14. max_log_level.set(LogLevelFilter::Info);
  15. Box::new(StderrLogger)
  16. })
  17. }
  18. }
  19. impl log::Log for StderrLogger {
  20. fn enabled(&self, metadata: &LogMetadata) -> bool {
  21. metadata.level() <= LogLevel::Info
  22. }
  23. fn log(&self, record: &LogRecord) {
  24. if self.enabled(record.metadata()) {
  25. writeln!(&mut std::io::stderr(), "{} {}", record.level(), record.args()).
  26. expect("Can't log.")
  27. }
  28. }
  29. }
  30. fn malformed_packet(err: std::io::Error) {
  31. info!("Somebody sent an invalid tcp packet: {}", err.to_string());
  32. }
  33. fn handle(mut stream: tcp::TcpStream) {
  34. let _ = stream.write(&"go fuck you kthxbye".as_bytes());
  35. let _ = stream.local_addr()
  36. .map(|addr|
  37. info!("somebody opened a tcp connection to {}:{}", addr.ip(), addr.port()))
  38. .map_err(malformed_packet);
  39. }
  40. fn main() {
  41. StderrLogger::init().expect("can't set up logger.");
  42. info!("Starting up!");
  43. // Setup some tokens to allow us to identify which event is
  44. // for which socket.
  45. const SERVER: Token = Token(0);
  46. // Setup the server socket
  47. let addr = LISTENADDR.parse().unwrap();
  48. let server = TcpListener::bind(&addr)
  49. .expect(&format!("Can't bind to address {}", LISTENADDR));
  50. // Create an poll instance
  51. let poll = Poll::new().unwrap();
  52. // Start listening for incoming connections
  53. poll.register(&server, SERVER, Ready::all(), PollOpt::edge())
  54. .expect("Cannot register server");
  55. // Create storage for events
  56. let mut events = Events::with_capacity(1024);
  57. loop {
  58. poll.poll(&mut events, None).unwrap();
  59. for event in events.iter() {
  60. match (event.token(), event.kind().is_readable()) {
  61. (SERVER, true) => {
  62. let (stream, _) = server.accept().unwrap();
  63. handle(stream);
  64. }
  65. _ => {
  66. info!("something happened: {:?}", event.kind());
  67. // unreachable!(),
  68. }
  69. }
  70. }
  71. }
  72. }