基于IOCP的遠(yuǎn)程屏幕監(jiān)控系統(tǒng)
3 服務(wù)器設(shè)計(jì)
遠(yuǎn)程屏幕監(jiān)控服務(wù)器的核心功能是將接收到的客戶端的屏幕圖像顯示到一個(gè)服務(wù)器端窗口中,服務(wù)器通過此窗口對(duì)客戶端進(jìn)行遠(yuǎn)程控制。為了提高系統(tǒng)可靠性,網(wǎng)絡(luò)協(xié)議采用面向連接的TCP協(xié)議,利用TCP協(xié)議中的擁塞避免以及超時(shí)和差錯(cuò)重傳機(jī)制可以確保數(shù)據(jù)在傳輸?shù)目煽啃浴?br />3.1 服務(wù)器監(jiān)聽套接字的實(shí)現(xiàn)
在服務(wù)器端建立IOCP模型時(shí),首先需要建立一個(gè)監(jiān)聽套接字,對(duì)于監(jiān)聽套接字,并不將它與完成端口相關(guān)聯(lián),而是調(diào)用WSAEventSelect為監(jiān)聽套接字注冊(cè)FD_ACCEPT網(wǎng)絡(luò)事件。該函數(shù)的聲明如下:
之后創(chuàng)建一個(gè)監(jiān)聽線程,在此線程中可以循環(huán)調(diào)用WSAWaitForMultipleEvents等待事件對(duì)象被觸發(fā)。在該函數(shù)正確返回之后,繼續(xù)調(diào)用WSAEnumNetworkEvents函數(shù)列舉出發(fā)生在套接字上的事件,如果是FD_ACCEPT事件,則接受該連接,并將新建的套接字與創(chuàng)建的完成端口相關(guān)聯(lián),并在此套接字上調(diào)用WSARecv投遞接收數(shù)據(jù)的請(qǐng)求。
3.2 IOCP模型的實(shí)現(xiàn)
要建立IOCP模型,需要在服務(wù)器啟動(dòng)監(jiān)聽線程時(shí),首先創(chuàng)建一個(gè)完成端口對(duì)象,通過調(diào)用CreateIoCompletionPort來實(shí)現(xiàn),之后調(diào)用GetSystemlnfo函數(shù)獲得CPU的數(shù)量,根據(jù)CPU的數(shù)量創(chuàng)建一定數(shù)量的服務(wù)線程在此端口上等待完成事件的通知,一般來說,服務(wù)線程的數(shù)量大約是CPU數(shù)量的2倍。
當(dāng)監(jiān)聽套接字接收到一個(gè)新的連接時(shí),再次調(diào)用CreateIoCompletionPort將接收套接字與我們先前創(chuàng)建的完成端口綁定。這里的完成鍵pComleKey是一個(gè)指向ClientContext結(jié)構(gòu)體的指針,該結(jié)構(gòu)體包含了當(dāng)前套接字的一些相關(guān)信息,接受和發(fā)送數(shù)據(jù)所用的緩存。接下來需要定義一個(gè)與I/O操作相關(guān)的結(jié)構(gòu)體,保存與I/O操作相關(guān)的信息。該結(jié)構(gòu)體的定義如下:
評(píng)論