异步服务端 boost asio

// gogogo.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"


#ifdef WIN32
#define _WIN32_WINNT 0x0501
#include <stdio.h>
#endif






#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
using namespace boost::asio;
using namespace boost::posix_time;
io_service service;


#define MEM_FN(x)       boost::bind(&self_type::x, shared_from_this())
#define MEM_FN1(x,y)    boost::bind(&self_type::x, shared_from_this(),y)
#define MEM_FN2(x,y,z)  boost::bind(&self_type::x, shared_from_this(),y,z)




class talk_to_client : public boost::enable_shared_from_this<talk_to_client>, boost::noncopyable 
{
typedef talk_to_client self_type;
talk_to_client() : sock_(service), started_(false) {}
public:
typedef boost::system::error_code error_code;
typedef boost::shared_ptr<talk_to_client> ptr;


void start() 
{
started_ = true;
do_read();
}


static ptr new_() 
{
ptr new_(new talk_to_client);
return new_;
}


void stop()
{
if ( !started_) return;
started_ = false;
sock_.close();
}


ip::tcp::socket & sock() { return sock_;}
private:
void on_read(const error_code & err, size_t bytes) 
{
if ( !err) {
std::string msg(read_buffer_, bytes);
// echo message back, and then stop
do_write(msg + "\n");
}
stop();
}


void on_write(const error_code & err, size_t bytes) 
{
do_read();
}


void do_read() 
{
async_read(sock_, buffer(read_buffer_), 
MEM_FN2(read_complete,_1,_2), MEM_FN2(on_read,_1,_2));
}


void do_write(const std::string & msg)
{
std::copy(msg.begin(), msg.end(), write_buffer_);
sock_.async_write_some( buffer(write_buffer_, msg.size()), 
MEM_FN2(on_write,_1,_2));
}


size_t read_complete(const boost::system::error_code & err, size_t bytes)
{
if ( err) return 0;
bool found = std::find(read_buffer_, read_buffer_ + bytes, '\n') < read_buffer_ + bytes;
// we read one-by-one until we get to enter, no buffering
return found ? 0 : 1;
}


private:
ip::tcp::socket sock_;
enum { max_msg = 1024 };
char read_buffer_[max_msg];
char write_buffer_[max_msg];
bool started_;
};


ip::tcp::acceptor acceptor(service, ip::tcp::endpoint(ip::tcp::v4(), 8001));


void handle_accept(talk_to_client::ptr client, const boost::system::error_code & err) 
{
client->start();
talk_to_client::ptr new_client = talk_to_client::new_();
acceptor.async_accept(new_client->sock(), boost::bind(handle_accept,new_client,_1));
}






int _tmain(int argc, _TCHAR* argv[])
{
talk_to_client::ptr client = talk_to_client::new_();
acceptor.async_accept(client->sock(), boost::bind(handle_accept,client,_1));
service.run();


return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金士顿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值