main.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. match stream.local_addr() {
  36. Ok(addr) =>
  37. info!("somebody opened a tcp connection to {}:{}", addr.ip(), addr.port()),
  38. Err(err) => malformed_packet(err),
  39. }
  40. }
  41. fn main() {
  42. StderrLogger::init().expect("can't set up logger.");
  43. info!("Starting up!");
  44. // Setup some tokens to allow us to identify which event is
  45. // for which socket.
  46. const SERVER: Token = Token(0);
  47. // Setup the server socket
  48. let addr = LISTENADDR.parse().unwrap();
  49. let server = TcpListener::bind(&addr)
  50. .expect(&format!("Can't bind to address {}", LISTENADDR));
  51. // Create an poll instance
  52. let poll = Poll::new().unwrap();
  53. // Start listening for incoming connections
  54. poll.register(&server, SERVER, Ready::all(), PollOpt::edge())
  55. .expect("Cannot register server");
  56. // Create storage for events
  57. let mut events = Events::with_capacity(1024);
  58. loop {
  59. poll.poll(&mut events, None).unwrap();
  60. for event in events.iter() {
  61. match (event.token(), event.kind().is_readable()) {
  62. (SERVER, true) => {
  63. match server.accept() {
  64. Err(err) => malformed_packet(err),
  65. Ok((stream, _)) => handle(stream),
  66. }
  67. },
  68. _ => {
  69. info!("something happened: {:?}", event.kind());
  70. // unreachable!(),
  71. }
  72. }
  73. }
  74. }
  75. }