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):
40 getopt.add_option('6', "ipv6", ipv6, GetOpt::NO_ARG);
41 getopt.add_option('l', "listen", listen, GetOpt::NO_ARG);
42 getopt.add_argument("host", host_name, GetOpt::REQUIRED_ARG);
45 RefPtr<Net::SockAddr> addr = Net::resolve(host_name, (ipv6 ? Net::INET6 : Net::INET));
48 sock = new Net::StreamSocket(addr->get_family());
50 event_disp.add(*sock);
51 sock->signal_data_available.connect(sigc::mem_fun(this, &NetCat::net_data_available));
55 server_sock = new Net::StreamServerSocket(addr->get_family());
56 server_sock->listen(*addr);
57 event_disp.add(*server_sock);
58 server_sock->signal_data_available.connect(sigc::mem_fun(this, &NetCat::net_data_available));
61 event_disp.add(IO::cin);
62 IO::cin.signal_data_available.connect(sigc::mem_fun(this, &NetCat::console_data_available));
68 if(server_sock && sock)
75 void NetCat::net_data_available()
79 sock = server_sock->accept();
80 event_disp.add(*sock);
81 sock->signal_data_available.connect(sigc::mem_fun(this, &NetCat::net_data_available));
86 unsigned len = sock->read(buf, sizeof(buf));
87 IO::cout.write(buf, len);
91 void NetCat::console_data_available()
94 unsigned len = IO::cin.read(buf, sizeof(buf));
96 sock->write(buf, len);