分类:
2008-10-13 16:10:40
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
typedef basic_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
typedef basic_acceptor
还有一个Selector,当须要管理大量套接字,但效率不是很严格的时候,使用Selector可以带来一些好处。另外就是一些辅助类和内部实现类,这里就不列出了。
和用户调用有关的类结构还是比较简单,我用basic_datagram_socket来解释一下。第一个模板参数:IOModel决定调用者是用同步还是异步IO;第二个模板参数:ErrorHandler决定当产生运行错误时,调用者要库返回错误码还是异常。
typedef basic_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
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平台开发(但已经考虑了多平台支持),开发完了,测试稳定了,我就发布源码和文档,让大家帮忙改进。