zoukankan      html  css  js  c++  java
  • C++03:使用Boost-用Asio实现简易Echo Server

    C++03:使用Boost-用Asio实现简易Echo Server

    C++03:使用Boost-用Asio实现简易Echo Server

    一、编写代码

    注:以下代码取自boost 1.40的示例代码:

    //
    // async_tcp_echo_server.cpp
    // ~~~~~~~~~~~~~~~~~~~~~~~~~
    //
    // Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
    //
    // Distributed under the Boost Software License, Version 1.0. (See accompanying
    // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
    //
    #include <cstdlib>
    #include <iostream>
    #include <boost/bind.hpp>
    #include <boost/asio.hpp>
    
    using boost::asio::ip::tcp;
    
    class session {
    public:
        session(boost::asio::io_service& io_service) :
            socket_(io_service) {
        }
    
        tcp::socket& socket() {
            return socket_;
        }
    
        void start() {
            socket_.async_read_some(boost::asio::buffer(data_, max_length),
                    boost::bind(&session::handle_read, this,
                            boost::asio::placeholders::error,
                            boost::asio::placeholders::bytes_transferred));
        }
    
        void handle_read(const boost::system::error_code& error,
                size_t bytes_transferred) {
            if (!error) {
                boost::asio::async_write(socket_, boost::asio::buffer(data_,
                        bytes_transferred), boost::bind(&session::handle_write,
                        this, boost::asio::placeholders::error));
            } else {
                delete this;
            }
        }
    
        void handle_write(const boost::system::error_code& error) {
            if (!error) {
                socket_.async_read_some(boost::asio::buffer(data_, max_length),
                        boost::bind(&session::handle_read, this,
                                boost::asio::placeholders::error,
                                boost::asio::placeholders::bytes_transferred));
            } else {
                delete this;
            }
        }
    
    private:
        tcp::socket socket_;
        enum {
            max_length = 1024
        };
        char data_[max_length];
    };
    
    class server {
    public:
        server(boost::asio::io_service& io_service, short port) :
            io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(),
                    port)) {
            session* new_session = new session(io_service_);
            acceptor_.async_accept(new_session->socket(), boost::bind(
                    &server::handle_accept, this, new_session,
                    boost::asio::placeholders::error));
        }
    
        void handle_accept(session* new_session,
                const boost::system::error_code& error) {
            if (!error) {
                new_session->start();
                new_session = new session(io_service_);
                acceptor_.async_accept(new_session->socket(), boost::bind(
                        &server::handle_accept, this, new_session,
                        boost::asio::placeholders::error));
            } else {
                delete new_session;
            }
        }
    
    private:
        boost::asio::io_service& io_service_;
        tcp::acceptor acceptor_;
    };
    
    int main(int argc, char* argv[]) {
        try {
            if (argc != 2) {
                std::cerr << "Usage: async_tcp_echo_server <port>\n";
                return 1;
            }
    
            boost::asio::io_service io_service;
    
            using namespace std;
            // For atoi.
            server s(io_service, atoi(argv[1]));
    
            io_service.run();
        } catch (std::exception& e) {
            std::cerr << "Exception: " << e.what() << "\n";
        }
    
        return 0;
    }

    二、编译代码

    $ g++ -g3 -Wall -o"async_tcp_echo_server" async_tcp_echo_server.cpp -lboost_system

    注意:boost.asio库依赖boost_system

    三、运行 async_tcp_echo_server

    $ ./async_tcp_echo_server 8868   # 8868 是async_tcp_echo_server listen的端口号

    四、用 telnet 命令作为客户端测试

    新开启一个终端,注意:同样要登录到Linux实验室,执行: telnet localhost 8868

    $ telnet localhost 8868
    Trying ::1...
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    the first line    # 这是我们的输入
    the first line    # 这是服务器 async_tcp_echo_server 的回应,以下类推
    the second line
    the second line
    welcome to xuanyuan-soft.org.cn!
    welcome to xuanyuan-soft.org.cn!

    五、关于Boost更多的信息

    请访问Boost的主页:http://www.boost.org/

  • 相关阅读:
    华为EC169在MAC 10.9.6下的安装方法
    sqlmap用户手册 | WooYun知识库
    光纤光猫连接自己路由器的设定
    C# 里窗体里(windows form)怎么播放音乐
    让我们写的程序生成单个的exe文件(C#winform程序举例)
    Basic EEG waves 四种常见EEG波形
    Hemodynamic response function (HRF)
    Parseval's theorem 帕塞瓦尔定理
    Typical EEG waveforms during sleep 睡眠状态下的几种典型EEG波形
    EEG preprocessing
  • 原文地址:https://www.cnblogs.com/lexus/p/2565900.html
Copyright © 2011-2022 走看看