高性能服務器架構設計總結

服務器需要解決的如下問題:

(1)如何檢測有新客戶端連接尔邓? 答: IO復用的select、poll锉矢、epoll等socket API

? ? ? ? 首先關于IO復用機制的比較梯嗽,目前windows系統(tǒng)支持select、WSAAsyncSelect沽损、WSAEventSelect灯节、完成端口(IOCP),linux系統(tǒng)支持select绵估、poll炎疆、epoll。

? ? ? ? 1. select和poll? :主動定時輪詢是否有可讀可寫事件国裳,效率不高形入;

? ? ? ? 2.WSAAsyncSelect、WSAEventSelect缝左、完成端口(IOCP)亿遂、epoll:被動異步事件通知,減少無效時間渺杉,WSAAsyncSelect是利用windows消息隊列的事件機制來通知我們設定的窗口過程函

數崩掘,IOCP是利用GetQueuedCompletionStatus返回正確的狀態(tài),epoll是epoll_wait函數返回少办。比如connect函數連接另外一端,如果連接socket是異步的诵原,那么connect雖然不能立刻連接完成英妓,但是也是

會立刻返回,無需等待绍赛,等連接完成之后蔓纠,WSAAsyncSelect會返回FD_CONNECT事件告訴我們連接成功,epoll會產生EPOLLOUT事件吗蚌,我們也能知道連接完成腿倚。甚至socket有數據可讀時

WSAAsyncSelect產生FD_READ事件,epoll產生EPOLLIN事件蚯妇,等等敷燎。

(2)如何接受客戶端連接暂筝??答:socket API的accept函數

? ? ? ? 默認accept函數會阻塞在那里,如果epoll檢測到偵聽socket上有EPOLLIN事件硬贯,或者WSAAsyncSelect檢測到有FD_ACCEPT事件焕襟,那么就表明此時有新連接到來,這個時候調用accept函數饭豹,就不

會阻塞了鸵赖。當然產生的新socket你應該也設置成非阻塞的。這樣就能在新socket上收發(fā)數據了拄衰。

(3)如何檢測客戶端是否有數據發(fā)來它褪?答:如上(1)中注冊的IO復用機制是否有可寫事件

(4)如何收取客戶端發(fā)來的數據??答:收取客戶端數據用recv函數翘悉,socket上有可讀事件的時候才去收取數據,這樣調用recv或者read函數時不用等待镐确,對于非阻塞的socket包吝,如果無數據recv或者

read函數會立即返回,錯誤碼為EWOULDBLOCK源葫。

(5)如何檢測連接異常诗越?答:當服務器收到異常事件EPOLLERR或者關閉事件FD_CLOSE,可以關閉socket息堂,此外嚷狞,recv或者read返回0時也可以關閉socket

(6)如何給客戶端發(fā)送數據?給客戶端發(fā)送數據用send函數 服務器不需要時刻偵聽可寫事件荣堰,只是在需要有數據要發(fā)送床未,則先嘗試著去發(fā)送,如果發(fā)送不了或者只發(fā)送出去部分振坚,剩下需要將其緩存起

來薇搁,然后設置檢測該socket上可寫事件,下次可寫事件產生時渡八,再繼續(xù)發(fā)送啃洋,如果還是不能完全發(fā)出去,則繼續(xù)設置偵聽可寫事件屎鳍,如此往復宏娄,一直到所有數據都發(fā)出去為止。一旦所有數據都發(fā)出去以

后逮壁,服務器要移除偵聽可寫事件孵坚,避免無用的可寫事件通知。

(7)如何在給客戶端發(fā)完數據后關閉連接?連接關閉分為主動關閉和被動關閉卖宠,被動關閉是服務器檢測到客戶端異澄¤荆或者關閉事件、recv和send立即返回0時被迫關閉連接逗堵;主動關閉是動調用

close/closesocket來關閉連接秉氧,比如客戶端發(fā)送非法的數據,比如一些網絡攻擊的嘗試性數據包蜒秤。

(8)收發(fā)緩沖區(qū)如何設定汁咏?緩沖可以像string、vector一樣作媚,設計出一個可以動態(tài)增長的緩沖區(qū)攘滩,按需分配,不夠還可以擴展纸泡。

(9)協(xié)議的設計要點:像TCP/IP協(xié)議基于字節(jié)的流式數據漂问,需要界定包的大小已經包的界限,比如固定包的大小女揭,使用\r\n作為包結束符蚤假,并且為了節(jié)省網絡帶寬和加快數據處理,盡可能使包的長度

比較小吧兔。

(10)服務器程序結構的組織:主流的思想是one thread one loop的策略磷仰,設定一些線程在一個循環(huán)里面做網絡通信相關的事情,另外設定一些線程去處理接收到的數據境蔼,并解包處理業(yè)務邏輯灶平。如果

多線程設定無法提高提高程序性能,浪費CPU時間片進行上下文切換箍土,可以將網絡線程與業(yè)務邏輯線程合并逢享。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吴藻,隨后出現(xiàn)的幾起案子瞒爬,更是在濱河造成了極大的恐慌,老刑警劉巖沟堡,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疮鲫,死亡現(xiàn)場離奇詭異,居然都是意外死亡弦叶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門妇多,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伤哺,“玉大人,你說我怎么就攤上這事×⒗颍” “怎么了绢彤?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜓耻。 經常有香客問我茫舶,道長,這世上最難降的妖魔是什么刹淌? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任饶氏,我火速辦了婚禮,結果婚禮上有勾,老公的妹妹穿的比我還像新娘疹启。我一直安慰自己,他們只是感情好蔼卡,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布喊崖。 她就那樣靜靜地躺著,像睡著了一般雇逞。 火紅的嫁衣襯著肌膚如雪荤懂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天塘砸,我揣著相機與錄音节仿,去河邊找鬼。 笑死谣蠢,一個胖子當著我的面吹牛粟耻,可吹牛的內容都是我干的。 我是一名探鬼主播眉踱,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挤忙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谈喳?” 一聲冷哼從身側響起册烈,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婿禽,沒想到半個月后赏僧,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡扭倾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年淀零,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膛壹。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡驾中,死狀恐怖唉堪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情肩民,我是刑警寧澤唠亚,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站持痰,受9級特大地震影響灶搜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜工窍,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一割卖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧移剪,春花似錦究珊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攻人,卻和暖如春取试,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怀吻。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工瞬浓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓬坡。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓猿棉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屑咳。 傳聞我的和親對象是個殘疾皇子萨赁,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容