幾種winsock I/O模型的分析
套接字是通信的基礎(chǔ),是支持網(wǎng)絡(luò)協(xié)議數(shù)據(jù)通信的基本接口。Winsocket 提供了一些有趣的I/O模型,有助于應(yīng)用程序通過一種“異步”方式,一次對一個或者多個套接字上進(jìn)行的通信加以管理。這些模型包括select(選擇)、WSAAsynSelect(異步選擇)、WSAEventSelect(事件選擇)、Overlapped I/O(重疊 I/O)以及Completion port(完成端口)。
① select 模型:
select模型是WinSock中應(yīng)用最廣泛的模型之一,核心就是select函數(shù),它可用于判斷套接字上是否存在數(shù)據(jù),或者能否向一個套接字寫入數(shù)據(jù)。這個函數(shù)可以有效地防止應(yīng)用程序在套接字處于阻塞模式中時,send或recv進(jìn)入阻塞狀態(tài);同時也可以防止產(chǎn)生大量的WSAEWOULDBLOCK錯誤select的優(yōu)勢是能夠從單個線程的多個套接字上進(jìn)行多重連接及I/O。這就避免了伴隨阻塞套接字和多重連接的線程劇增。
② WSAAsyncSelect 模型:
因為它是以消息為基礎(chǔ)的,關(guān)鍵就是WSAAsyncSelect函數(shù),將socket消息發(fā)送到hWnd窗口上,然后在那里處理相應(yīng)的FD_READ、FD_WRITE等等消息。優(yōu)點:WSAAsyncSelect和WSAEventSelect模型提供了讀寫數(shù)據(jù)能力的異步通知,但他們不提供異步數(shù)據(jù)傳送,而重疊及完成端口提供異步數(shù)據(jù)的傳送。而且它可以在系統(tǒng)開銷不大的情況下同時處理很多連接,而select模型還需要建立fd_set結(jié)構(gòu)。 缺點:必須要使用一個窗口接收消息,如果處理成千上萬的套接字就力不從心了。
③ WSAEventSelect 模型:
這個也是以時間為基礎(chǔ)的網(wǎng)絡(luò)事件通知,但是與WSAAsyncSelect不同的是,它主要是由事件對象句柄完成的,而不是通過窗口。優(yōu)點:不需要窗口。缺點:每次只能等待64個事件,所以處理多個套接字時有必要組織一個線程池;所以伸縮性就不如后面的完成端口了。
④ 重疊模型:
這個模型可以使程序能達(dá)到更佳的系統(tǒng)性能。基本設(shè)計原理就是讓應(yīng)用程序使用重疊的數(shù)據(jù)結(jié)構(gòu),一次投遞一個或多個I/O請求。針對這些提交的請求,在他們完成之后,應(yīng)用程序可為他們提供服務(wù)。它又分為兩種實現(xiàn)方法:在事件中使用,還有就是完成例程。
⑤ 完成端口:
完成端口提供了最好的伸縮性,往往可以使系統(tǒng)達(dá)到最好的性能,是處理成千上萬的套接字的首選。從本質(zhì)上說,完成端口模型要求創(chuàng)建一個windows完成端口對象,該對象通過指定數(shù)量的線程,對重疊I/O請求進(jìn)行管理,以便為已經(jīng)完成的重疊I/O請求提供服務(wù)。