码迷,mamicode.com
首页 > 其他好文 > 详细

Boost Asio 网络编程 基本用法

时间:2015-02-09 18:24:01      阅读:351      评论:0      收藏:0      [点我收藏+]

标签:boost asio

Boost Asio 网络编程 基本用法

flyfish 2015-2-9

IP地址

boost::asio::ip::address表示IP地址,同时支持ipv4和ipv6。
	boost::asio::ip::address addr;
	addr = addr.from_string("127.0.0.1");   
	assert(addr.is_v4());                   
	OutputDebugStringA(addr.to_string().c_str());  

	addr = addr.from_string("1000:0000:0000:0000:0000:1234:5678:1234");  
	assert(addr.is_v6());  
	OutputDebugStringA(addr.to_string().c_str());



端点
boost::asio::ip::tcp::endpoint表示端点
端点包括IP和端口

boost::asio::ip::address addr;         
addr = addr.from_string("127.0.0.1");
boost::asio::ip::tcp::endpoint ep(addr, 1234); //构造一个endpoint

ep.address() 获取IP地址
ep.port() 获取端口号

boost::asio::ip::tcp::socket对象调用成员函数connect()可以连接到一个指定的endpoint,
连接成功后用local_endpoint()和remote_endpoint()可以获取endpoint信息


读写缓冲区
读写缓冲区使用boost::asio::buffer封装
可封装的包括
A  char[] const array
A  void* pointer and size in characters
An  std::string string
An  POD[] const array (POD stands for plain old data, meaning, constructor and destructor do nothing)
An  std::vector array of any POD
A  boost::array array of any POD
An  std::array array of any POD


通过域名解析IP地址
boost::asio::ip::tcp::resolver 使用
boost::asio::ip::tcp::resolver::query和
boost::asio::placeholders::iterator
查询IP地址,
一个主机名可以被解析成多个地址,所以使用了迭代器。


连接
boost::asio::ip::tcp::socket对象的成员函数connect和async_connect尝试连接每一个地址,直到找到一个可用的地址。
async_connect连接后直接返回,返回的结果在回调函数(示例中是connect_handler)中处理




一个http示例


头文件

#pragma once
#include <boost/asio.hpp> 
#include <boost/array.hpp> 
#include <boost/bind.hpp>
#include <string>

class CASIOClient
{
public:
	CASIOClient(const std::string & hostname,boost::asio::io_service& io_service_);
	~CASIOClient(void);

private:
	boost::asio::ip::tcp::socket m_Sock;
	boost::asio::ip::tcp::resolver m_Resolver;
	boost::array<char, 4096> buffer;

	void receive_handler(const boost::system::error_code &ec, std::size_t bytes_transferred);
	void connect_handler(const boost::system::error_code &ec); 
	void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it);
};


实现文件

#include "StdAfx.h"
#include "ASIOClient.h"


CASIOClient::CASIOClient(  
	const std::string& hostname,
	boost::asio::io_service& io_service_)
	: m_Resolver(io_service_),
	m_Sock(io_service_)
	
{
	
	boost::asio::ip::tcp::resolver::query query(hostname,"http"); 
	m_Resolver.async_resolve(query,boost::bind(
		&CASIOClient::resolve_handler, 
		this,
		boost::asio::placeholders::error,
		boost::asio::placeholders::iterator));
}


CASIOClient::~CASIOClient(void)
{
}
void CASIOClient::receive_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) 
{ 
	if (!ec) 
	{ 
		
		OutputDebugStringA(std::string(buffer.data(), bytes_transferred).c_str());
		m_Sock.async_read_some(boost::asio::buffer(buffer), 
			boost::bind(&CASIOClient::receive_handler,
			this,
			boost::asio::placeholders::error,
			boost::asio::placeholders::bytes_transferred)); 
	} 
} 

void CASIOClient::connect_handler(const boost::system::error_code &ec) 
{ 
	if (!ec) 
	{ 

		m_Sock.write_some(boost::asio::buffer("GET http://www.boost.org/LICENSE_1_0.txt HTTP 1.0\r\nHost:http://www.boost.org\r\n\r\n"));
		m_Sock.async_read_some(boost::asio::buffer(buffer), 
			boost::bind(&CASIOClient::receive_handler,
			this,
			boost::asio::placeholders::error,
			boost::asio::placeholders::bytes_transferred));
	} 
} 

void CASIOClient::resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it) 
{ 
	if (!ec) 
	{ 
	m_Sock.async_connect(*it,boost::bind(&CASIOClient::connect_handler,this, boost::asio::placeholders::error)); 

	}
}


调用

		boost::asio::io_service io_service;
		CASIOClient client("www.boost.org",io_service);
		io_service.run();

同步 变 异步 步骤


原有的同步函数换成前缀是async_的异步函数,参数中包括回调函数,在回调函数中再编写异步调用


async_resolve        -》 resolve_handler
async_connect       -》 connect_handler
async_read_some   -》 receive_handler


异步方式的函数前面都有async_前缀,函数参数中其中一个是回调函数


以上程序在VC2010下编译通过



Boost Asio 网络编程 基本用法

标签:boost asio

原文地址:http://blog.csdn.net/flyfish1986/article/details/43672801

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!