青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

剖析Etwork網絡庫

Author : Kevin Lynx

從開始接觸網絡編程這個東西開始,我就不間斷地閱讀一些網絡庫(模塊)的源代碼,主要目的是為了獲取別
人在這方面的經驗,編程這東西,還是要多實踐啊。

基本上,Etwork是一個很小巧的網絡庫。Etwork基于select模型,采用我之前說的技巧,理論上可以處理很
多連接(先不說效率)。

先看看下這個庫的結構:

classgraph

如同很多網絡庫一樣,總會有一個類似于ISocketManager的類,用于管理所有網絡連接(當用戶服務器時)。
而ISocket則用于代表一個網絡連接。在其他庫中,ISocketManager對應的可能就是Server,而ISocket對應
的則是Session。

在接口設計上,盡管Etwork寫了很多接口類(看看那些IClass),但是事實上它抽象得并不徹底。只是暴露給
客戶端的代碼很簡潔,而庫本身依然臃腫。不知道為什么,現在我比較喜歡純C這種簡潔的東西,對于OO以及
template,漸漸地有點心累。

在功能實現上,我以TCP服務器為例,CreateEtwork根據傳來的參數建立服務器,在SocketManager::open中
是很常規的socket, bind, listen。當建立了服務器之后,需要在程序主循環里不斷地輪詢狀態,這里主要
調用poll函數完成。

poll函數主體就是調用select。當select成功返回活動的套接字數量后,Etwork依次輪詢讀、寫、錯誤fdset,
將保存的所有網絡連接(就是那些ISocket對象)對應的套接字與fdset中當前的套接字做比較。大致邏輯為:

fd_count = select( 0, readset, writeset, exceptset, &timeout ); 

for( each fd in readset )
    
if( fd is listening fd ) 
        accept 
new connection
    
else
        
for( each socket in all connections )
            
if( fd == socket )
                can read data on 
this socket 

for( each fd in writeset )
 

for( each fd in exceptset )
 


沒什么特別讓人注意的地方(別覺得別人垃圾,耐心讀別人的代碼不是什么壞事)。每一次,當Etwork檢測到
新的連接時,會創建新的ISocket對象,并關聯對應的套接字,然后保存此對象到一個列表中。當poll結束
后,客戶端程序通常會調用accept函數(Etwork中提供的接口),該函數主要是將poll中保存的新的ISocket
對象全部拷貝出去。

在接收、發送網絡數據上,Etwork如同幾乎所有的網絡庫(模塊)一樣,采用了緩沖機制。這里所說的緩沖機
制是,網絡模塊接收到網絡數據時,將數據保存起來,客戶端程序想獲取數據時,實際上就是從這個緩沖中
直接取,而不是從網絡上獲取;同理,發送數據時,客戶端程序將數據提供給網絡模塊,網絡模塊將數據保
存起來,網絡模塊會在另一個時候發送這個緩沖中的數據(對于異步IO的處理畢竟不一樣)。

Etwork關于這個緩沖機制的相關代碼,主要集中在Buffer這個類。與Buffer相關的是一個Message機制。Buffer
維護了一個Message的隊列(deque)。一個Message實際上是一個非常簡單的結構體:

 

struct Message 
{
    unsigned 
short offset_;
    unsigned 
short size_;
}

 

這其實是消息頭,在消息頭后全部是數據。在創建消息時(new_message),Etwork根據客戶端提供的數據創建
足夠大的緩存保存:

 

Message * m = (Message *)::operator new( size + sizeof( Message ) ); 

 

這其實是一個很危險的做法,但是從Etwokr的源碼可以看出來,作者很喜歡玩弄這個技巧。與Buffer具體相
關的接口包括:get_data, put_data, get_message, put_message。Buffer內部維護的數據都是以Message
的形式組織。但是,對于外部而言,卻依然是raw data,也就是諸如char*之類的數據。幾個相關函數大致
上的操作為:獲取指定尺寸的消息(可能包含多個消息),將一段數據加入Buffer并以消息的形式組織(可能會
創建多個消息),將一個消息以raw data的形式輸出,將raw data以一個消息的形式加入到Buffer。

一般情況下,Etwork的poll操作,會將套接字上的數據接收并put_data到緩沖中;發送數據時則get_data。
客戶端要從緩沖中獲取數據時,就調用get_message;發送數據時就put_message。

Etwork中還有一個比較有趣的東西:marshaller。這個東西主要就是提供將C++中各種數據類型的變量進行字
節編碼,也就是將int long struct之類的東西轉換為unsigned char,從而方便直接往網絡上發送。

基本上,Buffer和marshaller可以說是一個網絡庫(模塊)的必要部件,你可以在不同的網絡庫中看到類似的
東西。

Etwork在網絡事件的處理上,除了上面的輪詢外,還支持回調機制。這主要是通過INotify,以及給各個ISocket
注冊Notify對象實現。沒什么難度,基本上就是observer模式的簡單實現。

其他東西就沒什么好說的了,縱觀一下,Etwork實現得還是比較典型的,可以作為開發網絡庫的一個簡單例子。

posted on 2008-05-21 21:06 Kevin Lynx 閱讀(7017) 評論(5)  編輯 收藏 引用 所屬分類: network

評論

# re: 剖析Etwork網絡庫 2008-05-21 21:52 空明流轉

做面向對象大抵就是兩個極端,一個是回歸過程化的抽象,一個就是純面向對象。

不過感覺這個傾向是跟你長期從事的領域有關。  回復  更多評論   

# re: 剖析Etwork網絡庫 2008-05-21 23:04 eXile

我也是越來越不喜歡C++了,目前比較傾向于純C或Python。
對于純C的網絡庫,可以試試 libevent 或 libev, 應該算是比較好的庫了。  回復  更多評論   

# re: 剖析Etwork網絡庫 2008-05-22 10:42 關中刀客

很多時候底層還是自己寫比較的好~~~  回復  更多評論   

# re: 剖析Etwork網絡庫 2008-05-22 17:56 bugs_killer

ACE設計得就很好啊..我基于ACE裁剪過一個輕型的通信庫.
http://code.google.com/p/netdkit/

自我感覺很好啊.  回復  更多評論   

# re: 剖析Etwork網絡庫 2009-09-29 10:47 libev

libev是網絡庫?@eXile
  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧洲一区二区三区在线观看| 亚洲欧美日韩在线观看a三区| 亚洲视频久久| 亚洲精品免费在线| 99视频+国产日韩欧美| 日韩视频精品在线观看| 亚洲三级免费观看| 中文无字幕一区二区三区| 亚洲线精品一区二区三区八戒| 国产精品99久久久久久白浆小说| 亚洲一区二区三区在线视频| 先锋影音网一区二区| 欧美在线免费观看视频| 久久久久久久久久久一区| 免费在线欧美视频| 欧美激情视频一区二区三区在线播放 | 亚洲国产精品一区二区三区| 91久久精品国产91久久性色tv | 久久天天躁狠狠躁夜夜爽蜜月| 鲁鲁狠狠狠7777一区二区| 亚洲国产欧美一区二区三区丁香婷| 免费视频亚洲| 99视频精品在线| 欧美一区二区精品| 欧美日韩国产色视频| 国产日韩欧美综合精品| 亚洲精品免费看| 久久久国产一区二区| 91久久国产综合久久91精品网站| 亚洲尤物在线视频观看| 美女国产一区| 国产一区二区三区成人欧美日韩在线观看| 亚洲国内在线| 久久久91精品国产| 日韩特黄影片| 欧美va天堂在线| 狠狠狠色丁香婷婷综合激情| 亚洲欧美精品在线观看| 亚洲精品中文字| 免费欧美电影| 在线观看视频亚洲| 欧美在线网址| 一区二区三区**美女毛片| 麻豆九一精品爱看视频在线观看免费 | 午夜国产精品视频| 欧美色另类天堂2015| 亚洲日本aⅴ片在线观看香蕉| 国产欧美日韩在线| 亚洲最新合集| 老牛影视一区二区三区| 亚洲女优在线| 国产精品超碰97尤物18| 99riav久久精品riav| 欧美fxxxxxx另类| 欧美一区二区观看视频| 国产欧美日韩精品丝袜高跟鞋| 在线一区二区日韩| 亚洲麻豆视频| 欧美日本中文| 一区二区三区视频在线| 亚洲精品乱码久久久久久蜜桃91| 欧美a级理论片| 亚洲欧洲一区二区三区| 欧美激情五月| 欧美凹凸一区二区三区视频| 亚洲电影免费观看高清完整版| 久久躁狠狠躁夜夜爽| 久久超碰97中文字幕| 国产字幕视频一区二区| 久久久亚洲成人| 久久久水蜜桃av免费网站| 尤物99国产成人精品视频| 蜜桃久久av一区| 欧美国产日韩二区| 亚洲色图制服丝袜| 亚洲视频导航| 国产亚洲欧美另类中文| 久久久久久久波多野高潮日日 | 午夜亚洲伦理| 精品动漫3d一区二区三区免费版| 久久综合网络一区二区| 另类亚洲自拍| 一区二区三欧美| 亚洲午夜未删减在线观看| 国产午夜精品理论片a级大结局| 久久国产福利| 免费在线成人av| 亚洲免费网址| 久久久99免费视频| 一区二区三区偷拍| 久久国产精品电影| 一本色道久久综合亚洲精品不卡 | 国产亚洲成av人片在线观看桃| 老司机凹凸av亚洲导航| 欧美激情精品久久久久久久变态| 午夜精品久久久久久久99水蜜桃 | 夜夜嗨av一区二区三区网站四季av | 亚洲精品乱码视频| 午夜一区二区三视频在线观看| 亚洲宅男天堂在线观看无病毒| 一区二区三欧美| 亚洲国产成人在线播放| 亚洲美女毛片| 在线精品亚洲| 亚洲女人天堂成人av在线| 亚洲乱码国产乱码精品精可以看 | 亚洲曰本av电影| 久久久久久97三级| 亚洲一区二区在线观看视频| 久久久在线视频| 欧美一级夜夜爽| 欧美日本精品一区二区三区| 久久久在线视频| 国产精品久久久久永久免费观看| 欧美福利电影网| 国产一区在线免费观看| 一本久久综合| 99re8这里有精品热视频免费| 久久精品欧美日韩| 欧美在线播放一区| 国产精品久久久久久久午夜片 | 久久久久国色av免费看影院 | 欧美日韩中文字幕在线| 欧美xx69| 激情久久影院| 欧美在线啊v| 欧美伊人久久大香线蕉综合69| 欧美日韩一区二区三区在线| 亚洲国产99精品国自产| 在线观看三级视频欧美| 久久一区二区三区四区五区| 久久精品国内一区二区三区| 国产久一道中文一区| 亚洲一区二区高清视频| 亚洲欧美成人一区二区三区| 欧美日韩精品一区二区在线播放| 亚洲欧洲综合另类| 亚洲人成啪啪网站| 欧美激情在线狂野欧美精品| 亚洲国产另类 国产精品国产免费| 在线精品一区| 欧美bbbxxxxx| 亚洲美女av网站| 亚洲男女毛片无遮挡| 国产精品日本欧美一区二区三区| 亚洲无亚洲人成网站77777| 亚洲一区二区三区精品在线| 国产精品毛片va一区二区三区| 亚洲午夜精品国产| 久久国产天堂福利天堂| 红桃视频欧美| 欧美激情第三页| 亚洲一区二区成人在线观看| 久久男女视频| 亚洲免费观看在线视频| 国产精品草莓在线免费观看| 小黄鸭精品aⅴ导航网站入口| 亚洲综合成人在线| 麻豆国产精品777777在线 | 91久久精品国产91性色tv| 美女脱光内衣内裤视频久久影院| 欧美黄在线观看| 亚洲网站啪啪| 国产视频一区在线| 免费看精品久久片| 亚洲一二三区精品| 免费黄网站欧美| 国产精品99久久久久久久久| 国产中文一区二区| 欧美劲爆第一页| 欧美一区二区免费| 亚洲精品在线免费| 久久久久久久久久久一区 | 国产精品99久久久久久久vr| 久久精品欧洲| 9色精品在线| 国产自产高清不卡| 欧美手机在线视频| 久久免费视频在线| 亚洲一级片在线观看| 欧美激情一区二区三区不卡| 欧美一区二区三区四区在线观看地址 | 欧美成人一区二区| 亚欧美中日韩视频| 亚洲毛片在线免费观看| 狂野欧美激情性xxxx欧美| 亚洲婷婷在线| 亚洲高清在线观看| 国产日韩欧美亚洲| 欧美三级乱人伦电影| 美国成人直播| 欧美在线一二三四区| 亚洲视频图片小说| 亚洲激情一区二区| 美国十次了思思久久精品导航| 欧美一区二区三区免费看| 亚洲网站啪啪| 亚洲一区二区三区乱码aⅴ蜜桃女| 91久久精品国产91性色tv| 国产综合久久久久久|