参考资料:https://blog.csdn.net/caoshangpa/article/details/79231740
一个基础的同步客户端
//使用asio的所有程序都需要至少有一个io_context对象。此类提供对I/O功能的访问
using boost::asio;
io_service service;
ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 2001);
ip::tcp::socket sock(service);
sock.connect(ep);
一个简单的同步服务端
using boost::asio;
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr;
io_service service;
//指定监听的端口
ip::tcp::endpoint ep( ip::tcp::v4(), 2001));
//创建一个接收器,接受客户端的连接的对象
ip::tcp::acceptor acc(service, ep);
while ( true) {
//新建一个虚拟的socket
socket_ptr sock(new ip::tcp::socket(service));
//等待连接
acc.accept(*sock);
//连接后开启线程client_session处理事件
boost::thread( boost::bind(client_session, sock));
}
void client_session(socket_ptr sock) {
while ( true) {
char data[512];
size_t len = sock->read_some(buffer(data));
if ( len > 0)
write(*sock, buffer("ok", 2));
}
}
创建一个异步客户端
using boost::asio;
io_service service;
ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 2001);
ip::tcp::socket sock(service);
sock.async_connect(ep, connect_handler);//异步连接
service.run();//只要还有待处理的异步操作,servece.run()循环就会一直运行。操作完成后回调 connect_handler。
void connect_handler(const boost::system::error_code & ec) {
// 如果ec表示“成功”我们就可以知道连接成功了
}
一个简单的异步服务器
using boost::asio;
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr;
io_service service;
ip::tcp::endpoint ep( ip::tcp::v4(), 2001)); // 监听端口2001
ip::tcp::acceptor acc(service, ep);
socket_ptr sock(new ip::tcp::socket(service));
start_accept(sock);
service.run();
void start_accept(socket_ptr sock) {
acc.async_accept(*sock, boost::bind( handle_accept, sock, _1) );
}
void handle_accept(socket_ptr sock, const boost::system::error_code &err) {
if (err) return;
// 从这里开始, 你可以从socket读取或者写入
socket_ptr sock(new ip::tcp::socket(service));
start_accept(sock);
}
,运行异步service.run()循环。当接收到客户端连接时,handle_accept被调用(async_accept的完成处理程序)。如果没有错误,这个socket就可以用来进行读写操作。
在使用这个socket之后,会创建一个新的socket,然后再次调用start_accept(),它会添加另外一个“等待客户端连接”的异步操作,从而使service.run()循环一直保持忙碌状态。