如果你用C++以bind、listen、accept做了很长时间的网络应用开发,看到ACE的对socket的封装,你一定被它深深吸引,除非你是一个严格流程化的人,从来没有在bing、listen、accept的过程中碰到过任何苦恼。 接触ACE很长一段时间后也没有用心的去思考它,直到细致的看了一遍ACE的这个facade,我觉得我有必要研究一下ACE这个老新朋友了。 1.ACE_INET_Addr 我得承认,熟悉了ACE这套东西,我甚至都不愿意去想SOCKADDR那套东西,强制类型转换和太多的细节让我止步。从功能上来说,ACE_INET_Addr替代了SOCKADDR。 ACE_Addr是ACE里各种地址的基类,子类有ACE_INET_Addr和ACE_FILE_Addr以及其他几个地址类。具体可参看ACE在线文档。 2.ACE_SOCK c里边的sock可以接受数据,也可以监听,还可以是连接,在统一程序中不同的sock只得以变量名区别,任何一次失误都会造成问题,而编译器不能帮你任何事情。ACE依照功能对sock进行了封装,这样编译器可以对误用的sock在编译阶段给于检查。 ACE_SOCK继承于ACE_IPC_SAP,根据功能,ACE_SOCK_Acceptor、ACE_SOCK_IO继承于ACE_SOCK, 而ACE_SOCK_IO又有ACE_SOCK_Stream的继承。而ACE_SOCK_Connector和其他几个类的关系比较小。 一切都和以前网络编程一样,只是使用这些少了很多烦琐的事情。一个简单的使用ACE的服务可能是这样的:
请注意这里的init和finit,对于ACE新手而言,看了一大堆东西写一个可以成功的应用程序可能对信心有极大的提升作用,可是很少有人告诉你这对函数,如果没有它们,这成了对信心的一次巨大打击,你的程序无法正确运行,而你未得到任何错误提示。 init和finit宛如以前我们使用的wsastartup和wsacleanup一样,你不需要对init和finit了解太多,记得引入它们帮你初始化就可以了。对于新手而言,我敢保证,这是你的第一个ace程序无法正确运行的极大杀手。 (win2ks) |