高級Socket編程技術(shù)_第1頁
高級Socket編程技術(shù)_第2頁
高級Socket編程技術(shù)_第3頁
高級Socket編程技術(shù)_第4頁
高級Socket編程技術(shù)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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í)目標學(xué)習(xí)目標掌握基于掌握基于Select模型的編程方法模型的編程方法掌握基于掌握基于WSAAsync

2、Select模型的編程方法模型的編程方法 復(fù)習(xí)復(fù)習(xí)非阻塞編程有何優(yōu)缺點?非阻塞編程有何優(yōu)缺點?非阻塞非阻塞socket編程編程如何建立一對多的通信?如何建立一對多的通信?-多線程多線程多線程用法多線程用法在在accept()接收一個連接之后,建立一個新線程。()接收一個連接之后,建立一個新線程。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òu)建一個完整的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; /套接字數(shù)量套接字數(shù)量 SOCKET fd_arrayFD_SETSIZE; /套接字數(shù)組套接字數(shù)組 fd_set;nfd_set 是一個管理多個套接字的結(jié)構(gòu)體。在該結(jié)構(gòu)是一個管理多個套接字的結(jié)構(gòu)體。在該結(jié)構(gòu)體中,體中,fd_count 字段指明套接字的數(shù)量,字段指明套接字的數(shù)量,fd_array 字段保存字段保存 fd_count 個套接字。個套接字。nfd_set 最多可以管理最多可以管理64個套接字。個套接字。當(dāng)當(dāng)select() 函數(shù)成功返回后,會在函數(shù)成功返回后,會在 fs_set 結(jié)構(gòu)中,返回剛好未完成結(jié)構(gòu)中,返回剛好未完成I/O操

6、作的所有套接操作的所有套接字句柄的總量字句柄的總量 。readfds參數(shù)將包含符合下面任何一個條件的參數(shù)將包含符合下面任何一個條件的套接字。套接字。q有數(shù)據(jù)可以讀入。此時在該套接字上調(diào)用有數(shù)據(jù)可以讀入。此時在該套接字上調(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ù),而且一個連接正在建函數(shù),而且一個連接正在建立。那么此時調(diào)用立。那么此時調(diào)用accept()函數(shù)會成功。函數(shù)會成功。 writefds參數(shù)將包含符合下面任何一個條件的參數(shù)將包含符合下面任何一個條件的

7、套接字。套接字。q有數(shù)據(jù)可以發(fā)出。此時在該套接字上可以調(diào)用有數(shù)據(jù)可以發(fā)出。此時在該套接字上可以調(diào)用send()等輸出函數(shù),向?qū)Ψ桨l(fā)送數(shù)據(jù)。等輸出函數(shù),向?qū)Ψ桨l(fā)送數(shù)據(jù)。q如果已經(jīng)在一個非阻塞套接字上調(diào)用如果已經(jīng)在一個非阻塞套接字上調(diào)用connect()函函數(shù),此時連接成功。數(shù),此時連接成功。 exceptfds參數(shù)將包含符合下面一個條件的套參數(shù)將包含符合下面一個條件的套接字。接字。q如果已經(jīng)在一個非阻塞套接字上調(diào)用了如果已經(jīng)在一個非阻塞套接字上調(diào)用了connect()函數(shù),此時連接失敗。函數(shù),此時連接失敗。q有帶外(有帶外(Out-of-band,OOB)數(shù)據(jù)可供讀取。)數(shù)據(jù)可供讀取。例:應(yīng)用程

8、序欲判斷某個套接字是否存在可讀的例:應(yīng)用程序欲判斷某個套接字是否存在可讀的數(shù)據(jù),需要進行如下步驟。數(shù)據(jù),需要進行如下步驟。q 將該套接字加入將該套接字加入readfds集合。集合。q 以以readfds為第二個參數(shù)調(diào)用為第二個參數(shù)調(diào)用select()函數(shù)。函數(shù)。q 當(dāng)當(dāng)select()函數(shù)返回時,應(yīng)用程序判斷該套接字函數(shù)返回時,應(yīng)用程序判斷該套接字是否仍然存在于是否仍然存在于readfds集合。集合。q 如果該套接字存在于如果該套接字存在于readfds集合,則表明該套集合,則表明該套接字可讀。此時,應(yīng)用程序調(diào)用接字可讀。此時,應(yīng)用程序調(diào)用recv()等輸入函數(shù)等輸入函數(shù)接收數(shù)據(jù)。接收數(shù)據(jù)。q

9、調(diào)用調(diào)用select()函數(shù)時,函數(shù)時,readfds、writefd和和sexceptfds3個參數(shù)中至少有一個不能設(shè)置為個參數(shù)中至少有一個不能設(shè)置為 NULL。并且,在該非空的參數(shù)中,必須至少包含。并且,在該非空的參數(shù)中,必須至少包含一個套接字。否則一個套接字。否則 select()函數(shù)將沒有任何套接函數(shù)將沒有任何套接字可以等待。字可以等待。q不管由于什么原因,假如不管由于什么原因,假如select()函數(shù)調(diào)用失敗,函數(shù)調(diào)用失敗,都會返回都會返回SOCKET_ERROR錯誤代碼。錯誤代碼。 2Timevalnstruct timeval n long tv_sec; /秒秒n long t

10、v_usec; /豪秒豪秒n;qtimeval結(jié)構(gòu)體用于定義結(jié)構(gòu)體用于定義select()函數(shù)的等待時間。函數(shù)的等待時間。qtv_sec字段以秒為單位指定該函數(shù)的等待時間。字段以秒為單位指定該函數(shù)的等待時間。qtv_usec字段則以毫秒為單位指定該函數(shù)的等待時則以毫秒為單位指定該函數(shù)的等待時間。間。n如果在調(diào)用如果在調(diào)用select()函數(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ù)時將timeout指向指向NULL,則,則進行阻塞等待,即被監(jiān)視的描述符中只有當(dāng)其中的任進行阻塞等待,即被監(jiān)視的描述符中只有當(dāng)其中的任何一個準備好讀寫操作時,何一個準備好讀寫操作時,select()調(diào)用才返回。調(diào)用才返回。n如果等待時間如果等待時間tv_sec和和tv_usec不全為不全為0,則當(dāng)?shù)却瑒t當(dāng)?shù)却龝r間沒有超時時,時間沒有超時時,select()函數(shù)在被檢查的描述符中函數(shù)在被檢查的描述符中有任何一個套接字準備好讀寫時返回。有任何一個套接字準備好讀寫時返回。 3宏宏 為了方便開發(fā)者

12、的使用,為了方便開發(fā)者的使用,Windows Sockets 提提供了下列宏,可用來針對供了下列宏,可用來針對I/O活動,對活動,對fd_set結(jié)構(gòu)進結(jié)構(gòu)進行處理與檢查。行處理與檢查。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ù)時使用宏 在開發(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活動設(shè)置好這個套接字?;顒釉O(shè)置好這個套接字。Select()完成后會返回在所有完成后會返回在所有fd_set集合中設(shè)置的集合中設(shè)置的套接字句柄總數(shù),并對每個集合進行相應(yīng)的更新。套接字句柄總數(shù),并對每個集合進行相應(yīng)的更新。 select()函數(shù)成功返回后,使用函數(shù)成功返回后,使用FD_ISSET宏,對宏,對每個每個fd_set集合進行檢查。例如,集合進行檢查。例如,F(xiàn)D_ISSET(s,readfd)。如果該宏的值為。如果該宏的值為TRUE,則,則說明該套接字可讀。說明該套接字可讀。調(diào)用相應(yīng)的調(diào)用相應(yīng)的Windows SocketsAPI進行數(shù)據(jù)

15、的接收進行數(shù)據(jù)的接收和發(fā)送。和發(fā)送。Select模型的優(yōu)勢和不足模型的優(yōu)勢和不足 nSelect模型優(yōu)勢在于可以同時對多個建立起來的套接字模型優(yōu)勢在于可以同時對多個建立起來的套接字進行有序的管理??梢苑乐箲?yīng)用程序在一次進行有序的管理??梢苑乐箲?yīng)用程序在一次I/O調(diào)用過調(diào)用過程中,使阻塞模式套接字被迫進入阻塞狀態(tài);使非阻塞程中,使阻塞模式套接字被迫進入阻塞狀態(tài);使非阻塞套接字產(chǎn)生套接字產(chǎn)生WSAEWOULDBLOCK錯誤。錯誤。nSelect()函數(shù)就好像是一個消息中心,當(dāng)消息到來時,函數(shù)就好像是一個消息中心,當(dāng)消息到來時,通知應(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ù)時,第一步,調(diào)用的調(diào)用。例如,當(dāng)接受對方的數(shù)據(jù)時,第一步,調(diào)用Select()函數(shù)等待該套接字的滿足條件。第二步,調(diào)函數(shù)等待該套接字的滿足條件。第二步,調(diào)用用recv()函數(shù)接收數(shù)據(jù)。這種結(jié)果與一個阻塞模式()函數(shù)接收數(shù)據(jù)。這種結(jié)果與一個阻塞模式的套接字上調(diào)用的套接字上調(diào)用recv()函數(shù)是一樣的。函數(shù)是一樣的。n使用使

17、用Select()函數(shù)的函數(shù)的Windows Sockets程序,其效率程序,其效率可能受損。因為,每一個可能受損。因為,每一個Windows Sockets I/O 調(diào)調(diào)用都會經(jīng)過該函數(shù),因而會導(dǎo)致嚴重的用都會經(jīng)過該函數(shù),因而會導(dǎo)致嚴重的CPU額外負擔(dān)。額外負擔(dān)。在在CPU的使用率不是關(guān)鍵因素時,這種效率可以接受。的使用率不是關(guān)鍵因素時,這種效率可以接受。但是,當(dāng)需要高效率時,肯定會產(chǎn)生問題。但是,當(dāng)需要高效率時,肯定會產(chǎn)生問題。Section2 Section2 如何完成Select模型下得編程工作? Q2:如何完成:如何完成Select模型下得編程工作?模型下得編程工作?幾個重要的函數(shù)幾

18、個重要的函數(shù)WSASocket()WSARecv()WSASend()WSARecv()int WSARecv( SOCKET s, / 當(dāng)然是投遞這個操作的套接字當(dāng)然是投遞這個操作的套接字 LPWSABUF lpBuffers, / 接收緩沖區(qū),與接收緩沖區(qū),與Recv函數(shù)不同函數(shù)不同 / 這里需要一個由這里需要一個由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, / 指向標志位的指針指向標志位的指針 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論