boost asio 中文教程库 asio 网络编程,该怎么解决

&&&&C++ BOOST::Asio库网络编程源代码
C++ BOOST::Asio库网络编程源代码
不一下子应用MFC等界面,以直观易懂的控制台程序展现网络编程“服务端”-“客户端”是怎么运行的。最适合初学者。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
网络技术下载排行Boost Asio 网络编程 根本用法 - 操作系统当前位置:& &&&Boost Asio 网络编程 根本用法Boost Asio 网络编程 根本用法&&网友分享于:&&浏览:0次Boost Asio 网络编程 基本用法Boost Asio 网络编程 基本用法
boost::asio::ip::address表示IP地址,同时支持ipv4和ipv6。
boost::asio::ip::
addr = addr.from_string(&127.0.0.1&);
assert(addr.is_v4());
OutputDebugStringA(addr.to_string().c_str());
addr = addr.from_string(&00:34:&);
assert(addr.is_v6());
OutputDebugStringA(addr.to_string().c_str());
boost::asio::ip::tcp::endpoint表示端点
端点包括IP和端口
boost::asio::ip::
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
CASIOClient(const std::string & hostname,boost::asio::io_service& io_service_);
~CASIOClient(void);
boost::asio::ip::tcp::socket m_S
boost::asio::ip::tcp::resolver m_R
boost::array&char, 4096&
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,
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)
OutputDebugStringA(std::string(buffer.data(), bytes_transferred).c_str());
m_Sock.async_read_some(boost::asio::buffer(buffer),
boost::bind(&CASIOClient::receive_handler,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
void CASIOClient::connect_handler(const boost::system::error_code &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,
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)
m_Sock.async_connect(*it,boost::bind(&CASIOClient::connect_handler,this, boost::asio::placeholders::error));
boost::asio::io_service io_
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下编译通过
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有【偶尔一发】基于boost::asio::yield_context自制异步处理_东方编程学习馆吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:2,939贴子:
【偶尔一发】基于boost::asio::yield_context自制异步处理收藏
最近在用boost::asio折腾手游服务端。一开始尝试了一下纯callback方式,感觉编写逻辑甚是dt。。。于是目前正在全面切换至stackful coroutine。boost::asio是个相当不错的库,尤其是接口值得称道,兼有多种异步方式却在接口上保持高度的统一。必然,在这背后是诸多模板技巧的应用,读得人很是郁闷。。。今天花时间稍微消化了一下,总算是明白个大概,于是开始尝试自制异步处理。
按企业需求决定编程学习课程内容,确保编程学习训练内容及和企业需求一致.学编程学习,从OAEC人才培训基地开始,游戏化学习,免费试听,选择编程学习.
boost::asio所提供的yield_context是async_*系列操作实现协程切换的关键,其中保持着以下两个重要成员:1. detail::weak_ptr&callee_type& coro_;2. caller_type& ca_;其中的callee_type和caller_type:typedef boost::coroutines::push_coroutine&void& callee_typedef boost::coroutines::pull_coroutine&void& caller_看到这里应该很清楚了,在当前协程中调用ca_()会使协程挂起,而在异步过程中调用(*coro_)()又会使该协程恢复执行。boost::asio也为异步处理的结果传递提供了非常方便的模板封装。首先是coro_handler,该模板用于在异步过程中回传结果以及唤起协程。以下是传递单值的模板:接下来是async_result,该模板用于在协程中挂起自身以等待结果回传。以下同是传递单值的模板:最后是用于推导coro_handler类型用的helper:
以下用一个简单例子来试验一下。本例子有两个线程,主线程负责启动两个协程,协程1调用异步过程(简单的素数个数计算),协程2按秒循环计时;子线程负责运行异步过程。运行结果:12345Result: 179846end以上。顺便,asio中所实现的异步处理,参照作者的撰文可以大致了解(英语大苦手泪目)。
大阪这几天不开空调简直没法睡觉。。。
经过验证,3L的例子有点问题。具体问题在AsyncCount中的以下语句:(*setter)(count);在此处直接唤醒协程会使协程直接在该线程中被执行,这并不是理想的结果。如果是把异步过程交给一个共享的线程池来执行,这样就占用了宝贵的资源。因此,应当将唤醒操作post回io_service的handler队列中,由执行io_service::run的线程来继续执行协程:
帮顶一下,飘过,备注(我只是来拿经验的)
为何不加精
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或我个人很倾向用著名的开源软件来完成功能需求,但是发现在实际开展中很多人会反对开源,而要求自己实现一套,我不知道是我考虑太少,还是他们太武断。
首先,希望LZ有这个意识:所有的工具都是为了帮助人类解决问题的,所以解决问题才是这些人发明不同的轮子的根本原因。所以我认为LZ其实忽略了一个事实,也就是你看起来这些库解决的是同一个问题,所以你才会觉得是浪费,但实际上,这些不同的解决方案解决的不是同一个问题,至少不完全是一个问题。那么接下来问题就变成了“为什么这些解决方案解决的不是同一个问题呢?”在这一点上,我同意 的观点,但是我觉得他没有说全,所以想补充一点说明,也就是我们该怎么评价通用性和针对性这两种针对解决问题思路。一般来说,通用性解决方案的好处在于他有着较大的适用范围;但是缺点是在特定的场景下表现会退化,或者要实现如此的全能体验需要付出很大的代价(例如很笨重、耗费大量的内存等等)。举个现实中的例子,羊角锤(不是老罗的那个锤子OS哦)作为一个很通用的工具,可以用来敲钉子,可以用来起钉子,但是如果你用它敲堵墙试试?肯定能敲,但是估计LZ会累死吧。而针对性解决方案的好处在于他可以在特定场景下较好满足用户的需求,但是缺点是这种场景可能是考虑不完的,也就是只能适应特定的场合。最后再举个网游角色的例子来结束:你是把角色的属性点全部放在一个方面来剑走偏锋;还是每个方面放一些属性点来全面发展,这完全取决于你的爱好(也就是你的需求):-)
"著名"和"开源"都正确,"高性能"则不见得。这两个都是跨平台的功能丰富的网络库,代码量都在几万行,吃不透的话你敢用在产品代码中吗?&br&而专注某一平台(Linux)的性能更高的网络库只要5千行代码,几天就看下来了。&br&我见过的技术实力雄厚的公司都是自己写网络库的,而且都写得比libevent和asio更好。
"著名"和"开源"都正确,"高性能"则不见得。这两个都是跨平台的功能丰富的网络库,代码量都在几万行,吃不透的话你敢用在产品代码中吗? 而专注某一平台(Linux)的性能更高的网络库只要5千行代码,几天就看下来了。 我见过的技术实力雄厚的公司都是自…
Libevent 这种库的稳定性是经过千锤百炼出来的,不是实力问题,比如 Google Chrome 就使用了 Libevent,难道 Google 没有能力自己封装一个网络库吗?这是通用性解决方案,稳定可靠是最重要。&br&&br&比如性能你很看重,100是满分,那么 libevent 可能是 93 分,自己优化的可能性能达到了 95 的高分。&br&&br&但是从稳定上来说 libevent 的稳定性打分是 98 分,你自己写的东西可能只有不到 80 分。&br&&br&我推荐使用 libevent / libev / boost::asio 等成熟的网络库,无后顾之忧才是最好的。
Libevent 这种库的稳定性是经过千锤百炼出来的,不是实力问题,比如 Google Chrome 就使用了 Libevent,难道 Google 没有能力自己封装一个网络库吗?这是通用性解决方案,稳定可靠是最重要。 比如性能你很看重,100是满分,那么 libevent 可能是 93 分,自…
已有帐号?
无法登录?
社交帐号登录
详情请看个人网站: http://levskiweng.me

我要回帖

更多关于 boost asio buffer 的文章

 

随机推荐