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::tcp::endpoint表示端点
端点包括IP和端口
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);
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示例
同步 变 异步 步骤
原有的同步函数换成前缀是async_的异步函数,参数中包括回调函数,在回调函数中再编写异步调用
async_resolve -》 resolve_handler
async_connect -》 connect_handler
async_read_some -》 receive_handler
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);
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
- Boost Asio 网络编程 基本用法
- boost asio网络编程
- Boost asio之网络编程
- Boost asio—— 网络编程
- boost::asio网络编程(同步)
- 网络编程 - boost::asio优雅的退出
- BOOST网络库-ASIO
- boost::asio::buffer用法
- boost::asio编程-域名解析
- boost asio编程笔记
- 基于Boost::asio库的网络编程实现基础
- 基于Boost::asio库的网络编程实现基础
- Boost asio学习笔记—— 网络编程
- Boost asio学习笔记之二—— 网络编程
- 基于Boost::asio库的网络编程实现基础
- 基于Boost::asio库的网络编程实现基础
- Boost.Asio c++ 网络编程翻译(1)
- Boost.Asio c++ 网络编程翻译(2)
- android各种对话框总结笔记
- 利用adb install 命令及批处理在电脑上自动安装apk到手机
- 资料学习内容整理
- MySQL备份与恢复
- MUI-页面初始化
- Boost Asio 网络编程 基本用法
- 黑马程序员——Java基础网络编程
- 通过Wifi调试Android程序
- Android思维导图
- 运用面向对象的分析与设计模式巧解面试算法题
- 从今天开始,把C++primer(第五版)的课后练习答案贴到我的博客里面
- 寒假集训.Multiplying by Rotation
- 初始化iframe数据,判断iframe加载是否完成的问题
- android 鼠标悬停状态下改变背景色(类似Button、listview item 的selector)