找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3409|回复: 2

关于类结构的一点疑问

[复制链接]
发表于 2008-1-7 21:01:43 | 显示全部楼层 |阅读模式
VOL 1中对c socket api函数做了归类(3类):
1.connector 2.acceptor 3.数据操作类(stream)
但ACE的类结构如下:
1.ACE_SOCK_Connector
2.ACE_IPC_SAP<----ACE_SOCK<----ACE_SOCK_Acceptor
3.ACE_IPC_SAP<----ACE_SOCK<----ACE_SOCK_IO<----ACE_SOCK_Stream
为何ACE_SOCK_Connector不从ACE_SOCK派生?不知道为何这样设计?
另外:看一下vol 1第3章的安排
3.2 ACE_Addr和ACE_INET_Addr
3.3 ACE_IPC_SAP
3.4 ACE_SOCK
3.5 ACE_SOCK_Connector
3.6 ACE_SOCK_IO和ACE_SOCK_Stream
3.7 ACE_SOCK_Acceptor
有点不太合理,为何把ACE_SOCK_connector放在ACE_SOCK后面讲?并不是ACE_SOCK的子类,就是个工厂嘛,该和acceptor一起讲。
[此贴
 楼主| 发表于 2008-1-7 21:01:53 | 显示全部楼层
您的疑惑要回答到实质上,我想比较困难.我的想法仅当抛砖引玉吧

ACE_SOCK_Acceptor和ACE_SOCK_Connector都是作为"工厂类",它的设计的核心

功能是要create 什么东东,这里主要是date mode的Stream,无论它在作为主动端

的Connector 还是作为被动端的Acceptor.

因此,不让ACE_SOCK_Connector从ACE_SOCK派生,是很好理解的,使它们的关系从

强耦合继承关系改为弱耦合的依赖关系,感觉要好得多.Connector也没有复用

ACE_SOCK的任何方法,也没有必要从ACE_SOCK派生.

需要说的是,ACE_SOCK_Acceptor为什么要从ACE_SOCK派生呢?

从socket API来看,服务端要侦听连接,建立的过程是

创建socket (socket())-->绑定端口(bind())-->侦听(listen())

最后到响应客户端请求时 (accept())时,创建新的socket.

因此,ACE_SOCK_Acceptor需要有"自己的socket",于是,需要从

ACE_SOCK派生作为封装.

这一点,从ACE源代码中也有说明


/**
* @class ACE_SOCK_Acceptor
*
* @brief Defines a factory that creates new <ACE_Stream>s passively.
*
* The ACE_SOCK_Acceptor has its own "passive-mode" socket.
* This serves as a factory to create so-called "data-mode"
* sockets, which are what the ACE_SOCK_Stream encapsulates.
* Therefore, by inheriting from ACE_SOCK, ACE_SOCK_Acceptor
* gets its very own socket.
*/
 楼主| 发表于 2008-1-7 21:02:00 | 显示全部楼层
感觉connector和acceptor的区别在于,acceptor要创建多个peer socket,再用这些peer socket创建sock_stream
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 07:22 , Processed in 0.016154 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表