1 #include <msp/core/application.h>
2 #include <msp/core/getopt.h>
3 #include <msp/core/refptr.h>
4 #include <msp/io/console.h>
5 #include <msp/io/eventdispatcher.h>
6 #include <msp/net/streamserversocket.h>
7 #include <msp/net/streamsocket.h>
8 #include <msp/net/resolve.h>
13 class NetCat: public RegisteredApplication<NetCat>
18 Net::StreamServerSocket *server_sock;
19 Net::StreamSocket *sock;
20 IO::EventDispatcher event_disp;
27 void net_data_available();
28 void console_data_available();
31 NetCat::NetCat(int argc, char **argv):
38 getopt.add_option('6', "ipv6", ipv6, GetOpt::NO_ARG);
39 getopt.add_option('l', "listen", listen, GetOpt::NO_ARG);
42 const vector<string> &args = getopt.get_args();
44 throw usage_error("host argument missing");
46 RefPtr<Net::SockAddr> addr = Net::resolve(args.front(), (ipv6 ? Net::INET6 : Net::INET));
49 sock = new Net::StreamSocket(addr->get_family());
51 event_disp.add(*sock);
52 sock->signal_data_available.connect(sigc::mem_fun(this, &NetCat::net_data_available));
56 server_sock = new Net::StreamServerSocket(addr->get_family());
57 server_sock->listen(*addr);
58 event_disp.add(*server_sock);
59 server_sock->signal_data_available.connect(sigc::mem_fun(this, &NetCat::net_data_available));
62 event_disp.add(IO::cin);
63 IO::cin.signal_data_available.connect(sigc::mem_fun(this, &NetCat::console_data_available));
69 if(server_sock && sock)
76 void NetCat::net_data_available()
80 sock = server_sock->accept();
81 event_disp.add(*sock);
82 sock->signal_data_available.connect(sigc::mem_fun(this, &NetCat::net_data_available));
87 unsigned len = sock->read(buf, sizeof(buf));
88 IO::cout.write(buf, len);
92 void NetCat::console_data_available()
95 unsigned len = IO::cin.read(buf, sizeof(buf));
97 sock->write(buf, len);