資源描述:
《完成端口詳解new》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、完成端口(CompletionPort)詳解????????????????????????????????????????????????????????????-----ByPiggyXP(小豬)前言???????本系列里完成端口的代碼在兩年前就已經(jīng)寫好了,但是由于許久沒有寫東西了,不知該如何提筆,所以這篇文檔總是在醞釀之中……醞釀了兩年之后,終于決定開始動(dòng)筆了,但愿還不算晚…..???????這篇文檔我非常詳細(xì)并且圖文并茂的介紹了關(guān)于網(wǎng)絡(luò)編程模型中完成端口的方方面面的信息,從API的用法到使用
2、的步驟,從完成端口的實(shí)現(xiàn)機(jī)理到實(shí)際使用的注意事項(xiàng),都有所涉及,并且為了讓朋友們更直觀的體會(huì)完成端口的用法,本文附帶了有詳盡注釋的使用MFC編寫的圖形界面的示例代碼。???????我的初衷是希望寫一份互聯(lián)網(wǎng)上能找到的最詳盡的關(guān)于完成端口的教學(xué)文檔,而且讓對Socket編程略有了解的人都能夠看得懂,都能學(xué)會(huì)如何來使用完成端口這么優(yōu)異的網(wǎng)絡(luò)編程模型,但是由于本人水平所限,不知道我的初衷是否實(shí)現(xiàn)了,但還是希望各位需要的朋友能夠喜歡。???????由于篇幅原因,本文假設(shè)你已經(jīng)熟悉了利用Socket進(jìn)行TCP/
3、IP編程的基本原理,并且也熟練的掌握了多線程編程技術(shù),太基本的概念我這里就略過不提了,網(wǎng)上的資料應(yīng)該遍地都是。???????本文檔凝聚著筆者心血,如要轉(zhuǎn)載,請指明原作者及出處,謝謝!不過代碼沒有版權(quán),可以隨便散播使用,歡迎改進(jìn),特別是非常歡迎能夠幫助我發(fā)現(xiàn)Bug的朋友,以更好的造福大家。^_^???????本文配套的示例源碼下載地址(在我的下載空間里,已經(jīng)補(bǔ)充上了客戶端的代碼)???????http://piggyxp.download.csdn.net/??????(里面的代碼包括VC++2008
4、/VC++2010編寫的完成端口服務(wù)器端和客戶端的代碼,還包括一個(gè)對服務(wù)器端進(jìn)行壓力測試的客戶端,都是經(jīng)過我精心調(diào)試過,并且?guī)в蟹浅T敱M的代碼注釋的。當(dāng)然,作為教學(xué)代碼,為了能夠使得代碼結(jié)構(gòu)清晰明了,我還是對代碼有所簡化,如果想要用于產(chǎn)品開發(fā),最好還是需要自己再完善一下,另外我的工程是用2010編寫的,附帶的2008工程不知道有沒有問題,但是其中代碼都是一樣的,暫未測試)???????忘了囑咐一下了,文章篇幅很長很長,基本涉及到了與完成端口有關(guān)的方方面面,一次看不完可以分好幾次,中間注意休息,好身體
5、才是咱們程序員最大的本錢!第33頁??????對了,還忘了囑咐一下,因?yàn)楸救说乃接邢蓿m然我反復(fù)修正了數(shù)遍,但文章和示例代碼里肯定還有我沒發(fā)現(xiàn)的錯(cuò)誤和紕漏,希望各位一定要指出來,拍磚、噴我,我都能Hold住,但是一定要指出來,我會(huì)及時(shí)修正,因?yàn)槲也幌胱屛闹械腻e(cuò)誤傳遍互聯(lián)網(wǎng),禍害大家。?????OK,Let’sgo!Havefun!?目錄:1.完成端口的優(yōu)點(diǎn)2.完成端口程序的運(yùn)行演示3.完成端口的相關(guān)概念4.完成端口的基本流程5.完成端口的使用詳解6.實(shí)際應(yīng)用中應(yīng)該要注意的地方?一.完成端口的優(yōu)點(diǎn)?
6、??????1.我想只要是寫過或者想要寫C/S模式網(wǎng)絡(luò)服務(wù)器端的朋友,都應(yīng)該或多或少的聽過完成端口的大名吧,完成端口會(huì)充分利用Windows內(nèi)核來進(jìn)行I/O的調(diào)度,是用于C/S通信模式中性能最好的網(wǎng)絡(luò)通信模型,沒有之一;甚至連和它性能接近的通信模型都沒有。???????2.完成端口和其他網(wǎng)絡(luò)通信方式最大的區(qū)別在哪里呢????????(1)首先,如果使用“同步”的方式來通信的話,這里說的同步的方式就是說所有的操作都在一個(gè)線程內(nèi)順序執(zhí)行完成,這么做缺點(diǎn)是很明顯的:因?yàn)橥降耐ㄐ挪僮鲿?huì)阻塞住來自同一個(gè)線程
7、的任何其他操作,只有這個(gè)操作完成了之后,后續(xù)的操作才可以完成;一個(gè)最明顯的例子就是咱們在MFC的界面代碼中,直接使用阻塞Socket調(diào)用的代碼,整個(gè)界面都會(huì)因此而阻塞住沒有響應(yīng)!所以我們不得不為每一個(gè)通信的Socket都要建立一個(gè)線程,多麻煩?這不坑爹呢么?所以要寫高性能的服務(wù)器程序,要求通信一定要是異步的。第33頁???????(2)各位讀者肯定知道,可以使用使用“同步通信(阻塞通信)+多線程”的方式來改善(1)的情況,那么好,想一下,我們好不容易實(shí)現(xiàn)了讓服務(wù)器端在每一個(gè)客戶端連入之后,都要啟動(dòng)一
8、個(gè)新的Thread和客戶端進(jìn)行通信,有多少個(gè)客戶端,就需要啟動(dòng)多少個(gè)線程,對吧;但是由于這些線程都是處于運(yùn)行狀態(tài),所以系統(tǒng)不得不在所有可運(yùn)行的線程之間進(jìn)行上下文的切換,我們自己是沒啥感覺,但是CPU卻痛苦不堪了,因?yàn)榫€程切換是相當(dāng)浪費(fèi)CPU時(shí)間的,如果客戶端的連入線程過多,這就會(huì)弄得CPU都忙著去切換線程了,根本沒有多少時(shí)間去執(zhí)行線程體了,所以效率是非常低下的,承認(rèn)坑爹了不????????(3)而微軟提出完成端口模型的初衷,就是為了解決這種"one-thread-pe