本篇是模仿PYTHON TWISTED寫一個FINGER示例。
從最簡單的鏈接到通過接收字符串返回不同的內容
1 最簡單的鏈接
1 #include <ctime> 2 #include <iostream> 3 #include <string> 4 #include <boost/bind.hpp> 5 #include <boost/shared_ptr.hpp> 6 #include <boost/enable_shared_from_this.hpp> 7 #include <boost/asio.hpp> 8 9 10 using boost::asio::ip::tcp; 11 12 13 int main() 14 { 15 try{ 16 boost::asio::io_service io_service; 17 io_service.run(); 18 } 19 catch (std::exception& e) { 20 std::cerr << e.what() << std::endl; 21 } 22 23 std::cout << "finished!" << std::endl; 24 return 0; 25 }
運行顯示如下
finished!
請按任意鍵繼續. . .
2 接收ACCEPT請求 然後丟棄
#include <ctime> #include <iostream> #include <string> #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/asio.hpp> using boost::asio::ip::tcp; static USHORT defaultPort = 1123; class tcp_server { public: tcp_server(boost::asio::io_service& io_service) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), defaultPort)) { start_accept(); } private: void start_accept() { boost::shared_ptr<tcp::socket> new_connection(new tcp::socket(io_service_)); acceptor_.async_accept(*new_connection,boost::bind(&tcp_server::handle_accept,this, new_connection,boost::asio::placeholders::error)); } void handle_accept(boost::shared_ptr<tcp::socket> new_connection, const boost::system::error_code error) { if (!error) { std::cout << "recv a connection!" << std::endl; new_connection->shutdown(boost::asio::socket_base::shutdown_type::shutdown_both); } start_accept(); } boost::asio::io_service& io_service_; tcp::acceptor acceptor_; }; int main() { try { boost::asio::io_service io_service; tcp_server server(io_service); io_service.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } std::cout << "finished!" << std::endl; return 0; }
運行顯示如下:
recv a connection!
客戶端運行 顯示
telnet 127.0.0.1 1123
3 接收連接發送過來的內容 顯示 然後關閉
#include <ctime> #include <iostream> #include <string> #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/asio.hpp> using boost::asio::ip::tcp; static USHORT defaultPort = 1123; class tcp_connection :public boost::enable_shared_from_this<tcp_connection> { public: typedef boost::shared_ptr<tcp_connection> pointer; static pointer create(boost::asio::io_service& io_service) { return pointer(new tcp_connection(io_service)); } tcp::socket& socket() { return socket_; } void start() { boost::asio::async_read_until(socket_, input_buffer_, '\n', boost::bind(&tcp_connection::handle_read, shared_from_this(), _1)); } private: void handle_read(const boost::system::error_code& err) { if (!err) { std::string line; std::istream is(&input_buffer_); std::getline(is,line); if (!line.empty()) { std::cout << "Received: " << line << "\n"; } socket_.shutdown(boost::asio::socket_base::shutdown_both); } } tcp_connection(boost::asio::io_service& io_service) :socket_(io_service) {} boost::asio::streambuf input_buffer_; tcp::socket socket_; std::string message_; }; class tcp_server { public: tcp_server(boost::asio::io_service& io_service) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), defaultPort)) { start_accept(); } private: void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error)); std::cout << "new a connection" << std::endl; } void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error) { if (!error) { new_connection->start(); } start_accept(); } boost::asio::io_service& io_service_; tcp::acceptor acceptor_; }; int main() { try { boost::asio::io_service io_service; tcp_server server(io_service); io_service.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } std::cout << "finished!" << std::endl; return 0; }
運行並TELNET連接後顯示如下
new a connection
new a connection
Received: sadasd
4 接收連接發送內容 並返回指定內容
#include <ctime> #include <iostream> #include <string> #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/asio.hpp> using boost::asio::ip::tcp; static USHORT defaultPort = 1123; class tcp_connection :public boost::enable_shared_from_this<tcp_connection> { public: typedef boost::shared_ptr<tcp_connection> pointer; static pointer create(boost::asio::io_service& io_service) { return pointer(new tcp_connection(io_service)); } tcp::socket& socket() { return socket_; } void start() { boost::asio::async_read_until(socket_, input_buffer_, '\n', boost::bind(&tcp_connection::handle_read, shared_from_this(), _1)); } private: void handle_read(const boost::system::error_code& err) { if (!err) { std::string line; std::istream is(&input_buffer_); std::getline(is, line); if (!line.empty()) { std::cout << line << "\n"; } boost::asio::async_write(socket_, boost::asio::buffer("no this user", strlen("no this user")+1), boost::bind(&tcp_connection::handle_write, shared_from_this(), boost::asio::placeholders::error)); } } void handle_write(const boost::system::error_code& error) { if (!error) { socket_.shutdown(boost::asio::socket_base::shutdown_both); } } tcp_connection(boost::asio::io_service& io_service) :socket_(io_service) {} boost::asio::streambuf input_buffer_; tcp::socket socket_; std::string message_; }; class tcp_server { public: tcp_server(boost::asio::io_service& io_service) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), defaultPort)) { start_accept(); } private: void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error)); std::cout << "new a connection" << std::endl; } void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error) { if (!error) { new_connection->start(); } start_accept(); } boost::asio::io_service& io_service_; tcp::acceptor acceptor_; }; int main() { try { boost::asio::io_service io_service; tcp_server server(io_service); io_service.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } std::cout << "finished!" << std::endl; return 0; }
運行後顯示如下
new a connection
new a connection
asdas
telnet客戶端顯示
no this user
遺失對主機的連接。
5 接收發送的內容 並在記錄中查找是否有該內容的記錄
#include <ctime> #include <iostream> #include <string> #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/asio.hpp> #include <map> using boost::asio::ip::tcp; static USHORT defaultPort = 1123; typedef std::map<std::string, std::string> UserMap; UserMap users; class tcp_connection :public boost::enable_shared_from_this<tcp_connection> { public: typedef boost::shared_ptr<tcp_connection> pointer; static pointer create(boost::asio::io_service& io_service) { return pointer(new tcp_connection(io_service)); } tcp::socket& socket() { return socket_; } void start() { boost::asio::async_read_until(socket_, input_buffer_, '\n', boost::bind(&tcp_connection::handle_read, shared_from_this(), _1)); } private: void handle_read(const boost::system::error_code& err) { if (!err) { std::istream is(&input_buffer_); is >> line_; if (!line_.empty()) { std::cout << line_ << "\n"; UserMap::iterator it = users.find(line_); if (it != users.end()) { line_ = it->second; } else { line_ = "no this user"; } } else { line_ = "string error!"; } boost::asio::async_write(socket_, boost::asio::buffer(line_, line_.size()), boost::bind(&tcp_connection::handle_write, shared_from_this(), boost::asio::placeholders::error)); } } void handle_write(const boost::system::error_code& error) { if (!error) { socket_.shutdown(boost::asio::socket_base::shutdown_both); } } tcp_connection(boost::asio::io_service& io_service) :socket_(io_service) {} std::string line_; boost::asio::streambuf input_buffer_; tcp::socket socket_; std::string message_; }; class tcp_server { public: tcp_server(boost::asio::io_service& io_service) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), defaultPort)) { start_accept(); } private: void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error)); std::cout << "new a connection" << std::endl; } void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error) { if (!error) { new_connection->start(); } start_accept(); } boost::asio::io_service& io_service_; tcp::acceptor acceptor_; }; int main() { try { users["DEF"] = "PASS"; boost::asio::io_service io_service; tcp_server server(io_service); io_service.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } std::cout << "finished!" << std::endl; return 0; }
運行後顯示如下
new a connection
new a connection
dda
new a connection
DEF
telnet客戶端顯示
PASS
遺失對主機的連接。
以上代碼所有連接 均以telnet作爲客戶端
telnet 127.0.0.1 1123
正在連接127.0.0.1...