use fmt; use net; use net::tcp; use net::ip; use io; use os; use unix::poll; use bufio; def PORT: u16 = 41460; type conn = net::socket; export fn main() void = { const listener = tcp::listen(ip::ANY_V4, PORT)!; const conn = tcp::accept(listener)!; const pr = packet_reader_new(); for :mainloop (true) { if (packet_reader_read(&pr, conn)! is io::EOF) fmt::fatal("disconnected"); let i = 0; for (const packet => packet_reader_next(&pr)) { fmt::printf("#{} got {}:",i,len(packet))!; i+=1; for (let byte .. packet) fmt::printf(" {:x}",byte)!; fmt::println("")!; }; }; }; // fn loop(listener: net::socket) void = { // const buf: [256]u8 = [0...]; // let pollfds: []poll::pollfd = alloc([ poll::pollfd { // fd = listener, events = poll::event::POLLIN, revents = 0 // }]); // for (true) { // poll::poll(pollfds, poll::INDEF)!; // if (0 != pollfds[0].revents & poll::event::POLLIN) { // fmt::println("new conn")!; // append(pollfds, poll::pollfd { // fd = tcp::accept(pollfds[0].fd)!, // events = poll::event::POLLIN, revents = 0 // }); // }; // for (let i = 1z; i < len(pollfds); i += 1) { // if (0 != pollfds[i].revents & poll::event::POLLIN) { // match (io::read(pollfds[i].fd, buf)!) { // case io::EOF => // fmt::println("disconnect", i)!; // delete(pollfds[i]); // i -= 1; // case let n: size => // io::write(os::stdout_file, buf[..n])!; // for (let j = 1z; j < len(pollfds); j += 1) { // if (i != j) { // io::writeall(pollfds[j].fd, buf[..n])!; // }; // }; // }; // }; // }; // }; // };