• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Creative Commons License
            本Blog采用 知識共享署名-非商業性使用-禁止演繹 3.0 Unported許可協議 進行許可。 —— Fox <游戲人生>

            游戲人生

            游戲人生 != ( 人生 == 游戲 )
            站點遷移至:http://www.yulefox.com。請訂閱本博的朋友將RSS修改為http://feeds.feedburner.com/yulefox
            posts - 62, comments - 508, trackbacks - 0, articles - 7

            ACE: Socket封裝(01)

            Posted on 2009-09-01 14:22 Fox 閱讀(3893) 評論(3)  編輯 收藏 引用 所屬分類: T技術碎語

            本文同步自游戲人生

            o *__ 序 __* o

            在閱讀ACE代碼和C++NPv1, v2, APG的時候,我意識到一個問題:雖然稍有C++和網絡基礎的同學都可以讀懂ACE,但如果你對OS(五大管理模塊都包含在內)、TCP/IP、C++、Design Patterns了解越多,你就越能體會ACE為什么需要這么龐雜,雖然它不夠完美(但至少我還沒有資格來批評這一點,我現在最常想做的一個動作就是五體投地)。

            而且我隱約感覺到,我現在所寫的很多東西在以后(對于有些人或許就是現在)看來會相當不深刻、相當不嚴謹,但對于一段學習歷程,這個過程是必然的、必需的。

            在C++NPv1中,Douglas C. Schmidt把原始socket及其API的缺陷有些妖魔化了,比如一段加上注釋、空行在內的35行的代碼,被指出有10處錯誤之多。這就像很多其他語言的倡導者或反傳統C/C++指針者在批評指針時的說法一樣。長期使用原始socket和指針的同學對此感覺很不舒服,何況socket API提供了大量錯誤檢測的接口,至多是不夠友好罷了。你好就好了,沒必要抓住別人一頓痛批吧,『本是同根生,相煎何太急』。

            雖然Solaris、Linux的很多版本及Windows對起源于Berkeley的socket API進行了重寫,但不可否認,由于歷史原因和POSIX標準的存在,對于使用者而言,我們可以無視這些API的實現差異。只是一旦我們從socket通信擴展到其他IPC通信的話,就需要正視各種I/O細節的差異了。

            由于UNIX中,對于socket, file, pipe, device的大多數操作,描述符都是通用的(這一點,OS上面講的更清楚些)。而Windows中,句柄大多不能互換(socket對于MS來說是舶來品)。系統和標準的不一致導致地址、協議和API的混雜甚至混亂。

            UNIX下的描述符和Windows的句柄可以看作是同一個概念,只是應用環境不一樣,所描述的內容也時常不一樣,再簡單了說,它們都是一個整型的ID。

            ACE的源碼中使用了大量預處理指令,尤其在跨平臺/編譯環境的部分更加明顯。鑒于C/C++標準的博大胸懷,有些指令需要閱讀相關編譯器提供的幫助文檔:

            o #pragma: GCC, MSVC

            o #define (#, #@, ##) : GCC, MSVC

            其中有若干代碼文件以.inl為后綴,里面是對部分函數的內聯實現,以使代碼結構看上去更加簡潔。如果確定使用內聯函數的話,*.inl將被包含于*.h的最后,如果不使用,則像*.h一樣,包含于*.cpp的頭部。

            ACE采用doxygen輸出文檔,在閱讀代碼注釋時能夠感受到差異,但基本不會影響閱讀。

            o * __ 關于第3章(C++NPv1)__ * o

            ACE抽象的地址類ACE_Addr擁有ACE_DEV_Addr, ACE_FILE_Addr, ACE_INET_Addr, ACE_SPIPE_Addr, ACE_UNIX_Addr五個子類。對于狹義上的網絡通信(TCP/IP)而言,ACE_INET_Addr對應于我們熟悉的sockaddr_in。

            ACE_IPC_SAP是IPC(interprocess communication)I/O操作類的root類。

            從編碼的角度看,這個類漂亮的地方在于示例了抽象類的另一種實現方式。

            一提到抽象類,大多數人的第一反應是pure virtual function。當一個基類確定需要使用virtual function時,這是一個不錯的選擇。但我們都知道虛擬函數有開銷。而且對于一個結構簡單的抽象基類和其繼承子類(尤其是大量使用時),一個虛函數表帶來的開銷會讓整個設計顯得十分蹩腳。

            我們都知道如何強制讓一個類無法使用default constructor(protected)。如果對基類使用該方法,僅使子類具有public的default constructor,這就達到了定義抽象基類的效果。

            virtual destructor的意義在于防止delete父類指針(指向子類對象)時未調用子類destructor。在此例中,為避免這種情況,同樣將destructor聲明為protected即可。

            從設計實現的角度看,相較于socket API,ACE_IPC_SAP的子類ACE_SOCK提供了編譯時對句柄合法性的檢測。

            從邏輯功能層面劃分,socket有三種角色:

            o active connection role (connector):主動連接

            o passive connection role (acceptor):被動連接

            o communication role (stream):數據通信

            但socket API畢竟不是OOD出來的,對于一個socket描述符,也完全沒有必要去限制其擔負的功能,更不可能搞成三種不同的socket。而OOD的ACE則可以輕易實現對socket對象及其操作的封裝。

            工廠類ACE_SOCK_Connector是一個主動創建通信端的工廠類。socket API中的connect接口只是為一個socket建立與其它peer的網絡連接,而不產生新的socket實例,也不依賴于任何其它socket。同樣,ACE_SOCK_Connector只是為一個ACE_SOCK_Stream對象(對用于數據通信的socket的封裝)連接到ACE_Addr(對struct sockaddr的封裝)提供接口,也不含對ACE_SOCK_Stream對象的其它操作。

            工廠類ACE_SOCK_Acceptor是一個被動創建通信端的工廠類。當監聽到新的網絡連接后,為該連接初始化一個ACE_SOCK_Stream對象。和connector不同的是,acceptor依賴于一個已經存在的充當監聽功能的socket句柄(ACE_SOCK),因此,ACE_SOCK_Acceptor是ACE_SOCK的一個子類。

            ACE_SOCK_Stream是只負有通信傳輸功能的socket,對應connection-oriented的TCP通信格式stream,和UDP的CE_SOCK_CODgram相呼應。ACE_SOCK_Stream只是socket的通信載體,在兩個工廠ACE_SOCK_Connector和ACE_SOCK_Acceptor中初始化。這樣一個類除支持最基本的數據發送(send)和接收(recv)和阻塞(blocking)、非阻塞(nonblocking)及定時(timed)的I/O模式外,還支持分散讀取(scatter-read)和集中寫入(gather-write)。

            對于一個簡單的『網絡課程作業:寫一個有連接的IM小程序』,上面這些內容已經足夠了。當然即使使用對應的幾個socket API也已經足夠了。但我們顯然更加關心如此龐大的一個庫,是如何解決復雜的網絡應用的,我尤其關心的是多線程并發如何更好的處理。

            所以,我準備跑到第8、9章了。

            Feedback

            # re: ACE: Socket封裝(01)  回復  更多評論   

            2009-09-01 16:10 by 99書城
            很好啊~~

            # re: ACE: Socket封裝(01)  回復  更多評論   

            2009-09-01 17:15 by yleesun
            不錯,很真實

            # re: ACE: Socket封裝(01)  回復  更多評論   

            2012-08-17 22:14 by swiss replica watches
            清爽的很
            精品久久久无码人妻中文字幕豆芽| 日韩电影久久久被窝网| 久久99热这里只有精品66| 久久se精品一区二区影院 | 久久国产精品久久久| aaa级精品久久久国产片| 亚洲成人精品久久| 国产精品久久久久久久久久影院 | 久久久久久久波多野结衣高潮| 久久精品国产亚洲AV蜜臀色欲| 国产亚洲精品自在久久| 久久久久国产视频电影| 亚洲va中文字幕无码久久| 91久久精品国产91性色也| 久久综合久久综合亚洲| 国产—久久香蕉国产线看观看| 久久久久久免费视频| 18岁日韩内射颜射午夜久久成人| 欧美精品乱码99久久蜜桃| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 人人狠狠综合久久亚洲| 精品综合久久久久久888蜜芽| 久久久精品国产Sm最大网站| 久久久精品国产sm调教网站| 婷婷久久综合九色综合绿巨人| 久久国产乱子精品免费女| 久久精品99久久香蕉国产色戒 | 久久本道久久综合伊人| 久久久一本精品99久久精品66 | 久久亚洲2019中文字幕| 久久精品国产久精国产| 囯产极品美女高潮无套久久久| 久久久久亚洲精品无码网址 | 少妇久久久久久被弄到高潮 | 国产2021久久精品| 精品久久久久香蕉网| 色诱久久久久综合网ywww| 久久亚洲日韩看片无码| 狠狠色丁香久久婷婷综合_中| 亚洲精品成人久久久| 国产精品久久久久蜜芽|