Boost Asio 网络编程 基本用法

来源:互联网 发布:电脑破解wifi密码软件 编辑:程序博客网 时间:2024/06/10 12:44
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); //构造一个endpointep.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

关于缓冲区封装的示例代码
struct pod_sample { int i; long l; char c; };


char b1[512];
void * b2 = new char[512];
std::string b3; b3.resize(128);
pod_sample b4[16];
std::vector<pod_sample> b5; b5.resize(16);
boost::array<pod_sample,16> b6;
std::array<pod_sample,16> b7;
sock.async_send(buffer(b1), on_read);
sock.async_send(buffer(b2,512), on_read);
sock.async_send(buffer(b3), on_read);
sock.async_send(buffer(b4), on_read);
sock.async_send(buffer(b5), on_read);
sock.async_send(buffer(b6), on_read);

sock.async_send(buffer(b7), on_read);


通过域名解析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下编译通过



0 0
原创粉丝点击