網(wǎng)絡(luò)編程復(fù)習(xí)題_第1頁
網(wǎng)絡(luò)編程復(fù)習(xí)題_第2頁
網(wǎng)絡(luò)編程復(fù)習(xí)題_第3頁
網(wǎng)絡(luò)編程復(fù)習(xí)題_第4頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機網(wǎng)絡(luò)編程復(fù)習(xí)題1、說明 C/S 模式的概念、工作過程以及基于因特網(wǎng)的C/S 模式的應(yīng)用程序的特點。答:網(wǎng)絡(luò)應(yīng)用進程之間通信時, 普遍采用了客戶機 /服務(wù)器 (Client/Server) 交互模式, 簡稱 C/S 模式。客戶機和服務(wù)器均是運行在計算機中網(wǎng)絡(luò)協(xié)議棧之上的應(yīng)用進程, 它們 借助網(wǎng)絡(luò)協(xié)議棧進行通信。 而 C/S 模式描述了進程之間服務(wù)與被服務(wù)的關(guān)系。客戶機是服務(wù)的請求方(被服務(wù)方) ,服務(wù)器是服務(wù)的提供方。服務(wù)器的工作過程是:1) 打開一通信通道, 并告知服務(wù)器所在的主機, 它愿意在某一公認(rèn)的地址上 (熟知端口)接收客戶請求。2) 等待客戶的請求到達該端口。3) 服務(wù)器接收到服

2、務(wù)請求, 處理該請求并發(fā)送應(yīng)答信號。 為了能并發(fā)地接收 多個客戶的服務(wù)請求,要激活一個新進程或新線程來處理這個客戶請求。 服務(wù)完成后,關(guān)閉此新進程與客戶的通信鏈路,并終止。4) 返回第二步,等待并處理另一客戶請求。5) 在特定的情況下,關(guān)閉服務(wù)器客戶方的工作過程:1) 打開一通信通道,并連接到服務(wù)器所在主機的特定監(jiān)聽端口。2) 向服務(wù)器發(fā)送請求報文, 等待并接收應(yīng)答; 繼續(xù)提出請求。 與服務(wù)器的會 話按照應(yīng)用協(xié)議進行。3) 通信結(jié)束后,關(guān)閉通信通道并終止?;谝蛱鼐W(wǎng)的 C/S 模式的應(yīng)用程序的特點有:1) 客戶和服務(wù)器都是軟件進程。它指出的是提供服務(wù)和被服務(wù)的關(guān)系。2) 非對稱性: 服務(wù)器通過

3、網(wǎng)絡(luò)提供服務(wù), 客戶通過網(wǎng)絡(luò)使用服務(wù), 這種不對 稱性體現(xiàn)在軟件結(jié)構(gòu)和工作過程上。3) 對等性:客戶和服務(wù)器必有一套共識的約定, 必與以某種應(yīng)用層協(xié)議相聯(lián), 并且協(xié)議必須在通信的兩端實現(xiàn)。4) 服務(wù)器的被動性: 服務(wù)器必須先行啟動, 只要有客戶請求, 就立即處理并 響應(yīng)。但決不主動提供服務(wù)。5) 客戶機的主動性: 一次請求與服務(wù)的過程是由客戶機首先激發(fā)的。 客戶可以隨時向服務(wù)器提出請求,通過網(wǎng)絡(luò)得到服務(wù)。6) 一對多:一個服務(wù)器可以為多個客戶服務(wù),客戶也可以連接到多個服務(wù)器。7)分布性與共享性:資源被組織、存儲在分散的服務(wù)器端,可通過網(wǎng)絡(luò)為多個客戶端使用。2、畫框圖說明無連接數(shù)據(jù)報套接字編程的

4、基本步驟。答:無連接的套接字編程有兩種模式:C/S (客戶/服務(wù)器)模式和P2P (對等)模式。(1 )對等模式數(shù)據(jù)報套接字的編程模型:程序甲程序乙(2)客戶/服務(wù)器模式編程模型服務(wù)器客戶端3、畫框圖說明服務(wù)器端和客戶機端操作流式套接字的基本步驟??蛻舳朔?wù)器端対子監(jiān)聽套接宇對子連接套接宇4、使用CAsyncSocket類編寫基于流式套接字網(wǎng)絡(luò)應(yīng)用程序的一般步驟是什么?CAsyncSocket可以接收和處理哪些網(wǎng)絡(luò)事件?當(dāng)這些網(wǎng)絡(luò)事件發(fā)生時,MFC框架做何處理?答:使用CAsyncSocket類編寫基于流式套接字網(wǎng)絡(luò)應(yīng)用程序的一般步驟如下:1) 從CAsyncSocket類派生出自己的套接字類

5、。2) 對從CAsyncSocket類派生出來的套接字類進行修改,主要是對自己感興趣的消息處理函數(shù)進行重載,使得在套接字上發(fā)生特定的事件時,能做出相應(yīng)的響應(yīng)。3) 服務(wù)器端:a) 構(gòu)造一個監(jiān)聽套接字。比如:CListenSocket sockSrv; / CListenSocket 是從 CAsyncSocket 類派生出來的 監(jiān)聽套接字類b) 創(chuàng)建SOCKET句柄,綁定到指定端口。比如:sockSrv.Create(nPort); / nPort 是套接字監(jiān)聽的端口號。c) 啟動監(jiān)聽,準(zhǔn)備接受客戶方連接請求。比如:sockSrv.Listen();d) 在監(jiān)聽套接字對象的 FD_ACCEPT

6、 事件處理函數(shù)中,創(chuàng)建一個連接套接 字來接受客戶方的連接請求。比如:CRecvSocket sockRecv; / CRecvSocket 是從 CAsyncSocket 類派生出來的 連接套接字類sockSrv.Accept(sockRecv);e) 在連接套接字對象的 FD_READ 事件處理函數(shù)中, 調(diào)用連接套接字對象的 成員函數(shù) Receive() 來接收從客戶發(fā)來的數(shù)據(jù)。比如: sockRecv.Receive(pBuf,nLen);f) 調(diào)用連接套接字類對象的成員函數(shù)Sen d()把數(shù)據(jù)發(fā)送給客戶方。比如:sockRecv.Send(pBuf,nLen);g) 關(guān)閉連接套接字對象,

7、結(jié)束與客戶方的通信。比如:sockRecv.Close();其中監(jiān)聽套接字和連接套接字可以是同一個 CAsyncSocket 的派生類的對象。4) 客戶端:a) 構(gòu)造一個套接字,并使用默認(rèn)參數(shù)創(chuàng)建它。比如:CClientSocket sockClient;sockClient.Create();b) 與服務(wù)器方建立連接。比如:sockClient.Connect(strServerAddr,nPort);c) 使用套接字對象的 Sen d()成員函數(shù)把數(shù)據(jù)發(fā)送到服務(wù)器。比如: sockClient.Send(pBuf,nLen);d) 在套接字對象的 FD_READ 事件處理函數(shù)中, 調(diào)用連接

8、套接字對象的成員 函數(shù)Receive。來接收從服務(wù)器方發(fā)來的數(shù)據(jù)。比如: sockClient.Receive(pBuf,nLen);e) 關(guān)閉套接字對象。比如:sockClient.Close();CAsyncSocket 類可以接收和處理下述網(wǎng)絡(luò)事件:1) FD_READ 事件:通知有數(shù)據(jù)可讀。2) FD_WRITE 事件:通知可以寫數(shù)據(jù)。3) FD_ACCEPT 事件:通知監(jiān)聽套接字有連接請求可以接受。4) FD_CONNECT 事件:通知請求連接的套接字,連接的要求已被處理。5) FD_CLOSE 事件:通知套接字已關(guān)閉。6) FD_OOB 事件通知:通知將有帶外數(shù)據(jù)到達。當(dāng)上述的網(wǎng)絡(luò)

9、事件發(fā)生時, MFC 框架按照 Windows 的消息驅(qū)動機制,把消息發(fā)送給相 應(yīng)的套接字對象,并調(diào)用作為該對象成員函數(shù)的事件處理函數(shù)對相應(yīng)的網(wǎng)絡(luò)事件進行處理。5、說明基于流式套接字的 CSocket 類編程模型(1) 服務(wù)器端CSocket sockServ; / 創(chuàng)建空的服務(wù)器端監(jiān)聽套接字對象。sockServ.Create( nPort ); / 用眾所周知的端口,創(chuàng)建監(jiān)聽套接字對象的底層套接字句柄。sockServ.Listen();/ 啟動對于客戶端連接請求的監(jiān)聽。CSocket sockRecv; / 創(chuàng)建空的服務(wù)器端連接套接字對象。sockServ.Accept( sockRec

10、v); / 接收客戶端的連接請求,并將其他任務(wù)轉(zhuǎn)交連接套接字對象。/創(chuàng)建文件對象并關(guān)聯(lián)到連接套接字對象。CSockFile* file ;file = new CSockFile( &sockRecv);/ 創(chuàng)建用于輸入 /輸出的歸檔對象,并必須關(guān)聯(lián)到文件對象。CArchive* arIn, arOut;arIn = CArchive(&file, CArchive:load);arOut = CArchive( &file, CArchive:store);arIn dwValue; / 進行數(shù)據(jù)輸入。adOut dwValue;/ 進行數(shù)據(jù)輸入。adOut dwValue; / 進行數(shù)據(jù)輸

11、出??梢苑磸?fù)進行。 sockClient.Close();/ 傳輸完畢,關(guān)閉套接字對象。6、現(xiàn)已經(jīng)聲明如下變量,其中num 的值是已經(jīng)創(chuàng)建并存儲在數(shù)組s 中套接字的數(shù)量?,F(xiàn)要求通過select模型來檢查數(shù)組 s中的套接字是否有數(shù)據(jù)可以接收,只有當(dāng)至少一個套接實際上有數(shù)據(jù)可接收才會從select中返回。若某一套接字上有數(shù)據(jù)可以接收, 則通過調(diào)用函數(shù) MyRecv(SOCKET s) 來完成數(shù)據(jù)接收和處理操作。 試補充完成如下程序來實現(xiàn)上述功能。SOCKET s10;fd_set fdread;int num;答:int i,ret;FD_ZERO(&fdread);for(i=0;i0)for(

12、i=0;inum;i+)if(FD_ISSET(si,&fdread)MyRecv(si);7、使用 WSAAsyncSelect 異步 I/O 模型編寫一個基于對話框的網(wǎng)絡(luò)應(yīng)用程序,請根據(jù) 要求,完成以下題目:1) 當(dāng)在套接字 MySocket 上有數(shù)據(jù)可讀或者對方釋放與 MySocket 的連接時, 向 對話框發(fā)送一條消息號為 WM_MYSOCKMSG 消息。該對話框的句柄保存在變量 hWnd 中。請寫出能完成該功能的 WSAAsyncSelect() 函數(shù)調(diào)用語句。答:完成該功能的語句如下:WSAAsyncSelect(MySocket, hWnd, WM_MYSOCKMSG , FD_

13、READ | FD_CLOSE);2) 對 話 框 通過 調(diào) 用消 息 處理 函 數(shù) void MyMsgHandle(WPARAM wParam, LPARAM lParam) 完成對 WM_MYSOCKMSG 消息的處理。為實現(xiàn)該功能, 如何對 MFC 生成的對話框應(yīng)用程序進行修改 ?答:在對話框中添加自定義消息的方法為:a) 定義消息號:可以使用宏定義語句“#define”增加一個用戶自定義消息,該定義的作用范圍應(yīng)該包括整個類。該消息號不能與現(xiàn)有消息的消息相 同。通常用戶自定義的消息號從系統(tǒng)定義的常量 WM_USER 開始分配。 例如:#define WM_MYSOCKMSG (WM_U

14、SER+1)b) 增加消息處理函數(shù): 在對話框中增加一個成員函數(shù), 用于對自定義消息進 行處理。比如:void MyMsgHandle(WPARAM wParam, LPARAM lParam);c) 在對話框類的頭文件中,移動消息處理函數(shù)聲明到類的 AFX_MSG 塊, 并在函數(shù)聲明前面添加 afx_msg。比如:/ Generated message map functions/AFX_MSG(CTestDlg)afx_msg void MyMsgHandle(WPARAM wParam, LPARAM lParam);/AFX_MSGDECLARE_MESSAGE_MAP()d) 在類的

15、實現(xiàn)文件的消息塊中,使用 ON_MESSAGE 宏指令將消息映射到 消息處理函數(shù)。比如:BEGIN_MESSAGE_MAP(CTestDlg, CDialog) /AFX_MSG_MAP(CTestDlg)ON_MESSAGE(WM_MYMSG, MyMsgHandle)/AFX_MSG_MAPEND_MESSAGE_MAP()e) 在消息處理函數(shù)中添加代碼, 以實現(xiàn)對消息的處理。 傳遞給消息處理函數(shù) 的參數(shù) wParam 和 lParam 攜帶了與消息相關(guān)的更詳細的信息。3) 若接收到對方發(fā)送的消息, 將消息直接輸出; 若是對方釋放連接, 則顯示 “對 方掉線”,然后 關(guān)閉套接字。請 給出實

16、 現(xiàn)該功能的 消 息處理函 數(shù) void MyMsgHandle(WPARAM wParam, LPARAM lParam) 。答:相應(yīng)的關(guān)鍵代碼如下:switch( WSAGETSELECTEVENT(lParam)case FD_READ:接收并顯示消息break;case FD_CLOSE:/輸出對方掉線closesocket(wParam);break;default:8、簡述 WSAEventSelect 事件選擇模型的編程模型。 答: WSAEventSelect 事件選擇模型的編程步驟如下: (1)創(chuàng)建事件對象句柄通過調(diào)用 WSACreateEvent 函數(shù)來創(chuàng)建一個對象, 該函

17、數(shù)的返回值為事件句柄對象句柄。 函數(shù)原型如下:WSAEVENT WSACreateEvent(void);比如:WSAEVENT newEvent WSACreateEvent(void); (2)關(guān)聯(lián)套接字和事件對象,注冊關(guān)心的網(wǎng)絡(luò)事件 通過調(diào)用 WSAEventSelect 函數(shù),把事件對象句柄與套接字關(guān)聯(lián)在一起,同時注冊感興 趣的網(wǎng)絡(luò)事件類型。 WSAEventSelect 函數(shù)的原型為:int WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents); 比如當(dāng)在套接字 s 上發(fā)生有數(shù)據(jù)可讀或者對方關(guān)閉套接

18、字時,向事件對象newEvent 傳信,則相應(yīng)的代碼為:WSAEventSelect(s,newEvent,FD_READ | FD_CLOSE);(3) 等待網(wǎng)絡(luò)事件觸發(fā)事件對象句柄的工作狀態(tài) 調(diào)用 WSAWaitForMultipleEvents 函數(shù),等待網(wǎng)絡(luò)事件觸發(fā)事件對象句柄的工作狀態(tài)。 函數(shù)原型如下:DWORD WSAWaitForMultipleEvents( DWORD cEvents, const WSAEVENT FAR * lphEvents, BOOL fWaitAll,DWORD dwTimeout,BOOL fAlertable);比如:Index=WSAWaitF

19、orMultipleEvent(1,&newEvent,FALSE,WSA_INFINITE,FALSE);(4) 檢查套接字上所發(fā)生的網(wǎng)絡(luò)事件類型調(diào)用 WSAEnumNetworkEvents 函數(shù),檢查出套接字上發(fā)生的網(wǎng)絡(luò)事件類型。函數(shù)原型 定義如下:int WSAEnumNetworkEvents(SOCKET s,WSAEVENT hEventObject,LPWSANETWORKEVENTS lpNetworkEvents);比如:WSANETWORKEVENTS NetworkEvent; WSAEnumNetworkEvents(s,newEvent,&NetworkEvent)

20、;(5) 處理網(wǎng)絡(luò)事件確定在套接字上發(fā)生的網(wǎng)絡(luò)事件類型, 然后根據(jù)不同的情況做出相應(yīng)的處理。 應(yīng)用程序 完成了對一個事件對象的處理后,便應(yīng)調(diào)用 WSACloseEvent 函數(shù),釋放由事件句柄使用的 系統(tǒng)資源。比如:if(NetworkEvent.lNetworkEvent & FD_READ) if(NetworkEvent.lErrorCodeFD_READ_BIT = 0) /接收數(shù)據(jù) else /出錯處理if(NetworkEvent.lNetworkEvent & FD_CLOSE)if(NetworkEvent.lErrorCodeFD_CLOSE_BIT = 0) /關(guān)閉連接處理

21、 else 出錯處理WSACloseEvent(newEvent);9、編寫一個基于數(shù)據(jù)報套接字的點到點通信程序,具體要求如下:1) 基于數(shù)據(jù)報套接字來實現(xiàn)。2) 服務(wù)器方工作的端口號為 2000 。然后把3) 客戶方通過鍵盤接收服務(wù)器方的 IP 地址和要發(fā)送給服務(wù)器方的消息, 該消息發(fā)送到服務(wù)器方。4) 服務(wù)器方接收客戶方的消息并顯示,然后產(chǎn)生一條消息并發(fā)送給客戶方,該 消息的內(nèi)容是客戶方的 IP 地址、端口號。5) 客戶方接收服務(wù)器方響應(yīng)的消息并顯示6) 雙方釋放套接字。 答:服務(wù)器端代碼如下:#include stdafx.h#include winsock2.h#pragma comm

22、ent(lib,ws2_32.lib)int main(int argc, char* argv)SOCKET sock;SOCKADDR_IN SerAddr,CliAddr;int alen=sizeof(SOCKADDR_IN);int msglen;char buf1000;WORD wVerReq;WSADATA wsaData;wVerReq=MAKEWORD(1,1);if(WSAStartup(wVerReq,&wsaData)return 1;memset(&SerAddr,0,alen);SerAddr.sin_family = AF_INET;SerAddr.sin_po

23、rt = htons(2000);SerAddr.sin_addr.s_addr=htonl(INADDR_ANY);sock = socket(PF_INET,SOCK_DGRAM,0);bind(sock,(LPSOCKADDR)&SerAddr,alen);msglen = recvfrom(sock,buf,1000,0,(LPSOCKADDR)&CliAddr,&alen);bufmsglen = 0;printf(%sn,buf);sprintf(buf,%s:%d,inet_ntoa(CliAddr.sin_addr),ntohs(CliAddr.sin_port); sendt

24、o(sock,buf,strlen(buf),0,(LPSOCKADDR)&CliAddr,alen);closesocket(sock);WSACleanup();return 0;客戶端代碼如下:#include stdafx.h#include winsock2.h#pragma comment(lib,ws2_32.lib)int main(int argc, char* argv)SOCKET sock;SOCKADDR_IN SerAddr;int alen=sizeof(SOCKADDR_IN);int msglen;char buf1000;WORD wVerReq;WSADA

25、TA wsaData;wVerReq=MAKEWORD(1,1);if(WSAStartup(wVerReq,&wsaData)return 1;printf( 請輸入服務(wù)器的 IP 地址: );scanf(%s,buf);memset(&SerAddr,0,alen);SerAddr.sin_family = AF_INET;SerAddr.sin_port = htons(2000);SerAddr.sin_addr.s_addr=inet_addr(buf);printf( 請輸入要發(fā)送到服務(wù)器的消息: ); scanf(%s,buf);sock = socket(PF_INET,SOC

26、K_DGRAM,0);sendto(sock,buf,strlen(buf),0,(LPSOCKADDR)&SerAddr,alen); while(msglen =recvfrom(sock,buf,1000,0,(LPSOCKADDR)&SerAddr,&alen)=0) bufmsglen = 0;printf(%sn,buf);closesocket(sock);WSACleanup();return 0;10、設(shè)計一個工作在 Windows 環(huán)境下、基于流式套接字的網(wǎng)絡(luò)客戶端應(yīng)用程序,要求 如下:1) 基于流式套接字。2) 服務(wù)器端使用的 IP 地址為: 10.132.254.200

27、,端口號是: 2000。3) 客戶端連接到服務(wù)器端后,把保存在變量msg1 中的以 0結(jié)尾的字符串發(fā)送到服務(wù)器。4) 服務(wù)器端使用 printf() 函數(shù)顯示接收到的字符串,然后再把該字符串的長度以 長整型數(shù)據(jù)的形式發(fā)送給客戶端。5) 客戶端接收到服務(wù)器返回的字符串長度,然后使用 printf() 函數(shù)以“服務(wù)器返 回的數(shù)據(jù)是 XXXX ”形式輸出服務(wù)器的返回結(jié)果。其中 XXXX 是服務(wù)器返回 的數(shù)據(jù)。6) 最后服務(wù)器和客戶均釋放連接。 給出能夠完成以上功能的服務(wù)器端和客戶端程序的關(guān)鍵代碼。答:(1)服務(wù)器端關(guān)鍵代碼如下:SOCKET sockListen,sockRecv;SOCKADDR_

28、IN SerAddr,CliAddr;WORD wVerReq;WSADATA wsaData;char Buf1000;unsigned long int msglen;int alen = sizeof(SOCKADDR);wVerReq = MAKEWORD(1,1);if(WSAStartup(wVerReq,&wsaData)return;memset(&SerAddr,0,alen);SerAddr.sin_family = AF_INET;SerAddr.sin_port = htons(2000);SerAddr.sin_addr.s_addr = htonl(INADDR_ANY);sockListen=socket(PF_INET,SOCK_STREAM,0);bind(sockList

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論