boost::asio学习笔记 server端

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <iostream>
using boost::asio::ip::tcp;
#define max_len  256
class Session
 :public boost::enable_shared_from_this<Session>
{
public:
 Session(boost::asio::io_service& ioservice)
  :socket_(ioservice)
 {
  data_ =new char[max_len];
  memset(data_,0x00,max_len);
  bytes_transferred_ = 0;
  senddata_=new char[max_len];
  memset(senddata_,0x00,max_len);

 }
 ~Session()
 {
  delete data_;
  data_ = NULL;
  delete senddata_;
  senddata_ = NULL;
 }
 tcp::socket& socket()
 {
  return socket_;
 }
 void begin()
 {
  boost::asio::async_write(socket_,
   boost::asio::buffer(senddata_,max_len),
   boost::bind(&Session::handle_write,shared_from_this(),
   boost::asio::placeholders::error));


  socket_.async_read_some(boost::asio::buffer(data_,max_len),
   boost::bind(&Session::handle_read,shared_from_this(),
   boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));
 }
private:
 void handle_write(const boost::system::error_code& error)
 {

  if(error)
  {
   socket_.close();
  }

 }
 void handle_read(const boost::system::error_code& error,std::size_t bytes_transferred)
 {

  if(!error)
  {
   bytes_transferred_+=bytes_transferred;
   //数据包定长256
   //保证接受数据完整
   //bytes_transferred 实际收到的数据;
   if(max_len == bytes_transferred_)
   {
    //接收后逻辑处理这里只是输出显示一下
    std::cout << data_ << std::endl;
    bytes_transferred_ =0;
    memset(data_,0x00,255);
   }
   else
   {
    socket_.async_read_some(boost::asio::buffer(data_+bytes_transferred_,max_len-bytes_transferred_),
     boost::bind(&Session::handle_read,shared_from_this(),
     boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));
   }
  }
  else
  {
   socket_.close();
  }

 }
private:
 tcp::socket socket_;
 char *data_;
 char *senddata_;
 int bytes_transferred_;
};


class serverApp
{
 typedef boost::shared_ptr<Session> session_ptr;
public:
 serverApp(boost::asio::io_service& ioservice,tcp::endpoint& endpoint)
  :ioservice_(ioservice),
  acceptor_(ioservice,endpoint)
 {
  session_ptr new_session(new Session(ioservice));
  acceptor_.async_accept(new_session->socket(),
   boost::bind(&serverApp::handle_accept,this,boost::asio::placeholders::error,
   new_session));
 }
 ~serverApp()
 {
 }
private:
 void handle_accept(const boost::system::error_code& error,session_ptr& session)
 {
  if(!error)
  {
   std::cout << "get a new client!" << std::endl;
   //实现对每个客户端的数据处理

   session->begin();
   //在这就应该看出为什么要封session类了吧,每一个session就是一个客户端

   session_ptr new_session(new Session(ioservice_));
   acceptor_.async_accept(new_session->socket(),
    boost::bind(&serverApp::handle_accept,this,boost::asio::placeholders::error,
    new_session));
  }
 }
private:
 boost::asio::io_service& ioservice_;
 tcp::acceptor acceptor_;
};

int main(int argc , char* argv[])
{
 boost::asio::io_service myIoService;
 short port = 8100/*argv[1]*/;
 //我们用的是inet4

 tcp::endpoint endPoint(tcp::v4(),port);
 //终端(可以看作sockaddr_in)完成后,就要accept了

 serverApp sa(myIoService,endPoint);
 //数据收发逻辑

 myIoService.run();
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值