
ACE
win2ks
这个作者很懒,什么都没留下…
展开
-
ACE_IPC_SAP的封装
对int_addr的封装是为了避免细节使用上的问题,那对ipc_sap的封装则是为了避免功能上的使用问题。 一个sock可以充当3个角色:监听者、连接者和数据传递者。你可能在一个需要监听者的地方传递了数据传递者,编译器不会给你任何提示,这是让我们无法容忍的,我们要创建一个规则阻止这样的行为,让他们是不同的类型就可以了,我们在这方面已经很有经验了。由此我们对封装有了两点经验:1.当细节太原创 2007-09-21 16:55:00 · 1609 阅读 · 0 评论 -
对ACE select的考虑
我在前面的代码里已经展示了使用传统select方式开发并发程序的简单流程和它的便利性。但是,和传统的CApis一样,它也有不方便和不安全的地方。首先fd_set是一个结构,靠着几个外部方法调整内部数据,撇去记忆上的压力,在操作过程中取址、memcpy(我排斥这个方法因为它给我带来很多不易发觉的问题)、轮询等都容易出错,尽管有些编译器可以帮我们诊断问题,但是C++程序员一定想要一个好的封装,这便原创 2007-09-27 16:51:00 · 2867 阅读 · 0 评论 -
ACE封装——使用继承提高设计清晰和可扩性
做过网络编程的人都知道sockaddr这个东西,其实最初的时候我也无法理解,为什么要强转指针又传递sizeof这个东西呢。其实这是C的继承,unix和internet领域有不同的sockaddr形式,sockaddr是逻辑上的基类,通过不同的sizeof可以获得正确的类型信息然后转型。这真是太不好了。如果你使用的代码中有这样良好的设计但是没有良好的代码形式,那你表现的时候到了,简单的一个C原创 2007-09-29 13:28:00 · 809 阅读 · 0 评论 -
socket select
如果你不喜欢或者不能让socket阻塞工作,那可以如下改进:1.使用非阻塞然后自己去查询EWOULDBLOCK, 2.使用select模型,3.使用多线程。 当然,windows下有更多选择WM异步甚至完成端口。 我以前也贴过select的代码,但是还是每次看到它都想说点什么,大概是真的不常用加上我觉得很多人会对他有神秘感而想体验一下而遇到问题得原因吧。 se原创 2008-02-11 05:08:00 · 1136 阅读 · 0 评论 -
winsock select的限制和非常规用法
1.winsock select最多处理64个socket限制 第108行进行了如下定义:#ifndef FD_SETSIZE#define FD_SETSIZE 64#endif /* FD_SETSIZE */意思非常明显,也就是说winsock最多处理64个sock,其实这很好理解,select是用位操作(linux下sys/socket部分代码我也没找到原创 2008-02-12 01:51:00 · 2333 阅读 · 0 评论 -
主流同步锁模式
优秀的模式具有通用性,因为它本书就是经验、优点的提炼、升华。 线程同步最大的问题是死锁问题,而白痴级的死锁是加锁后忘了释放或由于某种未考虑到的条件发生而导致无法释放。 类的构造函数、析构函数机制与C++栈上变量的生存法则结合,给了C++程序员无线的遐想(在这个基础上衍生出来的种种技巧到底是天使还是恶魔,我不去多想)。 ATL里主流CriticalSection封装类有两个,一原创 2008-07-03 23:30:00 · 980 阅读 · 0 评论 -
从应用层次探讨Reactor
操作系统已经提供了Reactor机制,核心表现是select方法。ACE的Reactor其实是对类select的操作系统方法的封装。 我这里都使用select方法举例讨论。 使用select方法,需要把socket压入FD_SET,使用select方法获取一次事件。在这个过程中,我们针对特定的事件进行反映,因此称为reactor。 ACE使用面对对象的思想对reactor进行了封原创 2008-07-05 00:05:00 · 1407 阅读 · 1 评论 -
闲侃完成端口
ACE是个好东东,可是真正用的时候,我还是忍不住重新造车轮。做网络层的时候,考虑了一下还是自己做吧(并不是我觉得ACE不好或不方便,只是因为自己ACE不精,怕乱舞伤了自己)。 从好多方面来说,我都是c++的铁杆,自己给自己的评价是对c++有较深入的认识。不过因为闲时太喜欢做coding游戏,为了节省时间快速见效,投奔锐利c(c#,嘿嘿)了。扯远了,当用c#造车轮的时候,我想到了尽可能使用原创 2008-06-18 00:37:00 · 1023 阅读 · 0 评论 -
GetQueuedCompletionStatus一直阻塞
使用WSASend或WSARecv投递相应的发送或接收请求后,始终没有收到相应返回通知,或者另外一个问题,在使用完成端口时,GetQueuedCompletionStatus一直阻塞,这都是由WSARecv或WSASend函数的调用参数未初始化造成的。 已经有好几次碰到这个问题了,出现问题调试出来才又一次的感觉到事情的严重性。要养成初始化参数的好习惯。原创 2008-06-18 01:45:00 · 4532 阅读 · 1 评论 -
完成端口cookbook
在服务器开发上虚度日月久矣,每次新的开发都要重新写一遍netlayer,厌烦了这种事情想做一个类库给自己的时候,一直使用完成端口做网络层没有错,但是不去深刻理解完成端口的本质就不对了,而且在该使用这个强力工具的时候没有想起使用却是大大的错了。 cookbook只讲step by step创建一个完成端口模块(网络)。 意识到线程切换的巨大代价,NT小组开发了完成端口这个内核级的东西原创 2008-06-18 14:26:00 · 1180 阅读 · 0 评论 -
使用完成端口框架开发异步模块
完成端口模型可以让我们基于传递overlapped数据的思想分解异步操作,让操作系统帮我们做线程间的数据传递。基于这个思想,可以把bsdsocket改造成异步模型,尽管这样做效率上意义不大,但对于想模拟ms完成端口都网络模型的人来说,可以小圆梦想了。static HANDLE g_hiocp;static DWORD WINAPI worker(LPVOID pvd);原创 2008-06-18 15:01:00 · 1076 阅读 · 0 评论 -
ACE封装——尽可能多的隐藏平台间的差异
ACE是个跨平台的东西,所以着力点之一就是为不同平台提供同样一个接口,但这永远都只是一个美好的梦想,试想一下,linux下无线程这个东西,windows用户对信号量这个东西也颇为陌生。提供统一接口最大的挑战是有些东西有些平台支持,而另外一些平台没有。为了接口的统一,最好不提供这些功能的封装,但是有时候,这些特定平台适用的东西在它们的平台上效率很高,有时候尽管一些平台没有对某种功能的支持,但是从原创 2007-09-29 20:19:00 · 772 阅读 · 0 评论 -
ACE封装——简化常见形式
在以往的文章中,我常提起聚合封装或者类似的词汇,其实这都是ace简化常见形式范畴中的将多个方法合并成一个方法。这尤其适用很多细节又容易落下的时候。第一次接触初始化一个监听连接的soket恐怕会费一些记忆,二者这个流程一般是固定的,这最适合封装成一个方法供使用,因为这只是一个facade,这是非常显然的facade模式。创建一个线程的参数也是需要一定记忆的,而多数时候我们实用的是特定的一个参原创 2007-09-29 12:16:00 · 1183 阅读 · 0 评论 -
ace init and fini
在Init_ACE.cpp中有对ace init和fini方法的定义,对于init而言,它是:++ACE::init_fini_count_;ACE_Object_Manager::instance ()->init ();fini则做对于的清理工作:if (ACE::init_fini_count_ > 0) ...{ if (--ACE::init_fini_原创 2007-10-23 14:32:00 · 1490 阅读 · 0 评论 -
再论ACE_INET_Addr看封装
SOCKADDR本身是C的一个结构,C已经对它进行了封装,可惜使用的时候你要操作一大堆细节,这增大了出错率。我们来看SOCKADDR为我们提供了一个什么样的功能。1.它为其他部分提供信息。我们把信息传递给sockaddr,以后传递sockaddr给需要地址信息的部分。2.它提供查询功能别人传递过来的sockaddr你可能要做检查合法性等若干需要获取信息的操作。sockad原创 2007-09-21 16:33:00 · 1457 阅读 · 0 评论 -
ACE_INET_Addr
目录 一、 关于WAP的常见问答二、 关于WML的常见问答三、 关于WAP开发的常见问答四、关于WMLScript的常见问答五、关于WBMP的常见问答六、关于WAP网关的常见问答七、关于WAP浏览器的常见问答八、关于WAP手机的常见问答九、关于WAP安全的常见问答十、关于WAP其他方面问答十一、关于WAP站点建设原创 2007-09-21 15:25:00 · 7658 阅读 · 1 评论 -
广义factory
工厂生产一种产品,其实new也是一个工厂,GoF里还对工厂有更细的划分,但是,这给人的感觉是工厂是从无到有的,其实不是这样,工厂也可以从有到有。new是一个工厂,它生成的是初级产品。对于一个初级产品来说,你可能想让它个性化,譬如每个学生都有自己的名字,学生都一样,但是用学生产生带名字的学生的过程也是一次工厂作用。ACE_SOCK_Acceptor和ACE_SOCK_Connector就是原创 2007-09-21 17:17:00 · 830 阅读 · 0 评论 -
ACE Socket Wrapper Facade
如果你用C++以bind、listen、accept做了很长时间的网络应用开发,看到ACE的对socket的封装,你一定被它深深吸引,除非你是一个严格流程化的人,从来没有在bing、listen、accept的过程中碰到过任何苦恼。接触ACE很长一段时间后也没有用心的去思考它,直到细致的看了一遍ACE的这个facade,我觉得我有必要研究一下ACE这个老新朋友了。1.ACE_INET_Ad原创 2007-09-21 13:36:00 · 1960 阅读 · 1 评论 -
ACE_Message_Block
ACE_Message_Block是ACE非常底层和常用的一个类,但是对它的掌握却不是很容易的事情,我想大多数是因为它很多的方法和它的名字。其实,把它叫做ACE_Memory_Block可能会让人好理解很多,它就是一块内存,你对内存操作要有指针指示当前位置,它的rd_ptr和wr_ptr就是这个功能。内存块可以连接、复制、求长度、获取缓冲大小等。用内存块的思想理解这个类的所有方法对事情会变的简单很原创 2007-09-21 13:51:00 · 1340 阅读 · 2 评论 -
socket select代码
做多了windows,发现多select模式是那么的陌生,当想用心挖掘一下ACE::select的封装的时候,才发现自己几乎写不出一个完整的select模式示例,这其实是我一直没有重视过这个东西,现在细细分析来,发现,它要比我以往在处理类似问题的时候处理的更为简单。 WSAData wd; WSAStartup(MAKEWORD(2,2),&wd); SOCKET原创 2007-09-27 14:46:00 · 1806 阅读 · 0 评论 -
ACE_Thread_Manager
ace是对若干东西的封装,所以从看问题本质的角度来说,了解ACE先要熟悉被它封装的东西。thread管理也是如此。开辟一个线程在不同的系统上有不同的方法,而且这个线程的代价也不尽一样,但是肯定有些东西是共性的,就譬如ACE做thead_manager的接口的时候定义的那些参数一样,往常复杂不易使用的步骤组合被ACE加以封装。其实直到目前为止我也一直认为thread manager是为了ac原创 2007-09-27 18:03:00 · 3814 阅读 · 6 评论 -
ACE封装——增强类型安全性
从第一篇开始我就在讨论ace的封装,不同场合使用的同一物件封装成不同类型是提的比较多的一点。这集中提现在socket上,一个socket可以是监听连接的,可以是已经连接用以发送数据的,如果你还愿意划分,它还可以是连往其他位置的状态,这就会引发错误使用,譬如在接受连接的socket上发送数据或者用一个正在发送数据的socket连接远端,为了一次性的解决掉这个问题,ACE使用了增强类型安全性这个法则。原创 2007-09-29 11:42:00 · 1097 阅读 · 0 评论 -
ACE封装——针对效率实施优化
避免使用虚函数和动态内存。 我在前一篇里提到,ace有的时候避免使用bridge模式,这是因为动态内存的分配会降低效率,同时,为了消除动态类型对效率的影响,ace的wrapper facade避免使用虚方法。多考虑使用内联函数。ace wrapper多是对c函数的封装,为了避免封装降低效率,ace在关键路径上使用内联函数(另外,在性能关键位置避免使用虚函数)。没有异常处理。其实原创 2007-09-29 20:32:00 · 812 阅读 · 0 评论 -
ACE_Message_Block和ACE_Data_Block
感谢ydogg的提醒,刚才又看了Message_Block的代码和ACE文档,看来,我对ACE_Message_Block的理解还仅限于ACE_Data_Block的程度。一直以来我的工作在误导我对Message这个词的理解,我一直把Message当成一块内存使用,所以当我使用ACE_Message_Block的时候,我只是把它当成普通的经过包装的内存块而已,所以更多的时候我没有去关心ACE_原创 2007-10-20 19:14:00 · 1974 阅读 · 1 评论 -
ACE_Proactor框架代码简析
这个框架里涉及了ACE_Handler相关继承体系里的几个类,我只是随需查看。1.ACE_Proactor(以及ACE_WIN32_Proactor——the Impl) ACE_Proactor需要桥接ACE_Proactor_Impl,在win32上,这个ACE_Proactor_Impl是完成端口的封装(服务器开发者们眼睛要绿的丷丷),也就是说,win32上的Proactor就原创 2008-07-05 16:09:00 · 4535 阅读 · 1 评论