boost 编写finger服务
本篇是模仿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...
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力