﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Error-随笔分类-boost::asio</title><link>http://www.cppblog.com/Error/category/20178.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 17 Mar 2017 05:23:20 GMT</lastBuildDate><pubDate>Fri, 17 Mar 2017 05:23:20 GMT</pubDate><ttl>60</ttl><item><title>acceptor两种创建方法</title><link>http://www.cppblog.com/Error/archive/2017/03/16/214758.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 16 Mar 2017 13:56:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/03/16/214758.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214758.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/03/16/214758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214758.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214758.html</trackback:ping><description><![CDATA[1.创建的时候给明确地址和端口，创建完成后直接可以accept<br />2.open bind listen accept完整套路<img src ="http://www.cppblog.com/Error/aggbug/214758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-03-16 21:56 <a href="http://www.cppblog.com/Error/archive/2017/03/16/214758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tcp socket 关闭句柄，如何保证对端能接收完整数据【测试结果，仅做参考】</title><link>http://www.cppblog.com/Error/archive/2017/03/16/214757.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 16 Mar 2017 13:54:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/03/16/214757.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214757.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/03/16/214757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214757.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214757.html</trackback:ping><description><![CDATA[<div>1.直接close：客户端接收数据不完整，本地系统关闭socket，客户端收不到完整数据</div><div>2.shutdown_both：客户端接收数据不完整，end of file</div><div>3.shutdown_receive: 客户端接收数据完整</div><div>3.shutdown_send: 客户端接收数据不完整,远程主机关闭链接</div><div>关闭socket，但是确保对端一定收到数据的手段是：</div><div>1.shutdown_receive,同时在应用层确认全部数据已经投递到tcp堆栈，然后调用close</div><div>2.设计应用层关闭协议，由接收方主动关闭</div><img src ="http://www.cppblog.com/Error/aggbug/214757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-03-16 21:54 <a href="http://www.cppblog.com/Error/archive/2017/03/16/214757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asio.hpp和windows.h冲突解决</title><link>http://www.cppblog.com/Error/archive/2014/02/14/205758.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Fri, 14 Feb 2014 03:53:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2014/02/14/205758.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/205758.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2014/02/14/205758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/205758.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/205758.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">开始使用boost::asio库时，编译碰到这个错误提示：</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">fatal error C1189: #error :&nbsp; WinSock.h has already been included</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">查了下抛出这个错误的boost代码，原来是定义了_WINSOCKAPI_，但没有定义_WINSOCK2API_</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">那哪里定义了_WINSOCKAPI_呢？</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">后来在网上查了下，原来是我包含了Windows.h头文件，而Windows.h头文件又包含了WinSock.h这个老东西</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">知道原因就简单了，试了下，方法有三种可解决此错误：</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">1、在包含Windows.h前定义宏WIN32_LEAN_AND_MEAN，就OK了（WIN32_LEAN_AND_MEAN表示不包含一些极少使用和偏门的资料）</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">2、在包含Windows.h前包含winsock2.h</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">3、在包含Windows.h前包含asio.hpp</p><img src ="http://www.cppblog.com/Error/aggbug/205758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2014-02-14 11:53 <a href="http://www.cppblog.com/Error/archive/2014/02/14/205758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost asio timer 简单使用</title><link>http://www.cppblog.com/Error/archive/2013/03/08/198303.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Fri, 08 Mar 2013 10:04:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2013/03/08/198303.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/198303.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2013/03/08/198303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/198303.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/198303.html</trackback:ping><description><![CDATA[<div>// learn_boost_asio.cpp : 定义控制台应用程序的入口点。</div><div>//</div><div></div><div>#include "stdafx.h"</div><div></div><div>#include &lt;iostream&gt;</div><div>#include &lt;algorithm&gt;</div><div>#include &lt;memory&gt;</div><div></div><div>#include &lt;boost/asio.hpp&gt;</div><div>#include &lt;boost/timer.hpp&gt;</div><div>#include &lt;boost/lambda/lambda.hpp&gt;</div><div>#include &lt;boost/function.hpp&gt;</div><div>#include &lt;boost/bind.hpp&gt;</div><div></div><div></div><div>namespace asio = boost::asio;</div><div>namespace posix_time = boost::posix_time ;</div><div></div><div>// 1.同步定时器使用</div><div>void LeanrHowToUseSynchronouslyTimer()</div><div>{</div><div><span style="white-space:pre">	</span>asio::io_service io;</div><div></div><div><span style="white-space:pre">	</span>asio::deadline_timer deadLineTimer(io, posix_time::seconds(3));</div><div></div><div><span style="white-space:pre">	</span>boost::timer timerTestDeadLineTimer;</div><div><span style="white-space:pre">	</span>timerTestDeadLineTimer.restart();</div><div><span style="white-space:pre">	</span>deadLineTimer.wait();</div><div><span style="white-space:pre">	</span>double dTime = timerTestDeadLineTimer.elapsed();</div><div></div><div><span style="white-space:pre">	</span>std::cout &lt;&lt; dTime &lt;&lt; std::endl;</div><div>}</div><div>////////~</div><div></div><div>// 2.异步定时器使用</div><div>class CSomeObject</div><div>{</div><div>public:</div><div><span style="white-space:pre">	</span>CSomeObject(asio::io_service&amp; ioService) :</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp;m_deadLineTimer(ioService)</div><div><span style="white-space:pre">	</span>{</div><div></div><div><span style="white-space:pre">	</span>}</div><div></div><div>public:</div><div><span style="white-space:pre">	</span>void Test()</div><div><span style="white-space:pre">	</span>{</div><div><span style="white-space:pre">		</span>m_deadLineTimer.expires_from_now(boost::posix_time::seconds(3));</div><div><span style="white-space:pre">		</span>m_timerTestDeadTimer.restart();</div><div><span style="white-space:pre">		</span>m_deadLineTimer.async_wait(</div><div><span style="white-space:pre">			</span>boost::bind(&amp;CSomeObject::TimerHandler, this, asio::placeholders::error));</div><div></div><div><span style="white-space:pre">	</span>}</div><div></div><div>public:</div><div><span style="white-space:pre">	</span>void TimerHandler(const boost::system::error_code&amp;)</div><div><span style="white-space:pre">	</span>{</div><div><span style="white-space:pre">		</span>double dTime = m_timerTestDeadTimer.elapsed();</div><div><span style="white-space:pre">		</span>std::cout &lt;&lt; "time passed: " &lt;&lt; dTime &lt;&lt; std::endl;</div><div><span style="white-space:pre">	</span>}</div><div>private:</div><div><span style="white-space:pre">	</span>boost::timer m_timerTestDeadTimer;</div><div><span style="white-space:pre">	</span>asio::deadline_timer m_deadLineTimer;</div><div>};</div><div></div><div>void LearnHowToUseAsynchronouslyTimer()</div><div>{</div><div><span style="white-space:pre">	</span>asio::io_service ioService;</div><div><span style="white-space:pre">	</span>CSomeObject obj(ioService);</div><div><span style="white-space:pre">	</span>obj.Test();</div><div></div><div><span style="white-space:pre">	</span>asio::io_service::work* pWork = new asio::io_service::work(ioService);</div><div><span style="white-space:pre">	</span>std::auto_ptr&lt;asio::io_service::work&gt; spWork(pWork);</div><div></div><div><span style="white-space:pre">	</span>ioService.run();</div><div><span style="white-space:pre">	</span>//spWork.reset(); // Allow run() to exit.&nbsp;</div><div>}</div><div>//////////////////////////////////////////</div><div></div><div></div><div></div><div>int _tmain(int argc, _TCHAR* argv[])</div><div>{</div><div><span style="white-space:pre">	</span>LearnHowToUseAsynchronouslyTimer();</div><div></div><div><span style="white-space:pre">	</span>return 0;</div><div>}</div><div></div><img src ="http://www.cppblog.com/Error/aggbug/198303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2013-03-08 18:04 <a href="http://www.cppblog.com/Error/archive/2013/03/08/198303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>4.boost::asio 的handle理解</title><link>http://www.cppblog.com/Error/archive/2012/11/08/194942.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 08 Nov 2012 11:48:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2012/11/08/194942.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/194942.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2012/11/08/194942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/194942.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/194942.html</trackback:ping><description><![CDATA[<p>在asio的异步指导思想下，所有的socket io操作都被分解了：</p> <p>投递请求 –&gt; 响应结果</p> <p>投递请求是异步IO的发起动作，响应结果是异步IO的结果反馈动作。</p> <p>具体到代码就是：async系列函数和Functor构成的handler</p> <p>每一个操作对应一种handler</p> <p>&nbsp;</p> <p>具体handler来说主要有两种模型：</p> <p>一种是接收一个error和translateLen，这可个详情可以看文档。</p> <p>主要能理解async和handler，和选择正确的handler</p> <p>应该来说，原则上所有有数据传输的handler有应该选择能接收len的Functor，这样控制能力更加精确。</p> <p>&nbsp;</p> <p>其他的细节有待分析，，，</p><img src ="http://www.cppblog.com/Error/aggbug/194942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2012-11-08 19:48 <a href="http://www.cppblog.com/Error/archive/2012/11/08/194942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3.boost::asio::ip::tcp::resolver的故事</title><link>http://www.cppblog.com/Error/archive/2012/11/07/194839.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 07 Nov 2012 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2012/11/07/194839.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/194839.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2012/11/07/194839.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/194839.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/194839.html</trackback:ping><description><![CDATA[<p>直白点说，就是对getaddrinfo()这个函数的适配。抽象点说就是解析器。 </p><p>细节如下：</p> <p>boost::asio::ip::tcp::resolver resolver(asioService);<br />boost::asio::ip::tcp::resolver::query queryEndpoints(boost::asio::ip::host_name(),"80");<br />boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(queryEndpoints);<br />;<br />for(boost::asio::ip::tcp::resolver::iterator iterNull;<br />&nbsp;&nbsp;&nbsp; endpoint_iterator != iterNull;<br />&nbsp;&nbsp;&nbsp; endpoint_iterator++)<br />{<br />&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; endpoint_iterator-&gt;endpoint() &lt;&lt; std::endl;<br />}</p> <p>&nbsp;</p> <p>上面的代码有这么几个类型：</p> <p>boost::asio::ip::tcp::resolver</p> <p>boost::asio::ip::tcp::resolver::query</p> <p>boost::asio::ip::tcp::resolver::iterator </p> <p>&nbsp;</p> <p>resolver抽线的是getaddrinfo()动作 </p><p>boost::asio::ip::tcp::resolver::query抽象的是getaddrinfo()需要的参数 </p><p>boost::asio::ip::tcp::resolver::iterator抽象的是getaddrinfo()的结果 </p><p>这整个体系是抽象winsock sdk到stl思想  </p><img src ="http://www.cppblog.com/Error/aggbug/194839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2012-11-07 13:52 <a href="http://www.cppblog.com/Error/archive/2012/11/07/194839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.boost::asio::io_service::run() 返回的问题</title><link>http://www.cppblog.com/Error/archive/2012/11/07/194828.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 07 Nov 2012 02:27:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2012/11/07/194828.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/194828.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2012/11/07/194828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/194828.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/194828.html</trackback:ping><description><![CDATA[<p>原则上将会在处理完所有的异步请求以后返回，具体内部是某个变量控制的。</p>
<p>可以通过：</p>
<p>boost::asio::io_service io_service; </p>
<p>boost::asio::io_service::work work(io_service);</p>
<p>work构造以后会让io_service内部的某个控制变量自增这样run就不会返回了。</p>
<p>&nbsp;</p>
<p>可以通过类似这样的技巧更漂亮的控制：</p>
<p>boost::asio::io_service asioService;<br />//boost::asio::io_service::work work(asioService);<br />boost::scoped_ptr&lt;boost::asio::io_service::work&gt; spWork(new boost::asio::io_service::work(asioService));<br />asioService.run();&nbsp; // 这样run就会一直执行不会返回<br /><br />...<br />spWork.reset();// reset会导致内部的work析构，析构以后io_service里边的控制量就会正常。run处理完所有异步请求就会返回了</p><img src ="http://www.cppblog.com/Error/aggbug/194828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2012-11-07 10:27 <a href="http://www.cppblog.com/Error/archive/2012/11/07/194828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1.endpoint 一个socket体系中的终端标识</title><link>http://www.cppblog.com/Error/archive/2012/11/06/194706.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 06 Nov 2012 02:46:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2012/11/06/194706.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/194706.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2012/11/06/194706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/194706.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/194706.html</trackback:ping><description><![CDATA[<p>endpoint:描述socket编程体系下的一个端点。一个IP+PORT ? <p>port还是一样的unsigned short <p>提供一个data()方法，来返回原生的地址结构体。这是一个好的思路，这样系统就不会封闭了。 <p>&nbsp; <p><strong>address</strong>: 抽象的一个IP地址，可以是ipv4、ipv6。对外接口一致。具体实现上，是聚合了4和6两个实体。所以提供is_v4 is_v6这样两个函数来确认类型。<br>&nbsp; address只提供string到address的转换和构造。具体到address_v6 address_v4以后有提供long到address_v4的转换同时也提供了一系列的帮助函数：<br>&nbsp;&nbsp;&nbsp; /// Determine whether the address is a loopback address.<br>&nbsp; BOOST_ASIO_DECL bool is_loopback() const;  <p>&nbsp; /// Determine whether the address is unspecified.<br>&nbsp; BOOST_ASIO_DECL bool is_unspecified() const;  <p>&nbsp; /// Determine whether the address is a class A address.<br>&nbsp; BOOST_ASIO_DECL bool is_class_a() const;  <p>&nbsp; /// Determine whether the address is a class B address.<br>&nbsp; BOOST_ASIO_DECL bool is_class_b() const;  <p>&nbsp; /// Determine whether the address is a class C address.<br>&nbsp; BOOST_ASIO_DECL bool is_class_c() const;  <p>&nbsp; /// Determine whether the address is a multicast address.<br>&nbsp; BOOST_ASIO_DECL bool is_multicast() const;<br>&nbsp; /// Obtain an address object that represents the loopback address.<br>&nbsp; static address_v4 loopback()<br>&nbsp; /// Obtain an address object that represents the broadcast address.<br>&nbsp; static address_v4 broadcast()</p><img src ="http://www.cppblog.com/Error/aggbug/194706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2012-11-06 10:46 <a href="http://www.cppblog.com/Error/archive/2012/11/06/194706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>