版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、TCP/IP協(xié)議與網(wǎng)絡(luò)編程協(xié)議與網(wǎng)絡(luò)編程 信息科學(xué)與工程學(xué)院信息科學(xué)與工程學(xué)院王霞王霞博客:博客: http:/ 8章章 高級高級SocketSocket編程技術(shù)編程技術(shù)(2)(2) 信息科學(xué)與工程學(xué)院信息科學(xué)與工程學(xué)院王霞王霞8.2 基于基于Select模型的模型的socket編程編程本講內(nèi)容本講內(nèi)容1 12 2基于基于SelectSelect模型的模型的socketsocket編程編程基于基于WSAAsyncSeclectWSAAsyncSeclect的的socketsocket編程編程學(xué)習(xí)目標(biāo)學(xué)習(xí)目標(biāo)掌握基于掌握基于Select模型的編程方法模型的編程方法掌握基于掌握基于WSAAsync
2、Select模型的編程方法模型的編程方法 復(fù)習(xí)復(fù)習(xí)非阻塞編程有何優(yōu)缺點(diǎn)?非阻塞編程有何優(yōu)缺點(diǎn)?非阻塞非阻塞socket編程編程如何建立一對多的通信?如何建立一對多的通信?-多線程多線程多線程用法多線程用法在在accept()接收一個(gè)連接之后,建立一個(gè)新線程。()接收一個(gè)連接之后,建立一個(gè)新線程。DWORD dwThreadid;CreateThread(null,null,AnswerThread,(LPVOID)sClient,0,&dwThread);DWORD WINAPI AnswerThread(LPWOID lparam)本節(jié)任務(wù)本節(jié)任務(wù)1.Socket有哪些編程模型,他們
3、的作用分別是什有哪些編程模型,他們的作用分別是什么?有何區(qū)別?么?有何區(qū)別?2.如何完成如何完成Select模型下得編程工作?模型下得編程工作?3.如何構(gòu)建一個(gè)完整的如何構(gòu)建一個(gè)完整的Select模型下的套接字程模型下的套接字程序?序?Socket有哪些編程模型,他們的作用分別是什么?有何區(qū)別?Q1: Socket有哪些編程模型,他們的作用有哪些編程模型,他們的作用分別是什么?有何區(qū)別?分別是什么?有何區(qū)別?1-1 socket有哪些編程模型?他們的作用分別是什么?有哪些編程模型?他們的作用分別是什么?Select模型:模型:WSAAsyncSelect模型:模型:WSAEventSelect
4、模型:模型:重疊重疊I/O模型:模型:完成端口模型:完成端口模型:Q1: Socket有哪些編程模型,他們的有哪些編程模型,他們的作用分別是什么?有何區(qū)別?作用分別是什么?有何區(qū)別?1-2 Select模型有何作用?模型有何作用?Select模型:模型:select()函數(shù)函數(shù)int select(int nfds,fd_set FAR* readfds,fd_set FAR* writefds,fd_set FAR* exceptfds,const struct timeval FAR* timeout);1. fd_set#define FD_SETSIZE 64typedef struc
5、t fd_set u_int fd_count; /套接字?jǐn)?shù)量套接字?jǐn)?shù)量 SOCKET fd_arrayFD_SETSIZE; /套接字?jǐn)?shù)組套接字?jǐn)?shù)組 fd_set;nfd_set 是一個(gè)管理多個(gè)套接字的結(jié)構(gòu)體。在該結(jié)構(gòu)是一個(gè)管理多個(gè)套接字的結(jié)構(gòu)體。在該結(jié)構(gòu)體中,體中,fd_count 字段指明套接字的數(shù)量,字段指明套接字的數(shù)量,fd_array 字段保存字段保存 fd_count 個(gè)套接字。個(gè)套接字。nfd_set 最多可以管理最多可以管理64個(gè)套接字。個(gè)套接字。當(dāng)當(dāng)select() 函數(shù)成功返回后,會在函數(shù)成功返回后,會在 fs_set 結(jié)構(gòu)中,返回剛好未完成結(jié)構(gòu)中,返回剛好未完成I/O操
6、作的所有套接操作的所有套接字句柄的總量字句柄的總量 。readfds參數(shù)將包含符合下面任何一個(gè)條件的參數(shù)將包含符合下面任何一個(gè)條件的套接字。套接字。q有數(shù)據(jù)可以讀入。此時(shí)在該套接字上調(diào)用有數(shù)據(jù)可以讀入。此時(shí)在該套接字上調(diào)用recv()等等輸入函數(shù),立即接收到對方的數(shù)據(jù)。輸入函數(shù),立即接收到對方的數(shù)據(jù)。q連接已經(jīng)關(guān)閉、重設(shè)或中止。連接已經(jīng)關(guān)閉、重設(shè)或中止。q假如已經(jīng)調(diào)用假如已經(jīng)調(diào)用listen()函數(shù),而且一個(gè)連接正在建函數(shù),而且一個(gè)連接正在建立。那么此時(shí)調(diào)用立。那么此時(shí)調(diào)用accept()函數(shù)會成功。函數(shù)會成功。 writefds參數(shù)將包含符合下面任何一個(gè)條件的參數(shù)將包含符合下面任何一個(gè)條件的
7、套接字。套接字。q有數(shù)據(jù)可以發(fā)出。此時(shí)在該套接字上可以調(diào)用有數(shù)據(jù)可以發(fā)出。此時(shí)在該套接字上可以調(diào)用send()等輸出函數(shù),向?qū)Ψ桨l(fā)送數(shù)據(jù)。等輸出函數(shù),向?qū)Ψ桨l(fā)送數(shù)據(jù)。q如果已經(jīng)在一個(gè)非阻塞套接字上調(diào)用如果已經(jīng)在一個(gè)非阻塞套接字上調(diào)用connect()函函數(shù),此時(shí)連接成功。數(shù),此時(shí)連接成功。 exceptfds參數(shù)將包含符合下面一個(gè)條件的套參數(shù)將包含符合下面一個(gè)條件的套接字。接字。q如果已經(jīng)在一個(gè)非阻塞套接字上調(diào)用了如果已經(jīng)在一個(gè)非阻塞套接字上調(diào)用了connect()函數(shù),此時(shí)連接失敗。函數(shù),此時(shí)連接失敗。q有帶外(有帶外(Out-of-band,OOB)數(shù)據(jù)可供讀取。)數(shù)據(jù)可供讀取。例:應(yīng)用程
8、序欲判斷某個(gè)套接字是否存在可讀的例:應(yīng)用程序欲判斷某個(gè)套接字是否存在可讀的數(shù)據(jù),需要進(jìn)行如下步驟。數(shù)據(jù),需要進(jìn)行如下步驟。q 將該套接字加入將該套接字加入readfds集合。集合。q 以以readfds為第二個(gè)參數(shù)調(diào)用為第二個(gè)參數(shù)調(diào)用select()函數(shù)。函數(shù)。q 當(dāng)當(dāng)select()函數(shù)返回時(shí),應(yīng)用程序判斷該套接字函數(shù)返回時(shí),應(yīng)用程序判斷該套接字是否仍然存在于是否仍然存在于readfds集合。集合。q 如果該套接字存在于如果該套接字存在于readfds集合,則表明該套集合,則表明該套接字可讀。此時(shí),應(yīng)用程序調(diào)用接字可讀。此時(shí),應(yīng)用程序調(diào)用recv()等輸入函數(shù)等輸入函數(shù)接收數(shù)據(jù)。接收數(shù)據(jù)。q
9、調(diào)用調(diào)用select()函數(shù)時(shí),函數(shù)時(shí),readfds、writefd和和sexceptfds3個(gè)參數(shù)中至少有一個(gè)不能設(shè)置為個(gè)參數(shù)中至少有一個(gè)不能設(shè)置為 NULL。并且,在該非空的參數(shù)中,必須至少包含。并且,在該非空的參數(shù)中,必須至少包含一個(gè)套接字。否則一個(gè)套接字。否則 select()函數(shù)將沒有任何套接函數(shù)將沒有任何套接字可以等待。字可以等待。q不管由于什么原因,假如不管由于什么原因,假如select()函數(shù)調(diào)用失敗,函數(shù)調(diào)用失敗,都會返回都會返回SOCKET_ERROR錯(cuò)誤代碼。錯(cuò)誤代碼。 2Timevalnstruct timeval n long tv_sec; /秒秒n long t
10、v_usec; /豪秒豪秒n;qtimeval結(jié)構(gòu)體用于定義結(jié)構(gòu)體用于定義select()函數(shù)的等待時(shí)間。函數(shù)的等待時(shí)間。qtv_sec字段以秒為單位指定該函數(shù)的等待時(shí)間。字段以秒為單位指定該函數(shù)的等待時(shí)間。qtv_usec字段則以毫秒為單位指定該函數(shù)的等待時(shí)則以毫秒為單位指定該函數(shù)的等待時(shí)間。間。n如果在調(diào)用如果在調(diào)用select()函數(shù)時(shí)將等待時(shí)間函數(shù)時(shí)將等待時(shí)間tv_sec和和tv_usec都設(shè)置為都設(shè)置為0,則,則select()調(diào)用在檢查完套接字調(diào)用在檢查完套接字描述符后立即返回,這可用于探詢所選套接字的狀態(tài)。描述符后立即返回,這可用于探詢所選套接字的狀態(tài)。出于對性能方面的考慮,應(yīng)避
11、免這樣的設(shè)置。出于對性能方面的考慮,應(yīng)避免這樣的設(shè)置。n如果在調(diào)用如果在調(diào)用select()函數(shù)時(shí)將函數(shù)時(shí)將timeout指向指向NULL,則,則進(jìn)行阻塞等待,即被監(jiān)視的描述符中只有當(dāng)其中的任進(jìn)行阻塞等待,即被監(jiān)視的描述符中只有當(dāng)其中的任何一個(gè)準(zhǔn)備好讀寫操作時(shí),何一個(gè)準(zhǔn)備好讀寫操作時(shí),select()調(diào)用才返回。調(diào)用才返回。n如果等待時(shí)間如果等待時(shí)間tv_sec和和tv_usec不全為不全為0,則當(dāng)?shù)却?,則當(dāng)?shù)却龝r(shí)間沒有超時(shí)時(shí),時(shí)間沒有超時(shí)時(shí),select()函數(shù)在被檢查的描述符中函數(shù)在被檢查的描述符中有任何一個(gè)套接字準(zhǔn)備好讀寫時(shí)返回。有任何一個(gè)套接字準(zhǔn)備好讀寫時(shí)返回。 3宏宏 為了方便開發(fā)者
12、的使用,為了方便開發(fā)者的使用,Windows Sockets 提提供了下列宏,可用來針對供了下列宏,可用來針對I/O活動(dòng),對活動(dòng),對fd_set結(jié)構(gòu)進(jìn)結(jié)構(gòu)進(jìn)行處理與檢查。行處理與檢查。n FD_CLR(s,*set),從,從 set 集合中刪除集合中刪除 s 套接字套接字n FD_ISSET(s,*set),檢查,檢查s是否為是否為 set集合的一名成集合的一名成員。如果員。如果s 是是 set 集合的一旬成員,則返回集合的一旬成員,則返回 TRUE。n FD_SET(s,*set),將套接字,將套接字 s 加入加入 set 集合。集合。n FD_ZERO(*set),將,將 set 集合初始
13、化為空集合。集合初始化為空集合。4調(diào)用調(diào)用 select()函數(shù)時(shí)使用宏函數(shù)時(shí)使用宏 在開發(fā)在開發(fā)Windows Sockets應(yīng)用程序中,通過下應(yīng)用程序中,通過下面步驟,完成對套接字的可讀可寫判斷。面步驟,完成對套接字的可讀可寫判斷。使用使用FD_ZERO宏,初始化自己感興趣的套接字集宏,初始化自己感興趣的套接字集合合fd_set。 例如例如 FD_ZERO(readfd)。使用使用FD_SET宏,將套接字分配給參與操作的宏,將套接字分配給參與操作的fd_set集合。例如集合。例如FD_SET(s,readfd)。 以該以該fd_set為參數(shù)調(diào)用為參數(shù)調(diào)用select()函數(shù)。等待在指定函數(shù)
14、。等待在指定的的fd_set集合中,集合中,I/O活動(dòng)設(shè)置好這個(gè)套接字。活動(dòng)設(shè)置好這個(gè)套接字。Select()完成后會返回在所有完成后會返回在所有fd_set集合中設(shè)置的集合中設(shè)置的套接字句柄總數(shù),并對每個(gè)集合進(jìn)行相應(yīng)的更新。套接字句柄總數(shù),并對每個(gè)集合進(jìn)行相應(yīng)的更新。 select()函數(shù)成功返回后,使用函數(shù)成功返回后,使用FD_ISSET宏,對宏,對每個(gè)每個(gè)fd_set集合進(jìn)行檢查。例如,集合進(jìn)行檢查。例如,F(xiàn)D_ISSET(s,readfd)。如果該宏的值為。如果該宏的值為TRUE,則,則說明該套接字可讀。說明該套接字可讀。調(diào)用相應(yīng)的調(diào)用相應(yīng)的Windows SocketsAPI進(jìn)行數(shù)據(jù)
15、的接收進(jìn)行數(shù)據(jù)的接收和發(fā)送。和發(fā)送。Select模型的優(yōu)勢和不足模型的優(yōu)勢和不足 nSelect模型優(yōu)勢在于可以同時(shí)對多個(gè)建立起來的套接字模型優(yōu)勢在于可以同時(shí)對多個(gè)建立起來的套接字進(jìn)行有序的管理??梢苑乐箲?yīng)用程序在一次進(jìn)行有序的管理??梢苑乐箲?yīng)用程序在一次I/O調(diào)用過調(diào)用過程中,使阻塞模式套接字被迫進(jìn)入阻塞狀態(tài);使非阻塞程中,使阻塞模式套接字被迫進(jìn)入阻塞狀態(tài);使非阻塞套接字產(chǎn)生套接字產(chǎn)生WSAEWOULDBLOCK錯(cuò)誤。錯(cuò)誤。nSelect()函數(shù)就好像是一個(gè)消息中心,當(dāng)消息到來時(shí),函數(shù)就好像是一個(gè)消息中心,當(dāng)消息到來時(shí),通知應(yīng)用程序接收和發(fā)送數(shù)據(jù),這使得通知應(yīng)用程序接收和發(fā)送數(shù)據(jù),這使得Wi
16、ndows Sockets應(yīng)用程序開發(fā)人員可以把精力更多地集中在如應(yīng)用程序開發(fā)人員可以把精力更多地集中在如何處理數(shù)據(jù)的發(fā)送和接收上。何處理數(shù)據(jù)的發(fā)送和接收上。n完成一次完成一次I/O操作經(jīng)歷了兩次操作經(jīng)歷了兩次Windows Sockets函數(shù)函數(shù)的調(diào)用。例如,當(dāng)接受對方的數(shù)據(jù)時(shí),第一步,調(diào)用的調(diào)用。例如,當(dāng)接受對方的數(shù)據(jù)時(shí),第一步,調(diào)用Select()函數(shù)等待該套接字的滿足條件。第二步,調(diào)函數(shù)等待該套接字的滿足條件。第二步,調(diào)用用recv()函數(shù)接收數(shù)據(jù)。這種結(jié)果與一個(gè)阻塞模式()函數(shù)接收數(shù)據(jù)。這種結(jié)果與一個(gè)阻塞模式的套接字上調(diào)用的套接字上調(diào)用recv()函數(shù)是一樣的。函數(shù)是一樣的。n使用使
17、用Select()函數(shù)的函數(shù)的Windows Sockets程序,其效率程序,其效率可能受損。因?yàn)?,每一個(gè)可能受損。因?yàn)?,每一個(gè)Windows Sockets I/O 調(diào)調(diào)用都會經(jīng)過該函數(shù),因而會導(dǎo)致嚴(yán)重的用都會經(jīng)過該函數(shù),因而會導(dǎo)致嚴(yán)重的CPU額外負(fù)擔(dān)。額外負(fù)擔(dān)。在在CPU的使用率不是關(guān)鍵因素時(shí),這種效率可以接受。的使用率不是關(guān)鍵因素時(shí),這種效率可以接受。但是,當(dāng)需要高效率時(shí),肯定會產(chǎn)生問題。但是,當(dāng)需要高效率時(shí),肯定會產(chǎn)生問題。Section2 Section2 如何完成Select模型下得編程工作? Q2:如何完成:如何完成Select模型下得編程工作?模型下得編程工作?幾個(gè)重要的函數(shù)幾
18、個(gè)重要的函數(shù)WSASocket()WSARecv()WSASend()WSARecv()int WSARecv( SOCKET s, / 當(dāng)然是投遞這個(gè)操作的套接字當(dāng)然是投遞這個(gè)操作的套接字 LPWSABUF lpBuffers, / 接收緩沖區(qū),與接收緩沖區(qū),與Recv函數(shù)不同函數(shù)不同 / 這里需要一個(gè)由這里需要一個(gè)由WSABUF結(jié)構(gòu)構(gòu)成的數(shù)組結(jié)構(gòu)構(gòu)成的數(shù)組 DWORD dwBufferCount, / 數(shù)組中數(shù)組中WSABUF結(jié)構(gòu)的數(shù)量結(jié)構(gòu)的數(shù)量 LPDWORD lpNumberOfBytesRecvd, / 如果接收操作立即完成,如果接收操作立即完成,這里會返回函數(shù)調(diào)用所接收到的字節(jié)數(shù)這里會返回函數(shù)調(diào)用所接收到的字節(jié)數(shù) LPDWORD lpFlags, / 指向標(biāo)志位的指針指向標(biāo)志位的指針 LPWSAOVERLAPPED lpOverlapped, / “綁定綁定”的重疊結(jié)構(gòu)的重疊結(jié)構(gòu) LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine / 完成例程中將會用到的參數(shù),我們這里完成例程中將會用到的參數(shù),我們這里設(shè)置為設(shè)置為 NULL ); WSASend()()int WS
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考物理總復(fù)習(xí)專題二相互作用實(shí)驗(yàn)二探究彈力和彈簧伸長量的關(guān)系練習(xí)含答案
- 江蘇省2015-2015學(xué)年高中英語 Unit3 Amazing people project教案 牛津譯林版必修2
- 八年級歷史下冊 第12課 欣欣向榮的科教文體事業(yè)教案 北師大版
- 2024年九年級語文上冊 第二單元 第6課《敬業(yè)與樂業(yè)》說課稿 新人教版
- 2024-2025學(xué)年高中語文 第二單元 珠星碧月彩云中 4 詞三首(一)教案 語文版必修3
- 2023四年級數(shù)學(xué)下冊 4 小數(shù)的意義和性質(zhì) 3小數(shù)點(diǎn)移動(dòng)引起小數(shù)大小的變化第2課時(shí) 小數(shù)點(diǎn)移動(dòng)引起小數(shù)大小變化的規(guī)律(2)配套教案 新人教版
- 二年級語文上冊 課文3 9 黃山奇石教案 新人教版
- 2024-2025學(xué)年新教材高中歷史 第八單元 中華民族的抗日戰(zhàn)爭和人民解放戰(zhàn)爭 第24課 全民族浴血奮戰(zhàn)與抗日戰(zhàn)爭的勝利教案3 新人教版必修《中外歷史綱要(上)》
- 變壓器報(bào)停委托書
- 租房電器超過使用年限合同(2篇)
- 六年級語文 六年級班家長會
- 內(nèi)科學(xué)(腎臟-內(nèi)分泌-血液)知到章節(jié)答案智慧樹2023年溫州醫(yī)科大學(xué)
- 年產(chǎn)10噸功能益生菌凍干粉的工廠設(shè)計(jì)改
- 地理教育測量與評價(jià)
- 2023上海車展展前報(bào)告
- 事業(yè)單位獎(jiǎng)勵(lì)審批表主要事跡
- 中科大天文學(xué)史課件17近代天體測量和天體力學(xué)的發(fā)展
- 六年級勞動(dòng)與技術(shù)上冊教案
- 馬王堆導(dǎo)引術(shù)獨(dú)立彩圖版
- 小學(xué)一年級語文上學(xué)期教研活動(dòng)記錄(10次)
- GB/T 31315-2014機(jī)械結(jié)構(gòu)用冷拔或冷軋精密焊接鋼管
評論
0/150
提交評論