diff options
-rw-r--r-- | config.cpp | 1 | ||||
-rw-r--r-- | main.cpp | 2 | ||||
-rw-r--r-- | telnet_connection.cpp | 15 | ||||
-rw-r--r-- | telnet_connection.h | 26 | ||||
-rw-r--r-- | telnetd.cpp | 19 | ||||
-rw-r--r-- | telnetd.h | 19 |
6 files changed, 82 insertions, 0 deletions
@@ -11,6 +11,7 @@ void config::init() { desc.add_options() ("audist.music_root", po::value<std::string>(), "music root") ("audist.httpd_port", po::value<int>()->default_value(8000), "httpd port") + ("audist.telnetd_port", po::value<int>()->default_value(7681), "telnetd port") ("audist.threads", po::value<std::size_t>()->default_value(10), "threads") ("audist.database", po::value<std::string>(), "database string") ; @@ -3,6 +3,7 @@ #include "decoder.h" #include "encoder.h" #include "httpd.h" +#include "telnetd.h" #include <iostream> #include <vector> @@ -19,6 +20,7 @@ int main(int argc, char **argv) { boost::asio::io_service io_service; HTTP::Server httpd(io_service, tcp::endpoint(tcp::v6(), config::vm["audist.httpd_port"].as<int>())); + telnet::Server telnetd(io_service, tcp::endpoint(tcp::v6(), config::vm["audist.telnetd_port"].as<int>())); std::size_t num_threads = config::vm["audist.threads"].as<std::size_t>(); std::vector<boost::shared_ptr<boost::thread> > threads; diff --git a/telnet_connection.cpp b/telnet_connection.cpp new file mode 100644 index 0000000..e2ea96f --- /dev/null +++ b/telnet_connection.cpp @@ -0,0 +1,15 @@ +#include "telnet_connection.h" + +#include <boost/bind.hpp> + +telnet::Connection::Connection(boost::asio::io_service& io_service) : socket(io_service) { +} + +void telnet::Connection::handle_read(const boost::system::error_code& error, size_t bytes_transferred) { + boost::asio::write(socket, buf); +} + +void telnet::Connection::start() { + boost::asio::async_read_until(socket, buf, "\n", boost::bind(&Connection::handle_read, shared_from_this(), + boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); +} diff --git a/telnet_connection.h b/telnet_connection.h new file mode 100644 index 0000000..8ea3cad --- /dev/null +++ b/telnet_connection.h @@ -0,0 +1,26 @@ +#ifndef TELNET_CONNECTION_H +#define TELNET_CONNECTION_H + +#include <boost/asio.hpp> +#include <boost/enable_shared_from_this.hpp> + +using boost::asio::ip::tcp; + +namespace telnet { + class Connection : public boost::enable_shared_from_this<Connection> { + friend class Server; + + private: + Connection(boost::asio::io_service& io_service); + void handle_read(const boost::system::error_code& error, size_t bytes_transferred); + tcp::socket socket; + boost::asio::streambuf buf; + + public: + typedef boost::shared_ptr<Connection> p; + + void start(); + }; +}; + +#endif diff --git a/telnetd.cpp b/telnetd.cpp new file mode 100644 index 0000000..9999d50 --- /dev/null +++ b/telnetd.cpp @@ -0,0 +1,19 @@ +#include "telnetd.h" + +#include <boost/bind.hpp> + +telnet::Server::Server(boost::asio::io_service& io_service, const tcp::endpoint& endpoint) : acceptor_(io_service, endpoint) { + start_accept(); +} + +void telnet::Server::start_accept() { + Connection::p new_connection = Connection::p(new Connection(acceptor_.io_service())); + acceptor_.async_accept(new_connection->socket, boost::bind(&Server::handle_accept, this, new_connection, boost::asio::placeholders::error)); +} + +void telnet::Server::handle_accept(Connection::p new_connection, const boost::system::error_code& error) { + if(!error) { + new_connection->start(); + start_accept(); + } +} diff --git a/telnetd.h b/telnetd.h new file mode 100644 index 0000000..e6126f1 --- /dev/null +++ b/telnetd.h @@ -0,0 +1,19 @@ +#ifndef TELNETD_H +#define TELNETD_H + +#include "telnet_connection.h" + +namespace telnet { + class Server { + public: + Server(boost::asio::io_service& io_service, const tcp::endpoint& endpoint); + + private: + void start_accept(); + void handle_accept(Connection::p new_connection, const boost::system::error_code& error); + + tcp::acceptor acceptor_; + }; +}; + +#endif |