[Boost.asio] 使用Boost-用Asio实现简易EchoServer

From: http://groups.tianya.cn/post-93740-30b0482930042c3cacaa96ec2698f53d-1.shtml

使用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/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值