﻿<?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++博客-meet-dream</title><link>http://www.cppblog.com/meet-dream/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:15:39 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:15:39 GMT</pubDate><ttl>60</ttl><item><title>boost::graph的名字参数</title><link>http://www.cppblog.com/meet-dream/archive/2007/05/28/24987.html</link><dc:creator>meet-dream</dc:creator><author>meet-dream</author><pubDate>Mon, 28 May 2007 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/meet-dream/archive/2007/05/28/24987.html</guid><wfw:comment>http://www.cppblog.com/meet-dream/comments/24987.html</wfw:comment><comments>http://www.cppblog.com/meet-dream/archive/2007/05/28/24987.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/meet-dream/comments/commentRss/24987.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/meet-dream/services/trackbacks/24987.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 初见boost的名字参数，给人一种“惊为天人”的感觉，没想到....&nbsp;&nbsp;<a href='http://www.cppblog.com/meet-dream/archive/2007/05/28/24987.html'>阅读全文</a><img src ="http://www.cppblog.com/meet-dream/aggbug/24987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/meet-dream/" target="_blank">meet-dream</a> 2007-05-28 17:08 <a href="http://www.cppblog.com/meet-dream/archive/2007/05/28/24987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用软件和平台软件的一点思考</title><link>http://www.cppblog.com/meet-dream/archive/2007/05/28/24973.html</link><dc:creator>meet-dream</dc:creator><author>meet-dream</author><pubDate>Mon, 28 May 2007 05:54:00 GMT</pubDate><guid>http://www.cppblog.com/meet-dream/archive/2007/05/28/24973.html</guid><wfw:comment>http://www.cppblog.com/meet-dream/comments/24973.html</wfw:comment><comments>http://www.cppblog.com/meet-dream/archive/2007/05/28/24973.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/meet-dream/comments/commentRss/24973.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/meet-dream/services/trackbacks/24973.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/meet-dream/archive/2007/05/28/24973.html'>阅读全文</a><img src ="http://www.cppblog.com/meet-dream/aggbug/24973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/meet-dream/" target="_blank">meet-dream</a> 2007-05-28 13:54 <a href="http://www.cppblog.com/meet-dream/archive/2007/05/28/24973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost asio 2:threading</title><link>http://www.cppblog.com/meet-dream/archive/2007/05/25/24822.html</link><dc:creator>meet-dream</dc:creator><author>meet-dream</author><pubDate>Fri, 25 May 2007 06:06:00 GMT</pubDate><guid>http://www.cppblog.com/meet-dream/archive/2007/05/25/24822.html</guid><wfw:comment>http://www.cppblog.com/meet-dream/comments/24822.html</wfw:comment><comments>http://www.cppblog.com/meet-dream/archive/2007/05/25/24822.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/meet-dream/comments/commentRss/24822.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/meet-dream/services/trackbacks/24822.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/meet-dream/archive/2007/05/25/24822.html'>阅读全文</a><img src ="http://www.cppblog.com/meet-dream/aggbug/24822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/meet-dream/" target="_blank">meet-dream</a> 2007-05-25 14:06 <a href="http://www.cppblog.com/meet-dream/archive/2007/05/25/24822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost asio 1:how to use it</title><link>http://www.cppblog.com/meet-dream/archive/2007/05/25/24821.html</link><dc:creator>meet-dream</dc:creator><author>meet-dream</author><pubDate>Fri, 25 May 2007 06:04:00 GMT</pubDate><guid>http://www.cppblog.com/meet-dream/archive/2007/05/25/24821.html</guid><wfw:comment>http://www.cppblog.com/meet-dream/comments/24821.html</wfw:comment><comments>http://www.cppblog.com/meet-dream/archive/2007/05/25/24821.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/meet-dream/comments/commentRss/24821.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/meet-dream/services/trackbacks/24821.html</trackback:ping><description><![CDATA[       boost asio 是一个轻量级的异步网络库，它有简洁，小巧，高效，有良好的可扩展性，支持高并发的IO处理，入门简单等诸多优点。boost asio在设计上采用和和ace相似的反应器（proactor）设计模式，同时内置了对多线程的支持，针对不同的平台，采用了最优的socket模型，可以说能发挥机器的最大并发处理能力。同时在设计上，asio在接口上也有良好的可扩展性，几乎每种设计元素都可以根据要求订制和扩充，可以进一步对模型进行抽象和建模来建立自己需要的开发平台。当然，asio的最大缺点就是代码调试太难了。
     我们看一个asio的hello world：
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

void print(const boost::asio::error& /*e*/)
{
  std::cout << "Hello, world!\n";
}

int main()
{
// 定义一个io_service,它的作用是注册服务，调用一个异步请求完成后对应的操作（一个handle）
 boost::asio::io_service io;
//添加一个定时器服务，
  boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));

//启动一个异步操作，该操作会记录于io_service 的一个队列中
t.async_wait(print);
//每个注册的服务启动工作
 io.run();

//5s后，定时器时间到，print被调用，然后该handle（print）从队列中删除

  return 0;
}
     可以看出，对一个使用者来说，asio的原理很简单
1。定义一个IO_Service
2.向IO_Service注册一个服务,该服务可以是io服务,也可以是定时器服务,当然,你也可以自己订制一个邮件服务
3.在该服务上启动一个异步操作,这需要一个回调函数
4.如果异步操作完成,你的回调函数会被调用
5.可能的错误处理

理解asio的原理后，写一个网络通信的程序简直是依葫芦画瓢的事了
我们看一个时间查询的服务端：
#include <ctime>
#include <iostream>
#include <string>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::udp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

class udp_server
{
public:
//对象建立时，注册了udp的socket服务，接着就开始了一个异步的接收操作
  udp_server(boost::asio::io_service& io_service)
    : socket_(io_service, udp::endpoint(udp::v4(), 13))
  {
    start_receive();
  }

private:

  void start_receive()
  {
//启动的异步操作
    socket_.async_receive_from(
           boost::asio::buffer(recv_buffer_),                       //接收缓冲区
           remote_endpoint_,                                            //存储请求的客户地址，ip+port
           boost::bind(&udp_server::handle_receive, this,   //构造一个回调函数，实际调用了成员函数handle_receive，具体见boost::bind
           boost::asio::placeholders::error,
           boost::asio::placeholders::bytes_transferred)
          );
  }

  void handle_receive(const boost::asio::error& error,
      std::size_t /*bytes_transferred*/)
  {
//接到客户端的信息，忽略了请求内容，直接发回本机的时间，发送也是一个异步操作

    if (!error || error == boost::asio::error::message_size)
    {
      boost::shared_ptr<std::string> message(
          new std::string(make_daytime_string()));

      socket_.async_send_to(boost::asio::buffer(*message), remote_endpoint_,
          boost::bind(&udp_server::handle_send, this, message,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));

      start_receive();
    }
  }
//发送完成，忽略
  void handle_send(boost::shared_ptr<std::string> /*message*/,
      const boost::asio::error& /*error*/, std::size_t /*bytes_transferred*/)
  {
  }

  udp::socket socket_;
  udp::endpoint remote_endpoint_;
  boost::array<char, 1> recv_buffer_;
};

int main()
{
  try
  {
    boost::asio::io_service io_service;
    udp_server server(io_service);
    io_service.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}
可以看到，用asio开发一个网络服务端的程序一件多么简单的事。对此程序稍加改动，我们就可以建立一个支持多线程，高并发的网络服务程序。
后面我们将继续分析asio的多线程支持，多缓冲，网络流等更好的基础特性。 <img src ="http://www.cppblog.com/meet-dream/aggbug/24821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/meet-dream/" target="_blank">meet-dream</a> 2007-05-25 14:04 <a href="http://www.cppblog.com/meet-dream/archive/2007/05/25/24821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>a simple template hook class for function and member functions</title><link>http://www.cppblog.com/meet-dream/archive/2007/03/05/19265.html</link><dc:creator>meet-dream</dc:creator><author>meet-dream</author><pubDate>Mon, 05 Mar 2007 15:51:00 GMT</pubDate><guid>http://www.cppblog.com/meet-dream/archive/2007/03/05/19265.html</guid><wfw:comment>http://www.cppblog.com/meet-dream/comments/19265.html</wfw:comment><comments>http://www.cppblog.com/meet-dream/archive/2007/03/05/19265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/meet-dream/comments/commentRss/19265.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/meet-dream/services/trackbacks/19265.html</trackback:ping><description><![CDATA[
		<p>Some times,we need too hook some function to do something that's not so easy to do with normally add somecode.A solution is to hook focused functions and interface.Here is a template hook class maybe help your work easier,which complie with vs2005.It midify the jmp table to replace the function,maybe not properly  for other compliers.<br /><br />class HookPfn<br />{<br /> struct make_writeable<br /> {<br />  void* p;<br />  MEMORY_BASIC_INFORMATION mbi_thunk;<br />  make_writeable(void* _p):p(_p)<br />  {<br />   VirtualQuery(p, &amp;mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));<br />   VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &amp;mbi_thunk.Protect);<br />  <br />  }<br />  ~make_writeable()<br />  {<br />   VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect,&amp;mbi_thunk.Protect);<br />  }<br /> };<br />public:<br /> template&lt;class F&gt;<br /> void restore(F pfn,unsigned long handle)<br /> {<br />  <br />  void* p;<br />  __asm mov eax,[pfn]<br />  __asm mov dword ptr[p],eax<br />  make_writeable write(p);<br />  __asm push ecx<br />  __asm mov eax,pfn<br />  __asm inc eax<br />  __asm mov ecx,handle<br />  __asm mov dword ptr[eax],ecx<br />  __asm pop ecx<br /> }<br /> template&lt;class F1,class F2&gt;<br /> unsigned long redirect(F1 pfn1,F2 pfn2)<br /> {<br />   //should use restrict object prevent F1 and F2 's arguments and type not same<br />  void* p;<br />  __asm mov eax,[pfn1]<br />  __asm mov dword ptr[p],eax<br />  make_writeable write(p);</p>
		<p>  unsigned long bas1,bas2,of1,of2,of;<br />  __asm push ecx<br />  __asm mov eax,pfn1<br />  __asm mov bas1,eax<br />  __asm inc eax<br />  __asm mov ecx,dword ptr[eax]<br />  __asm mov of1,ecx</p>
		<p>  __asm mov eax,pfn2<br />  __asm mov bas2,eax<br />  __asm inc eax<br />  __asm mov ecx,dword ptr[eax]<br />  __asm mov of2,ecx</p>
		<p>  of=(bas2-bas1+of2-of1)+of1;</p>
		<p>  __asm mov eax,pfn1<br />  __asm inc eax<br />  __asm mov ecx,of<br />  __asm mov dword ptr[eax],ecx<br />  __asm pop ecx<br />  return of1;<br /> }<br /> <br />};<br /><br />class mmt<br />{<br />public:<br /> void donothing()<br />{<br />}<br /> void donothing(int)<br />{<br />}<br />  void dosomething()<br />{<br />}<br />};<br /><br />void fastcall(int a,int b)<br />{<br />}<br />void askcall(int,int)<br />{<br />}</p>
		<p>
				<br />It can be used as example:<br />int main()<br />{<br /> HookMemberFunction sh;<br /> unsigned long hd=sh.redirect(&amp;fastcall,&amp;askcall);//test api<br /> fastcall(0,0);//two function<br /> askcall(0,0);<br /> sh.restore(&amp;fastcall,hd);<br /> askcall(0,0);<br /> fastcall(0,0);<br />//test overlay functions(donothing)<br /> typedef void (mmt::*sp)(void);<br /> sp p1=&amp;mmt::dosomething;<br /> sp p2=&amp;mmt::donothing;<br /> hd=sh.redirect(p1,p2);<br /> mmt mt;//a class<br /> mt.donothing();<br /> mt.dosomething();<br /> sh.restore(p1,hd);<br /> mt.donothing();<br /> mt.dosomething();<br /><br />}<br />Although it can be work right,addtionly we may be use it not properly.Youcan add some strict class to prevent bad use of it by check if the argument and return type is strictly same.,if you need it.<br /></p>
<img src ="http://www.cppblog.com/meet-dream/aggbug/19265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/meet-dream/" target="_blank">meet-dream</a> 2007-03-05 23:51 <a href="http://www.cppblog.com/meet-dream/archive/2007/03/05/19265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>