#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;
}