Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588642
  • 博文数量: 752
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:50:56

1. 设计目标
       目标是易使用,高效率,库本身易扩展,提供有限的Socket功能支持。这套库提供同步和异步IO支持,单独提供Select功能。平台暂时支持Win32和Linux2.6。
        易使用主要是提供简单的接口。比如泛化了IO Model(这里IO Model只用于这套库:同步和异步)。
        高效率体现在使用Generic方法实现各个类,整个库没有涉及到虚函数的开销;为了避免异常的开销,这套库泛化错误处理,根据一个模板参数来决定用'return error code' 还是'throw exception';原本准备泛化IP地址,这样就可以同时支持IP4和IP6,但没有开发IP6程序,所以就暂时不处理这个任务。另外泛化了Socket 的类型。

2. 类结构
        不知道怎么把UML Diagram上传到这里,直接用代码说明。
        class socket_base;
       template
       class basic_socket : public socket_base;
        
        下面和UDP有关的类:
         template
       class basic_datagram_socket : public basic_socket;

        typedef basic_datagram_socket datagram_socket;
        typedef basic_datagram_socket async_datagram_socket;


         下面和TCP有关的类:
          template
        class basic_stream_socket : public basic_socket;

        template
        class basic_acceptor : public basic_stream_socket;
        template
        class basic_connector : public basic_stream_socket;
        template
        class basic_data_stream : public basic_stream_socket;

         typedef basic_acceptor acceptor;
         typedef basic_acceptor async_acceptor;

        还有一个Selector,当须要管理大量套接字,但效率不是很严格的时候,使用Selector可以带来一些好处。另外就是一些辅助类和内部实现类,这里就不列出了。
        和用户调用有关的类结构还是比较简单,我用basic_datagram_socket来解释一下。第一个模板参数:IOModel决定调用者是用同步还是异步IO;第二个模板参数:ErrorHandler决定当产生运行错误时,调用者要库返回错误码还是异常。
        typedef basic_datagram_socket datagram_socket;
        datagram_socket socket;
  
这个UDP socket对象用同步IO处理接收和发送,当产生运行时错误的话,就抛出socket_exception。一般用同步IO,效率不是考虑因素,所以抛出异常的方式处理错误。为了方便用户,这套库就typedef  datagram_socket和async_datagram_socket。请看一下,async_datagram_socket的第二个模板参数,用的是return_error_code,这样程序运行的时候具备更高的效率。

3. 典型的使用过程
        以connector为例,看看怎么样使用这套库。
        typedef argus::socket::basic_connector connector;
        data_stream stream;
        try
        {
                  connector conn;     // There can write so: connector conn('local ip', 'local port');
                  if (conn.connect('10.6.2.1', 8888, stream)) 
                 {  
                          // connect successfully
                  } 
        }
        catch (const argus::socket::socket_exception& e)    
        {
                   .....
         }

         using the stream  implement to send and receive data.

         这里还有一些细节须要进一步处理:主要是IO Model的问题,实现起来有点难度。

4. 后话
       目前这套库正针对Win32平台开发(但已经考虑了多平台支持),开发完了,测试稳定了,我就发布源码和文档,让大家帮忙改进。

        
 



--------------------next---------------------

阅读(250) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~