zoukankan      html  css  js  c++  java
  • 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_, '
    ',
                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 << "
    ";
                }
                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_, '
    ',
                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 << "
    ";
                }
                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_, '
    ',
                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_ << "
    ";
                    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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    自动释放池
    图片裁剪成圆形(无边框)
    根据数字对应星期几
    IOS 周几转化数字
    计算两个日期之间的天数
    java——IO流整理(一)
    java——File类的用法整理
    java——用递归和IO流来实现文件的复制
    java——java集合详解
    java——对象的克隆
  • 原文地址:https://www.cnblogs.com/itdef/p/6506553.html
Copyright © 2011-2022 走看看