5005.boost之asio简单反射型服务器客户端
参考boost库完全开发和网友代码,仅此记录方便后续查询
服务器端 tcp_server.cpp
/**************************************************************************************************
* 文件:tcp_server.cpp
* 功能:利用boost库实现异步asio 服务器
* 时间:2020/4/26
* 作者:xhome
**************************************************************************************************/
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>
#include <boost/asio/placeholders.hpp>
#include <boost/system/error_code.hpp>
#include <boost/bind/bind.hpp>
using namespace boost::asio;
using namespace std;
class TcpServer {
public:
typedef TcpServer this_type;
typedef ip::tcp::acceptor acceptor_type;
typedef ip::tcp::endpoint endpoint_type;
typedef ip::tcp::socket socket_type;
typedef ip::address address_type;
typedef boost::shared_ptr<socket_type> sock_ptr;
private:
io_service m_io;
acceptor_type m_acceptor;
public:
TcpServer():m_acceptor(m_io, endpoint_type(ip::tcp::v4(), 10001))
{
accept();
}
void run()
{
m_io.run();
}
void accept()
{
sock_ptr sock(new socket_type(m_io));
m_acceptor.async_accept(*sock, boost::bind(&this_type::accept_handler, this, boost::asio::placeholders::error, sock));
}
void accept_handler(const boost::system::error_code & ec, sock_ptr sock)
{
if(ec)
{
return;
}
cout << "Client:";
cout << sock->remote_endpoint().address() << endl;
sock->async_write_some(buffer("hello asio"), boost::bind(&this_type::write_handler, this, boost::asio::placeholders::error));
accept();
}
void write_handler(const boost::system::error_code & ec)
{
cout << "send msg complete." << endl;
}
};
int main()
{
try {
cout <<"Server start." << endl;
TcpServer srv;
srv.run();
} catch (std::exception &e) {
cout << e.what() << endl;
}
return 0;
}
客户端 tcp_client.cpp
/**************************************************************************************************
* 文件:tcp_server.cpp
* 功能:利用boost库实现异步asio客户端.
* 时间:2020/4/26
* 作者:xhome
**************************************************************************************************/
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>
#include <boost/asio/placeholders.hpp>
#include <boost/bind/bind.hpp>
using namespace boost::asio;
using namespace std;
class TcpClient {
public:
typedef TcpClient this_type;
typedef ip::tcp::acceptor acceptor_type;
typedef ip::tcp::endpoint endpoint_type;
typedef ip::address address_type;
typedef ip::tcp::socket socket_type;
typedef boost::shared_ptr<socket_type> sock_ptr;
typedef vector<char> buffer_type;
private:
io_service m_io;
buffer_type m_buf;
endpoint_type m_ep;
public:
TcpClient():m_buf(100, 0), m_ep(address_type::from_string("127.0.0.1"), 10001)
{
start();
}
void run()
{
m_io.run();
}
void start()
{
sock_ptr sock(new socket_type(m_io));
sock->async_connect(m_ep, boost::bind(&this_type::conn_handler, this, boost::asio::placeholders::error, sock));
}
void conn_handler(const boost::system::error_code & ec, sock_ptr sock)
{
if(ec)
{
return;
}
cout <<"Received from:" << sock->remote_endpoint().address() << " : " <<endl;
sock->async_read_some(buffer(m_buf), boost::bind(&this_type::read_handler, this, boost::asio::placeholders::error, sock));
}
void read_handler(const boost::system::error_code & ec, sock_ptr sock)
{
if(ec){
return;
}
sock->async_read_some(buffer(m_buf),boost::bind(&this_type::read_handler, this, boost::asio::placeholders::error, sock));
cout << &m_buf[0] << endl;
}
};
int main()
{
try{
cout <<"Client start." <<endl;
TcpClient client;
client.run();
} catch (std::exception & e) {
cout << e.what() << endl;
}
return 0;
}