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...

技術博客 http://blog.csdn.net/stecdeng 技術交流羣 羣號碼:324164944 歡迎c c++ windows驅動愛好者 服務器程序員溝通交流
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章