第三講 網(wǎng)絡(luò)程序設(shè)計(jì)基礎(chǔ)_第1頁(yè)
第三講 網(wǎng)絡(luò)程序設(shè)計(jì)基礎(chǔ)_第2頁(yè)
第三講 網(wǎng)絡(luò)程序設(shè)計(jì)基礎(chǔ)_第3頁(yè)
第三講 網(wǎng)絡(luò)程序設(shè)計(jì)基礎(chǔ)_第4頁(yè)
第三講 網(wǎng)絡(luò)程序設(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第三講 網(wǎng)絡(luò)程序設(shè)計(jì)基礎(chǔ)學(xué)習(xí)要點(diǎn):n 學(xué)習(xí)介紹Windows網(wǎng)絡(luò)程序設(shè)計(jì)的基本方法和概念;一、內(nèi)存影射文件n 就是在內(nèi)存中申請(qǐng)一塊內(nèi)存空間,將一個(gè)文件與這塊空間相聯(lián),將一個(gè)文件句柄與這塊內(nèi)存相關(guān)聯(lián),幾個(gè)進(jìn)程就可以通過(guò)操作這個(gè)影射文件,實(shí)現(xiàn)進(jìn)程間的通信。在Windows中,通過(guò)CreateFileMapping來(lái)創(chuàng)建內(nèi)存影射文件。二、郵件槽(MailSlot)n 郵件槽:是一種簡(jiǎn)單的單向的進(jìn)程間通信方式。通過(guò)郵件槽,客戶端程序可以將消息傳送或廣播給一個(gè)或多個(gè)服務(wù)器進(jìn)程。在同一臺(tái)計(jì)算機(jī)的不同進(jìn)程之間,或在跨越整個(gè)網(wǎng)絡(luò)的不同計(jì)算機(jī)的進(jìn)程之間,協(xié)助進(jìn)行消息的傳輸。郵件槽(MailSlot)n 郵件槽通

2、常用“數(shù)據(jù)報(bào)”在網(wǎng)絡(luò)上傳播,數(shù)據(jù)報(bào)實(shí)際上是一些小數(shù)據(jù)包,以一種無(wú)連接的形式傳播,不要求對(duì)方收到確認(rèn)信息。顯然,這是一種“不可靠”的數(shù)據(jù)傳輸。郵件槽(MailSlot)n 郵件槽的優(yōu)點(diǎn):它使客戶端程序能非常容易地將廣播消息發(fā)送給一個(gè)或多個(gè)應(yīng)用。n 郵件槽的缺點(diǎn):只允許從客戶到服務(wù)器,建立一種不可靠的單向數(shù)據(jù)通信。郵件槽(MailSlot)n 服務(wù)器郵件槽示例代碼:n / Create the mailslotif (Mailslot=CreateMailSlot( .MailslotMyslot, 0, MAILSLOT_WAIT_FOREVER,NULL) = INVALID_HANDLE_V

3、ALUE)return;while(ReadFile(Mailslot, buffer, 256, &NumberofBytersRead, NULL) != 0) printf(“%.*sn”, NumberofBytesRead, buffer);郵件槽(MailSlot)n 客戶郵件槽示例代碼:n / Create the mailslot sprintf(ServerName,%sMailslotMyslot,a rgv);if (Mailslot=CreateFile(ServerName, GENERIC_WRITE,FILE_SHARE_READ,OPEN_EXISTING,FI

4、LE_ATT RIBUTE_NORMAL,NULL) = INVALID_HANDLE_VALUE)return;WriteFile(Mailslot, “This is a test”, 14, &BytesWritten);ClosHandle(Mailslot);三、命名管道(Named Pipes)n 命名管道(Named Pipes)是一種簡(jiǎn)單的進(jìn)程間通信機(jī)制,命名管道可以在同一臺(tái)計(jì)算機(jī)的不同進(jìn)程之間或在跨越一個(gè)網(wǎng)絡(luò)不同計(jì)算機(jī)之間,支持可靠的、單向或雙向的數(shù)據(jù)通信。將命名管道作為一種網(wǎng)絡(luò)編程方案使用時(shí), 它實(shí)際上建立一個(gè)簡(jiǎn)單的客戶機(jī)/服務(wù)器數(shù)據(jù)通信體系,可以在其中可靠的傳輸數(shù)據(jù)。命名

5、管道命名規(guī)范n 命名管道命名規(guī)范格式:ServerPipepathname Server:指定一個(gè)服務(wù)器的名字Pipe:是一個(gè)不可變化的“硬編碼”字串,原樣照錄,不區(qū)分大小寫。pathname:使應(yīng)用程序可以唯一地定義及標(biāo)定一個(gè) 命名管道的名字,而且可以設(shè)置多級(jí)目錄:這幾個(gè)字符串均是合法的命名管道的名字:myserverPIPEmypipeTestserverpipecooldirectoryfuntestjim.PipeEasynamedpipe命名管道(Named Pipes)n 服務(wù)器實(shí)現(xiàn)細(xì)節(jié)(1) 使用API函數(shù)CreateNamedPipe,創(chuàng)建一個(gè)命名管道實(shí)例句柄;(2) 使用AP

6、I函數(shù)ConnectNamePipe,在命名管道實(shí)例上客戶機(jī)連接請(qǐng)求。(3) 分別使用ReadFile和WriteFile這兩個(gè)API 函數(shù),從客戶機(jī)接受數(shù)據(jù),或?qū)?shù)據(jù)發(fā)給客戶端;(4) 使用API函數(shù)DisconnectNamePipe,關(guān)閉命名管道連接;(5) 使用API函數(shù)CloseHandle,關(guān)閉命名管道句柄。命名管道(Named Pipes)n 服務(wù)器實(shí)現(xiàn)細(xì)節(jié)if (PipeHandle=CreateNamedPipe(“.PipeJim”,PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE|PIPE_READMODE_BYTE,1,0,0,1000,NULL) r

7、eturn;if (ConnectNamedPipe(PipeHandle, NULL) = 0)return; if (ReadFile(PipeHandle,buffer,sizeof(buffer), &BytesRead,NULL)=0) return;if (DisconnectNamedPipe(PipeHandle)=0) return;CloseHandle(PipeHandle);命名管道(Named Pipes)n 客戶機(jī)實(shí)現(xiàn)細(xì)節(jié)(1) 使用API函數(shù)WaitNamedPipe,等候一個(gè)命名管道實(shí)例可供自己使用。(2) 使用API函數(shù)CreateFile,建立與命名管道的連

8、接。(3) 用API函數(shù)ReadFile和WriteFile,分別向服務(wù)器發(fā)送數(shù)據(jù),或從中接受數(shù)據(jù)。(4)使用API函數(shù)CloseHandle,關(guān)閉命名管道句柄。命名管道(Named Pipes)n 客戶機(jī)實(shí)現(xiàn)細(xì)節(jié)if (WaitNamedPipe(PIPE_NAME,NMPWAIT_FOREVER)=0)return;if (PipeHandle=CreateFile(PIPE_NAME, GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)=INVALID_HANDLE_VALUE) retu

9、rn;if (WriteFile(PipeHandle,“This is a test”,14,&BytesWritten,NULL)=0) return;CloseHandle(PipeHandle);四、套接字(Socket)n 套接字(Socket)是目前網(wǎng)絡(luò)程序設(shè)計(jì)應(yīng)用最多的程序設(shè)計(jì)方法。1. 套接字的發(fā)展n 1980年伯克利大學(xué)發(fā)行的BSD UNIX開始支持TCP/IP協(xié)議,并且提出了一種叫做套接字(Socket)的編程接口。它提供了一些非常靈活的函數(shù),有助于程序員針對(duì)不同情況編寫出高效的網(wǎng)絡(luò)通信程序。n 套接字編程接口不僅適合TCP/IP協(xié)議,同樣也適合其他的網(wǎng)絡(luò)協(xié)議,它已經(jīng)成為網(wǎng)

10、絡(luò)編程接口的標(biāo)準(zhǔn)。Windows操作系統(tǒng)也提供了全部的套接字函數(shù)(WinSocket),并對(duì)它進(jìn)行了擴(kuò)展。2. 幾個(gè)基本概念n 面向連接和無(wú)連接面向連接的服務(wù)中,進(jìn)行數(shù)據(jù)交換之前, 必須與通信方建立一條路徑,既確定了通信方之間存在路由,又保證了通信雙方是活動(dòng)的,都可以彼此響應(yīng),但需要很多額外的開支,大部分面向連接的協(xié)議為保證投遞無(wú)誤。無(wú)連接協(xié)議不保證接受端是否正在收聽。無(wú)連接協(xié)議類似于郵政服務(wù)。幾個(gè)基本概念n 可靠性和次序性可靠性保證了發(fā)送端發(fā)出的每個(gè)字節(jié)都能到達(dá)既定的接受端,不具備可靠性的協(xié)議則不能保證每個(gè)字節(jié)都能到達(dá)接受端, 同樣不能保證數(shù)據(jù)的完整性。次序性是指對(duì)數(shù)據(jù)到達(dá)接受端的順序進(jìn)行處

11、理,保護(hù)次序性的協(xié)議保證接受端收到數(shù)據(jù)順序就是數(shù)據(jù)的發(fā)送順序。幾個(gè)基本概念n 從容關(guān)閉從容關(guān)閉只出現(xiàn)在面向連接的協(xié)議中。在這種關(guān)閉過(guò)程中,一方開始關(guān)閉通信會(huì)話,但另一方仍然可以讀取線上或網(wǎng)絡(luò)堆棧上已掛起的數(shù)據(jù)。如果面向連接的協(xié)議 不支持從容關(guān)閉,都會(huì)導(dǎo)致連接立即中斷, 數(shù)據(jù)丟失,接受端不能讀取數(shù)據(jù)這些情況出現(xiàn)。幾個(gè)基本概念n 廣播數(shù)據(jù)廣播數(shù)據(jù)即數(shù)據(jù)從一個(gè)工作站發(fā)出,局 域網(wǎng)內(nèi)的所有其他所有工作站都能收到它。這一特性適用用于無(wú)連接性,因?yàn)長(zhǎng)AN上的所有機(jī)器的網(wǎng)卡都可獲得并處理廣播消息。各個(gè)機(jī)器受到廣播包后,會(huì)花時(shí)間來(lái)處 理這個(gè)數(shù)據(jù)包,看是否有應(yīng)用對(duì)他感興趣, 所以廣播數(shù)據(jù)對(duì)網(wǎng)絡(luò)和機(jī)器的效率有一定

12、的影響。一般情況下,路由器不會(huì)傳送廣播包。幾個(gè)基本概念n 多播數(shù)據(jù)多播數(shù)據(jù)是指一個(gè)進(jìn)程發(fā)送數(shù)據(jù)的能力, 這些數(shù)據(jù)將由一個(gè)或多個(gè)接受端進(jìn)行接受。進(jìn)程加入一個(gè)多播會(huì)話的方法和采用的基層協(xié)議有關(guān)。比如,IP協(xié)議下,多播是廣播的一種變形,IP多播要求對(duì)收發(fā)數(shù)據(jù)感興趣加入一個(gè)特定的組。只有綁定組地址的數(shù)據(jù)才會(huì)被網(wǎng)絡(luò)硬件撿起。視頻會(huì)議應(yīng)用常常使用多播。幾個(gè)基本概念n 服務(wù)質(zhì)量(QOS,Quality of Service)服務(wù)質(zhì)量是應(yīng)用的一種能力,用以請(qǐng)求針對(duì)專門用途分配特定的帶寬。服務(wù)質(zhì)量的好處可在流式(媒體)的傳輸上見(jiàn)到。幾個(gè)基本概念n TCP面向連接的通信是通過(guò)“傳輸控制協(xié) 議”(Transmiss

13、ion Control Protocol, TCP)來(lái)完成的,TCP提供兩臺(tái)計(jì)算機(jī)之間的可靠無(wú)錯(cuò)的數(shù)據(jù)傳輸。應(yīng)用程序利用TCP進(jìn)行通信時(shí),源和目標(biāo)之間會(huì)建立一個(gè)虛擬連接。這個(gè)連接一旦建立,兩臺(tái)計(jì)算機(jī)之間就可以把數(shù)據(jù)當(dāng)作一個(gè)雙向字節(jié)流來(lái)進(jìn)行交換。幾個(gè)基本概念n UDP無(wú)連接通信是通過(guò)“用戶數(shù)據(jù)報(bào)協(xié)議”(User Datagram Protocol,UDP)來(lái)完成的,UDP不保證可靠數(shù)據(jù)的傳輸,但能夠向若干個(gè)目標(biāo)發(fā)送數(shù)據(jù),接收若干個(gè)源的數(shù)據(jù)。簡(jiǎn)單說(shuō),如果一個(gè)客戶機(jī)向服務(wù)器發(fā)送數(shù)據(jù),這一數(shù)據(jù)會(huì)立即發(fā)出,不管服務(wù)器是否已準(zhǔn)備接受數(shù)據(jù)。如果服務(wù)器收到客戶機(jī)的數(shù)據(jù),它不會(huì)確認(rèn)收到與否。3. 基本的套接字函

14、數(shù)n socket:創(chuàng)建一個(gè)套接字SOCKET socket(int af, int type, int protocol)af: 指定地址族,例如:AF_INET指IPV4地址,AF_INET6指IPV6地址;type: 指定創(chuàng)建套接字的類型,可以是SOCK_STREAM(TCP),SOCK_DGRAM(UDP),SOCK_RAW;protocol:特定的協(xié)議類型,如IPPROTO_TCP(TCP),IPPROTO_UDP(UD P),IPPROTO_ICMP(ICMP)基本的套接字函數(shù)n bind:把一個(gè)本地地址和一個(gè)套接字綁定int bind(SOCKET s, struct socka

15、ddr Far *name, int namelen);s: 待綁定的套接字描述句柄;name: 指向分配給套接字地址的指針;namelen: 包含的地址的字節(jié)長(zhǎng)度;struct sockaddr short sin_family/ 一定是AF_INET u_short sin_port;/ 端struct in_addrsin_addr;/ IP地址charsin_zero8;/ 填充字符基本的套接字函數(shù)n listen:設(shè)置套接字進(jìn)入偵聽狀態(tài)int listen(SOCKET s, int backlog); s: 待綁定的套接字描述句柄;int backlog: 等待連接的隊(duì)列最大長(zhǎng)度,

16、一般設(shè)為SOMAXCONN;基本的套接字函數(shù)n connect:函數(shù)connect為一個(gè)指定的套接字建立連接。int connect(SOCKET s, struct sockaddrFAR *name, int namelen)s: 未連接的套接字描述句柄; name: 連接到的套接字地址; namelen: name參數(shù)的字節(jié)長(zhǎng)度?;镜奶捉幼趾瘮?shù)n accept:接受對(duì)指定套接字的連接請(qǐng)求,返回一個(gè)代表連接的套接字。int accept(SOCKET s, struct sockaddrFAR *addr, int namelen)s: 指定接受連接請(qǐng)求的SOCK_STREAM類型套接字

17、的描述句柄。addr: 它接受連接請(qǐng)求方的地址;addrlen: addr參數(shù)的字節(jié)長(zhǎng)度?;镜奶捉幼趾瘮?shù)n gethostbyaddr和gethostbyname:gethostbyaddr返回相應(yīng)網(wǎng)絡(luò)地址的主機(jī)信息;gethostbyname從一個(gè)主機(jī)數(shù)據(jù)庫(kù)中返回對(duì)應(yīng)網(wǎng)絡(luò)的主機(jī)信息?;镜奶捉幼趾瘮?shù)n recv: 從一個(gè)已經(jīng)連接的套接字接受數(shù)據(jù)int recv(SOCKET s,char FAR *buf, int len, int flags)s: 已經(jīng)連接的套接字句柄; buf: 接受數(shù)據(jù)緩沖區(qū); len: 緩沖區(qū)的長(zhǎng)度; flags: 接受方法標(biāo)志。基本的套接字函數(shù)n recvfro

18、m: 接受一個(gè)數(shù)據(jù)報(bào)并保存數(shù)據(jù)報(bào)的源地址int recvfrom(SOCKET s,char FAR *buf,int len, int flags,struct sockaddr FAR*from, int FAR * fromlen) s: 已經(jīng)綁定的套接字句柄; buf: 接受數(shù)據(jù)緩沖區(qū); len: 緩沖區(qū)的長(zhǎng)度; flags: 接受方法標(biāo)志from: 保存返回的源地址;fromlen: 存放from緩沖區(qū)的長(zhǎng)度。基本的套接字函數(shù)n send: 從一個(gè)已經(jīng)連接的套接字接受數(shù)據(jù)int send(SOCKET s,char FAR *buf, int len, int flags)s: 已經(jīng)

19、連接的套接字句柄; buf: 包含發(fā)送數(shù)據(jù)的緩沖區(qū); len: 緩沖區(qū)的長(zhǎng)度;flags: 發(fā)送方法標(biāo)志?;镜奶捉幼趾瘮?shù)n sendto: 向指定的目的發(fā)送數(shù)據(jù)int sendto(SOCKET s,char FAR *buf, intlen, int flags, struct sockaddr FAR*to,int tolen)s: 已經(jīng)連接的套接字句柄; buf: 包含發(fā)送數(shù)據(jù)的緩沖區(qū); len: 緩沖區(qū)的長(zhǎng)度;flags: 發(fā)送方法標(biāo)志;to: 保存返回的源地址;tolen: 存放to緩沖區(qū)的長(zhǎng)度?;镜奶捉幼趾瘮?shù)n shutdownint shutdown(SOCKET s, in

20、t how) s: 套接字描述句柄how: 標(biāo)志參數(shù),描述不再允許的操作類型基本的套接字函數(shù)n inet_addr,inet_ntoainet_addr把一個(gè)IPV4版本的因特網(wǎng)點(diǎn)分地址字符串轉(zhuǎn)換成和in_addr結(jié)構(gòu)一致的二進(jìn)制地址形式;inet_ntoa把一個(gè)IPV4版本in_addr結(jié)構(gòu)形式的因特網(wǎng)地址轉(zhuǎn)換成標(biāo)準(zhǔn)的因特網(wǎng)點(diǎn)分地址字符串。基本的套接字函數(shù)n closesocket: 關(guān)閉一個(gè)存在的套接字int closesocket(SOCKET s)s: 將要關(guān)閉的套接字句柄;4.套接字編程基本流程服務(wù)器客戶機(jī)連接請(qǐng)求關(guān)閉連接采用 協(xié)議通信套接字程序流程結(jié)構(gòu)closesocketclos

21、esocketsend(發(fā)送數(shù)據(jù))recv(連接)recv(接受數(shù)據(jù))send(發(fā)送數(shù)據(jù))accept(接受連接)connect(連接)接受連接listen(等待連接)bind(綁定地址)bind(綁定地址)socket(分配套接字)socket(分配套接字)套接字編程基本流程客戶機(jī)服務(wù)器采用UDP協(xié)議通信套接字程序流程結(jié)構(gòu)closesocketclosesocketsendto(發(fā)送數(shù)據(jù))recvfrom(接受數(shù)據(jù))recvfrom(接受數(shù)據(jù))sendto(發(fā)送數(shù)據(jù))bind(綁定地址)bind(綁定地址)socket(分配套接字)socket(分配套接字)5.幾種服務(wù)器實(shí)現(xiàn)方案n 在套接字

22、編程中,客戶機(jī)的編程較簡(jiǎn)單,但服務(wù)器要考慮同時(shí)連接多個(gè)客戶機(jī),而且要盡可能提高服務(wù)效率,因此,服務(wù)器方程序設(shè)計(jì)比較復(fù)雜,要根據(jù)不同的情況采用不同的方案。在Windows操作系統(tǒng)中,提供了多種方案可供選擇。幾種服務(wù)器實(shí)現(xiàn)方案n WSAAsySelect方案應(yīng)用程序可在一個(gè)或多個(gè)套接字上,接受以Windows消息為基礎(chǔ)的網(wǎng)絡(luò)。主要的網(wǎng)絡(luò)有:FD_READ: 接受可讀FD_WRITE: 接受可寫FD_ACCEPT: 接受有連接進(jìn)入FD_CONNECT: 接受連接完成統(tǒng)治;FD_CLOSE: 接受套接字關(guān)閉的統(tǒng)治。幾種服務(wù)器實(shí)現(xiàn)方案n WSAEventSelect方案和WSAAsyncSelect類似

23、,它也允許應(yīng)用程序在用程序可在一個(gè)或多個(gè)套接字上,接受以為基礎(chǔ)的網(wǎng)絡(luò)時(shí)間。它與WSAAsySelect的主要區(qū)別在于網(wǎng)絡(luò)會(huì)投遞到一個(gè)對(duì)象句柄,而非投遞到一個(gè)窗口句 柄。但該方法一次最多只能處理64個(gè)套接字。幾種服務(wù)器實(shí)現(xiàn)方案n 多線程方式即服務(wù)器每接受到一個(gè)連接請(qǐng)求后,就為這個(gè)連接套接字創(chuàng)建一個(gè)新的工作線程, 來(lái)處理客戶機(jī)的各種網(wǎng)絡(luò)數(shù)據(jù)。幾種服務(wù)器實(shí)現(xiàn)方案n 完成端口方式(Completion Port)完成端口是最為復(fù)雜的一種方案,假如應(yīng) 用程序要同時(shí)管理成百上千的套接字,并 且希望隨著系統(tǒng)內(nèi)安裝的CPU數(shù)量的增加,應(yīng)用程序的性能也可以線性提高。五、計(jì)算機(jī)支持的協(xié)同工作(CSCW)n 計(jì)算機(jī)支持的協(xié)同工作(CSCW)(Computer Supported Cooperative Work)n 地域分散的一個(gè)群體借助計(jì)算機(jī)及其網(wǎng)絡(luò)技術(shù), 共同協(xié)調(diào)與協(xié)作來(lái)完成一項(xiàng)任務(wù),包括群體工作 方式研究和支持群體工作的相關(guān)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論