您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 3浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

boost之asio异步io使用实例

phymat.nico 发布时间:2017-10-08 15:18:25 ,浏览量:3

// boost_asio_client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")
using namespace boost::asio;
void connect_handler(const boost::system::error_code &ec)
{
	printf("connect success\n");
}
void tcp_async_client()
{
	boost::asio::io_service service;
	boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("0.0.0.0"), 6000);
	boost::asio::ip::tcp::socket sock(service);
	sock.async_connect(ep,connect_handler);
	//boost::thread(boost::bind());
	service.run();
}
int _tmain(int argc, _TCHAR* argv[])
{
	tcp_async_client();
	return 0;
}

// boost_asio_server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")

using namespace boost::asio;

#include 
using namespace std;

typedef boost::shared_ptr sock_ptr;
typedef boost::shared_ptr acceptor_ptr;
typedef boost::shared_ptr io_service_ptr;

map link_mgr_map;

void tcp_async_post_read(sock_ptr sock);
void tcp_async_post_write(sock_ptr sock, const void *buf, size_t len);
void tcp_async_receive_handler(sock_ptr sock, void *buf, 
							   const boost::system::error_code& ec, 
							   std::size_t bytes_transferred)
{
	printf("buff:%s len:%d\n",buf,bytes_transferred);

	tcp_async_post_write(sock,buf,bytes_transferred);

	tcp_async_post_read(sock);
}

char buf[512];
int len = 512;
void tcp_async_post_read(sock_ptr sock)
{
	sock->async_read_some(boost::asio::buffer(buf, len), 
		boost::bind(tcp_async_receive_handler, sock, buf, 
		boost::asio::placeholders::error, 
		boost::asio::placeholders::bytes_transferred));
}
void tcp_async_send_handler(sock_ptr sock,
							const boost::system::error_code& ec, 
							std::size_t bytes_transferred)
{
	printf("send %d bytes success\n",bytes_transferred);
}
void tcp_async_post_write(sock_ptr sock, const void *buf, size_t len)
{
	try
	{
		sock->async_write_some(boost::asio::buffer(buf, len), 
			boost::bind(tcp_async_send_handler, sock, 
			boost::asio::placeholders::error, 
			boost::asio::placeholders::bytes_transferred));
	}
	catch (const boost::system::system_error& e)
	{
		e.code().value();
	}
}

typedef boost::shared_ptr socket_ptr;
typedef boost::shared_ptr acceptor_ptr;

void handle_accept(io_service *service,acceptor_ptr acc,socket_ptr sock, const boost::system::error_code &
				   err);
void start_accept(io_service *service,acceptor_ptr acc) 
{
	socket_ptr sock(new ip::tcp::socket(*service));
	acc->async_accept(*sock, boost::bind( handle_accept, service,acc,sock, _1) );
}
void handle_accept(io_service *service,acceptor_ptr acc,socket_ptr sock, const boost::system::error_code &
				   err) 
{
	if ( err) return;
	// 从这里开始, 你可以从socket读取或者写入
	static int index = 0;
	link_mgr_map.insert(make_pair(index++,sock));

	tcp_async_post_read(sock);

	start_accept(service,acc);
}

#define CLIENT_THREAD_NUM 4
#include 

void work_thread_func(io_service *service)
{
	service->run();
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	
	io_service service;
	ip::tcp::endpoint ep( ip::tcp::v4(), 4567); // 监听端口2001
	acceptor_ptr acc(new boost::asio::ip::tcp::acceptor(service,ep));
	start_accept(&service,acc);
	//service.run();
	
	boost::threadpool::pool tp(4);
	tp.schedule( boost::bind(work_thread_func, &service));
	while (getchar())
	{
		boost::this_thread::sleep(boost::posix_time::seconds(1));
	}

	return 0;
}

关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0483s