lxwde

刘晓伟ID:lxwde
162277次访问,排名419好友0人,关注者1
lxwde的文章
原创 27 篇
翻译 34 篇
转载 0 篇
评论 244 篇
最近评论
mldstk:wow power leveling
lshvs2006:你好,你設計的東東非常不錯。
但是,現在有個疑問,不知道,怎樣保存設計的文件,
存成XML 文件格式可能會好一點,但是,不知道如何去存? 需要調用什么接口 或是 需要寫什么 方法嗎?

期待您的指教。謝謝

lsh2011@163.com
zeeler:补上这一部分吧(本人中文表述能力没有lxwde强哦 :) ):
The Singleton
也许最简单的设计模式是Singleton模式了,它可以给某种类型提供唯一的对象,下面是个例子:
(译者按:例子省略)
创建一个唯一对象的关键是防止客户程序员(client programmer)用其他任意方法创建对象,只能用你提供的方法。你必须把所有构造器写成p……
zeeler:翻译的不错呀,全力支持!
不过在Design principles和Classifying patterns之间还有个The Singleton部分好像lxwde漏掉了?还是Bruce Eckel修改版面了?
总之,支持呀,本来我也想翻译一下的,不过没有lxwde这么有毅力,翻译一节就停了,实在很累的,所以非常敬佩lxwde能坚持做这么多!
roger_77:可惜,
这个库被boost放弃了,加入另一个ASIO的网络类库
文章分类
收藏
    相册
    链接
    My articles on codeproject
    SharpFormEditor下载
    Thinking in Patterns中文版
    友情链接
    alai04
    C++的罗浮宫
    fatalerror99
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Boost::socket终于可以编译通过了。收藏

    新一篇: 翻译TIPatterns--降低接口复杂度(Reducing interface complexity)

     

     

    在网上搜MailList,有人说Boostsocket已经差不多可以用了(盼了好长时间了)。折腾了一上午,现在终于编译通过了。

     

    1.  BoostSandbox CVS(http://cvs.sourceforge.net/viewcvs.py/boost-sandbox/boost-sandbox/) 上下载socket库和其它一些文件(包括io库,最好全down)。

    2.  socketcopyboost_1_30_0\boost\目录下(俺先copyboost_1_31_0但编译时问题好多,放弃了),编译时看缺少哪些库或者文件,再从boost-sandbox\拷过来。

    3.  编译socket库,http://www.boost.org/more/getting_started.htmlcsdnblog里也有中文指南,搜一下。编译的时候如果缺少某些文件就从Sandbox拷过来。俺用的是VC7,怕VC6不能通过。

    4.  写一个client测试程序和一个server测试程序。编译应该没什么大问题,link的时候要加上Ws2_32.lib libboost_socket.lib

     

     

     

     

     

    客户端测试程序,VC7控制台程序。

    #include "stdafx.h"

    #include "boost/socket/ip4.hpp"
    #include "boost/socket/socketstream.hpp"
    #include "boost/socket/socket_exception.hpp"
    #include "boost/socket/connector_socket.hpp"


    using namespace boost::socket;


    int _tmain(int argc, _TCHAR* argv[])
    {
     try
     {
      ip4::address addr("127.0.0.1", 3234);

      typedef connector<> connector_t;
      typedef connector_t::data_connection_t data_connection_t;

      connector_t connector;
      data_connection_t socket;
      connector.connect(socket, ip4::tcp_protocol(), addr);
      basic_socket_stream s(socket);
      s << "Hello! Hello!Hello!Hello! Hello!" << std::endl;  
      std::string response;
      std::getline(s, response);
      std::cout << response;
      socket.close();
     }
     catch (const socket_exception& s)
     {
      std::cerr << s.message() << std::endl;
     }

     return 0;
    }

     

     

     

    /*************************************************************************************************************************

    服务器端测试程序,VC7控制台程序(从sandboxexamplecopy来的,原来的似乎有些小问题,改了一点点)。

    **************************************************************************************************************************/

     

    #include "stdafx.h"
    #include "ssteam.h"


    #include "boost/socket/ip4.hpp"
    #include "boost/socket/socketstream.hpp"
    #include "boost/socket/acceptor_socket.hpp"
    #include "boost/socket/socket_set.hpp"
    #include "boost/socket/address_info.hpp"
    #include "boost/lexical_cast.hpp"

    #include "boost/shared_ptr.hpp"
    #include "boost/bind.hpp"

     

    #include "map"
    #include "algorithm"
    #include "vector"

    //#include "boost/test/unit_test.hpp"

     

    using namespace boost::socket;

     

    typedef boost::shared_ptr > SocketPtr;
    typedef std::map Clients;

    struct socket_equal
     : public std::binary_function socket_base<>::socket_t,
     bool>
    {
     bool operator()(const Clients::value_type& p,
      socket_base<>::socket_t s) const
     {
      return p.first->socket()==s;
     }
    };

    void server_test()
    {
     try
     {
      std::cout<<"starting"<

      Clients clients;

      ip4::address addr;
      addr.port(3234);
      addr.ip("127.0.0.1");

      ip4::tcp_protocol protocol;

      option::non_blocking non_block(false);

      typedef acceptor_socket<> acceptor_socket_t;
      typedef acceptor_socket_t::data_connection_t data_connection_t;

      acceptor_socket_t listening_socket;
      listening_socket.open(protocol,addr,6);

      boost::socket::socket_set master_set;
      master_set.insert(listening_socket.socket());

      while (true)
      {
       boost::socket::socket_set active_set;
       active_set=master_set;

       std::cout<<"Selecting"<

       if (select(active_set.width(),
        active_set.fdset(),
        0,
        0,
        0)==-1)
       {
        throw "unexpected select result";
       }

       const boost::socket::socket_set::iterator
        i_end=active_set.end();

       for (boost::socket::socket_set::iterator i=active_set.begin();
        i!=i_end; ++i)
       {
        if (*i==listening_socket.socket())
        {
         //! this is our acceptor socket
         while (true)
         {
          ip4::address client;
          SocketPtr accepted_socket(new data_connection_t);
          int ret=listening_socket.accept(*accepted_socket,client);
          if (ret==Success)
          {
           accepted_socket->ioctl(non_block);
           master_set.insert(accepted_socket->socket());
           std::cout << "Accepted client " << client.ip()
            << ":" << client.port()
            << std::endl;
           std::string port;//=boost::lexical_cast(client.port());
           std::stringstream ss;
           ss<       port=ss.str();

           address_info_list addr_info(
            client.ip().c_str(),
            port.c_str(),
            address_info_list::canonname);
           address_info_list::iterator iend=addr_info.end();
           for (address_info_list::iterator i=addr_info.begin();
            i!=iend; ++i)
            std::cout << i->hostname() << std::endl;

           std::cout << accepted_socket->socket() <       clients.insert(std::make_pair(accepted_socket, client));

          }
          else
           break;
         }
        }
        else
        {
         // these are our data socket
         std::cout<<"Receiving data"<

         std::string str;

         Clients::iterator client=
          std::find_if( clients.begin(), clients.end(),
          boost::bind(socket_equal(),_1,*i));

         ip4::address& client_addr=client->second;
         std::cout << client_addr.to_string();
         boost::socket::basic_socket_stream ss(*client->first);

         while (!ss.eof() && !ss.fail())
         {
          ss >> str;
          ss <<"server: i have recieved your hello!"<      if (!ss.fail())
           std::cout<     }
         if (!client->first->is_open())
          std::cout<<"Socket closed"<

         if (ss.eof())
         {
          // reading from socket should have forced it closed
          master_set.erase(*i);
          clients.erase(client);
         }
        }
       }

      }
     }
     catch (const socket_exception& e)
     {
      std::cerr << e.message()<< std::endl;
      throw;
     }
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
     server_test();
     return 0;
    }

    发表于 @ 2004年08月25日 15:58:00|评论(loading...)|编辑

    旧一篇: 翻译TIPatterns--系统解耦(System decoupling)

    评论

    #crazybit 发表于2004-08-25 17:55:00  IP: 210.76.108.*
    ACE更好啊。
    #lxwde 发表于2004-08-25 18:33:00  IP: 165.170.128.*
    ACE太庞大了,细节也太多。还有一点,感觉boost的socket大量借鉴了ACE,好像也都是acceptor,connector。
    #lippman 发表于2004-08-27 14:46:00  IP: 218.2.149.*
    看起来似乎还不错,不过感觉封装的层次比较低,不像ACE有很多高层框架
    #stroustrup 发表于2004-08-27 15:45:00  IP: 165.170.128.*
    这个库还没写完,只是勉强能够编译通过。几乎把ACE好的概念都借过来了。
    #周星星 发表于2004-08-28 12:22:00  IP: 211.239.74.*
    哈哈,好啊,顶!
    #晕了 发表于2005-01-06 10:17:00  IP: 219.159.69.*
    我还花时间自己封装了一个pstream类呢。
    这下看来用不上了。
    #roger_77 发表于2007-03-23 23:14:25  IP: 222.70.188.*
    可惜,
    这个库被boost放弃了,加入另一个ASIO的网络类库
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © lxwde