




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Outline2022-4-71Outline2022-4-722022-4-73應(yīng)用程序運(yùn)行過程中的I/O應(yīng)用程序 I/O設(shè)備有哪些? 如何處理等待? 如何處理多個I/O請求? 如何編程實(shí)現(xiàn)網(wǎng)絡(luò)通信過程中的I/O操作?2022-4-74應(yīng)用程序運(yùn)行過程中的I/O I/O類外設(shè) 存儲類型的設(shè)備 網(wǎng)絡(luò)通信設(shè)備2022-4-75I/O設(shè)備 I/O設(shè)備之間的差別p 數(shù)據(jù)率p 傳送單位p 數(shù)據(jù)表示p 2022-4-76I/O設(shè)備很難實(shí)現(xiàn)一種統(tǒng)一的、一致的輸入/輸出方法! 同步I/O (Synchronous I/O)必須等待I/O操作完成后,控制權(quán)才返回給用戶進(jìn)程。 異步I/O (Asynchrono
2、us I/O)無需等待I/O操作完成,就將控制權(quán)返回給用戶進(jìn)程。2022-4-77I/O操作等待。 輸入操作p 等待數(shù)據(jù)到達(dá)套接字接收緩沖區(qū) 輸出操作p 等待套接字發(fā)送緩沖區(qū)有足夠的空間容納將要發(fā)送的數(shù)據(jù) 接收連接請求(服務(wù)器)p 等待新的客戶端連接請求的到來 發(fā)送連接請求(客戶端)p 等待服務(wù)器回送客戶端發(fā)起的SYN所對應(yīng)的ACK2022-4-78網(wǎng)絡(luò)通信中的等待Outline2022-4-792022-4-710內(nèi)核緩存內(nèi)核緩存用戶緩存用戶緩存用戶進(jìn)程操作系統(tǒng)Recvfrom操作操作 等待數(shù)據(jù)到達(dá) 等待數(shù)據(jù)從內(nèi)核到進(jìn)程2022-4-711(1)阻塞I/O模型(Blocking I/O Mo
3、del)applicationkernelrecvfromDatagram readyCopy datagramNo datagram readyCopy completeProcess datagramSystem callReturn OK2022-4-712(1)阻塞I/O模型(Blocking I/O Model)優(yōu)點(diǎn):簡單、直接缺點(diǎn):不適合多個I/O請求單個套接字的I/O請求多個套接字的I/O請求t1t1Time 0Time 0t2t3t4t1+t2+t3+t42022-4-713t1Time 0t2t3t4t1+t2+t3+t4Time 0t1t2t3t4t4 多線程并發(fā)處理多個I
4、/O請求線程維護(hù)、實(shí)現(xiàn)復(fù)雜線程維護(hù)、實(shí)現(xiàn)復(fù)雜 單線程并發(fā)處理多個I/O請求I/O復(fù)用模型如何及時處理多個I/O請求?非阻塞I/O模型關(guān)鍵:如何確定網(wǎng)絡(luò)事件何時發(fā)生?2022-4-714(2)非阻塞I/O模型(Nonblocking I/O Model)applicationkernelrecvfromDatagram readyCopy datagramNo datagram readyCopy completeProcess datagramSystem callReturn OKerrorrecvfromNo datagram readyerror System call缺點(diǎn)缺點(diǎn)1:多次系
5、統(tǒng)調(diào)用消耗資源?。憾啻蜗到y(tǒng)調(diào)用消耗資源!缺點(diǎn)缺點(diǎn)2:處理時機(jī)滯后?。禾幚頃r機(jī)滯后!recvfromSystem call2022-4-715(3)I/O復(fù)用模型(I/O Multiplexing Model)applicationkernelselectDatagram readyCopy datagramNo datagram readyCopy completeProcess datagramSystem callReturn OKrecvfromReturn readableSystem call select函數(shù)定義:int select(int nfds, fd_set* readf
6、ds, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout); 輸入?yún)?shù):p nfds:在windows中忽略,僅是為了與Berkeley套接字兼容;p readfds:指向一個套接字集合,用來檢查其可讀性;p writefds:指向一個套接字集合,用來檢查其可寫性;p exceptfds:指向一個套接字集合,用來檢查錯誤;p timeout: 指定此函數(shù)等待的最長時間,如果為NULL,則最長時間為無限大 返回值:p 成功:發(fā)生網(wǎng)絡(luò)事件的所有套接字?jǐn)?shù)量的總和p 超時:0p 失?。篠OCKET_ERROR2022-
7、4-716(3)I/O復(fù)用模型(I/O Multiplexing Model)2022-4-717(3)I/O復(fù)用模型(I/O Multiplexing Model)套接字集合套接字集合select函數(shù)等待有事件發(fā)生數(shù)據(jù)可讀連接關(guān)閉/重啟/中斷連接成功(調(diào)用connect)數(shù)據(jù)可寫連接失?。ㄕ{(diào)用connect)OOB數(shù)據(jù)可讀readfdswritefdsexceptfdsSelect函數(shù)返回如果是該套接字有數(shù)據(jù)可讀,則調(diào)用函數(shù)接收數(shù)據(jù)連接請求優(yōu)點(diǎn):避免了阻塞模式下的線程膨脹問題缺點(diǎn):可監(jiān)控的套接字?jǐn)?shù)量有限2022-4-718(4)異步I/O復(fù)用模型(WSAAsyncSelect Model)
8、Windows Windows消息機(jī)制消息機(jī)制消息隊列消息隊列消息消息處理函數(shù)WinMain() while(1) 等待;等待; 取出消息;取出消息; 調(diào)用消息處理函數(shù);調(diào)用消息處理函數(shù); 2022-4-719(4)異步I/O復(fù)用模型(WSAAsyncSelect Model)int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent)值值含義含義FD_READ期望在套接字期望在套接字s上收到數(shù)據(jù)時接到通知上收到數(shù)據(jù)時接到通知FD_WRITE期望在套接字期望在套接字s上可發(fā)送數(shù)據(jù)時接到通知上可發(fā)送數(shù)據(jù)時接到通知F
9、D_OOB期望在套接字期望在套接字s上有帶外數(shù)據(jù)到達(dá)時接到通知上有帶外數(shù)據(jù)到達(dá)時接到通知FD_ACCEPT期望在套接字期望在套接字s上有外來連接時接到通知上有外來連接時接到通知FD_CONNECT期望在套接字期望在套接字s上連接建立完成時接到通知上連接建立完成時接到通知FD_CLOSE期望在套接字期望在套接字s關(guān)閉時接到通知關(guān)閉時接到通知 函數(shù)定義函數(shù)定義2022-4-720I/O模型 異步異步I/OI/O復(fù)用復(fù)用I/OI/O復(fù)用復(fù)用非阻塞非阻塞I/OI/O阻塞阻塞I/OI/O阻塞通知發(fā)起完成阻塞就緒發(fā)起完成完成完成檢查注冊發(fā)起阻塞阻塞阻塞檢查檢查檢查檢查Outline2022-4-72120
10、22-4-722使用select函數(shù)的TCP和UDP回射服務(wù)器服務(wù)器TCP監(jiān)聽套接字已連接套接字已連接套接字UDP套接字客戶1客戶4客戶2客戶3Select()2022-4-723/初始化可讀套接字集合初始化可讀套接字集合fd_set rset;FD_ZERO(&rset);/設(shè)置等待的套接字設(shè)置等待的套接字FD_SET(listenfd,&rset);FD_SET(udpfd,&rset);/調(diào)用調(diào)用select函數(shù)等待函數(shù)等待select(0,&rset,NULL,NULL,NULL)/根據(jù)返回的可讀套接字進(jìn)行相應(yīng)操作根據(jù)返回的可讀套接字進(jìn)行相應(yīng)操作if(FD_ISSET(listenfd
11、,&rset)if(FD_ISSET(udpfd,&rset)Outline2022-4-7242022-4-725同步時間服務(wù)器實(shí)現(xiàn)客戶端客戶端處理請求處理請求服務(wù)器服務(wù)器11:30連接請求連接請求2022-4-726serverclient開始socketaccept獲取本機(jī)時間send結(jié)束問題:如何選擇accept函數(shù)的調(diào)用時機(jī)?2022-4-727同步時間服務(wù)器實(shí)現(xiàn)int main(int argc, char* argv)listenfd=socket(AF_INET,SOCK_STREAM,0);bind(listenfd,ServerAddr,sizeof(ServerAddr)
12、;listen(listenfd, LISTENQ);for ( ; ; )/接收客戶連接接收客戶連接connfd = accept(listenfd, (LPSOCKADDR)NULL, NULL);/獲取本機(jī)時間,發(fā)送給獲取本機(jī)時間,發(fā)送給客戶端客戶端send(connfd, buff, strlen(buff),0); 2022-4-728異步時間服務(wù)器實(shí)現(xiàn)客戶端客戶端處理請求處理請求服務(wù)器服務(wù)器11:30連接請求連接請求 對對外來連接外來連接感興趣,如果有,請通知感興趣,如果有,請通知FD_ACCEPT2022-4-729開始Socket 【listen socket】結(jié)束WSAAsy
13、ncSelect【listen socket】【窗口句柄】【W(wǎng)M_ACCEPT】【FD_ACCEPT】accept獲取本機(jī)時間sendOnAccept2022-4-730void OnOK()()listenfd=socket(AF_INET,SOCK_STREAM,0); bind(listenfd,ServerAddr,sizeof(ServerAddr);WSAAsyncSelect(listenfd,m_hWnd,WM_ACCEPT,FD_ACCEPT);listen(listenfd, LISTENQ);對外來連接感興趣對外來連接感興趣#define WM_ACCEPT WM_USE
14、R+101ON_MESSAGE(WM_ACCEPT, OnAccept)OnAccept (WPARAM wParam,LPARAM lParam)/如果有客戶連接如果有客戶連接 if(WSAGETSELECTEVENT(lParam) = FD_ACCEPT)/接收客戶連接接收客戶連接 connfd = accept(listenfd, (LPSOCKADDR)NULL, NULL);/獲取本機(jī)時間,發(fā)送給客戶端獲取本機(jī)時間,發(fā)送給客戶端2022-4-731異步時間服務(wù)器實(shí)現(xiàn)問題:如何處理多個I/O請求?2022-4-732客戶端客戶端處理請求處理請求服務(wù)器服務(wù)器 對對外來連接外來連接感興趣
15、,如果有,請通知感興趣,如果有,請通知 對對用戶數(shù)據(jù)到達(dá)和連接關(guān)閉用戶數(shù)據(jù)到達(dá)和連接關(guān)閉感興趣,如果有,請通知感興趣,如果有,請通知連接請求連接請求發(fā)送數(shù)據(jù)發(fā)送數(shù)據(jù)關(guān)閉連接關(guān)閉連接問題:誰對問題:誰對“外來連接外來連接”感興趣?感興趣?答案:監(jiān)聽套接字答案:監(jiān)聽套接字問題:誰對問題:誰對“用戶數(shù)據(jù)到達(dá)用戶數(shù)據(jù)到達(dá)”和和“連接關(guān)閉連接關(guān)閉”感興趣?感興趣? 答案:連接套接字答案:連接套接字問題:兩個不同的問題:兩個不同的I/O操作如何處理?操作如何處理?FD_READFD_CLOSE2022-4-733開始Socket 【listen socket】WSAAsyncSelect【listen s
16、ocket】【窗口句柄】【W(wǎng)M_ACCEPT】【FD_ACCEPT】結(jié)束OnAcceptAccept 【connct socket】獲取本機(jī)時間sendclosesocketrecvWSAAsyncSelect【connect socket】【窗口句柄】【W(wǎng)M_RDCLS】【FD_READ|FD_CLOSE】OnReadClose2022-4-734Void OnAccept (WPARAM wParam,LPARAM lParam) if(WSAGETSELECTEVENT(lParam) = FD_ACCEPT) /接收客戶連接接收客戶連接 connfd = accept(listenfd
17、, (LPSOCKADDR)NULL, NULL); WSAAsyncSelect(connfd,m_hWnd,WM_RDCLS,FD_READ|FD_CLOSE); 對客戶數(shù)據(jù)和關(guān)閉連接感興趣對客戶數(shù)據(jù)和關(guān)閉連接感興趣#define WM_RDCLS WM_USER+102ON_MESSAGE(WM_RDCLS,OnReadClose)Void OnReadClose(WPARAM wParam,LPARAM lParam)switch (WSAGETSELECTEVENT(lParam)case FD_READ:/有客戶請求到達(dá)有客戶請求到達(dá)recv(connfd,(char *)&msg
18、,sizeof(msg),0);break;case FD_CLOSE:/客戶關(guān)閉連接客戶關(guān)閉連接closesocket(connfd);break;2022-4-735監(jiān)聽套接字監(jiān)聽套接字listenfd連接套接字連接套接字connfd消息處理函數(shù)消息處理函數(shù)OnAccept客戶數(shù)據(jù)到達(dá)客戶數(shù)據(jù)到達(dá)FD_READ客戶關(guān)閉連接客戶關(guān)閉連接FD_CLOSE客戶連接請求客戶連接請求FD_ACCEPT消息消息WM_RDCLS消息消息WM_ACCEPT消息處理函數(shù)消息處理函數(shù)OnReadClose關(guān)心關(guān)心 關(guān)聯(lián) 觸發(fā) 觸發(fā) 關(guān)聯(lián) 1、windows sockets dll不會連續(xù)地就同一個網(wǎng)絡(luò)事件給應(yīng)用程序發(fā)送多個消息p 盡管函數(shù)WSAAsyncSelect()可以設(shè)置多個感興趣的網(wǎng)絡(luò)事件,但是應(yīng)用程序窗口在每一個網(wǎng)絡(luò)事件發(fā)生時只收到一個單個的消息p 在成功給一個應(yīng)用程序窗口發(fā)送
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年西寧從業(yè)資格證貨運(yùn)考試試題
- 建筑設(shè)計咨詢合同
- 2025年拉薩道路運(yùn)輸從業(yè)資格證考試內(nèi)容是什么
- 2025年陽泉年貨運(yùn)從業(yè)資格證考試答案
- 變壓器安裝承包合同
- 中小學(xué)老師聘用合同
- 安裝工程分包合同范本與安裝工程合作合同6篇
- 2025年雙鴨山貨運(yùn)從業(yè)資格證考試模擬考試題庫
- PVA膜產(chǎn)業(yè)分析報告
- 養(yǎng)殖用地變更合同范本
- 借哪吒精神燃開學(xué)斗志 開學(xué)主題班會課件
- 2025年初中主題班會課件:好習(xí)慣成就好人生
- 學(xué)校教職工代表大會全套會議會務(wù)資料匯編
- 中華人民共和國監(jiān)察法宣貫培訓(xùn)
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 幼兒園安全教育課件:《危險的小圓珠》
- 冠心病病人的護(hù)理ppt(完整版)課件
- 砂石生產(chǎn)各工種安全操作規(guī)程
- (精心整理)林海雪原閱讀題及答案
- 云南藝術(shù)學(xué)院
- 2020華夏醫(yī)學(xué)科技獎知情同意報獎證明
評論
0/150
提交評論