網(wǎng)絡(luò)編程復(fù)習(xí)題_第1頁(yè)
網(wǎng)絡(luò)編程復(fù)習(xí)題_第2頁(yè)
網(wǎng)絡(luò)編程復(fù)習(xí)題_第3頁(yè)
網(wǎng)絡(luò)編程復(fù)習(xí)題_第4頁(yè)
網(wǎng)絡(luò)編程復(fù)習(xí)題_第5頁(yè)
已閱讀5頁(yè),還剩11頁(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)介

計(jì)算機(jī)網(wǎng)絡(luò)編程復(fù)習(xí)題1、說(shuō)明C/S模式的概念、工作過程以及基于因特網(wǎng)的C/S模式的應(yīng)用程序的特點(diǎn)。答:網(wǎng)絡(luò)應(yīng)用進(jìn)程之間通信時(shí),普遍采用了客戶機(jī)/服務(wù)器(Client/Server)交互模式,簡(jiǎn)稱C/S模式??蛻魴C(jī)和服務(wù)器均是運(yùn)行在計(jì)算機(jī)中網(wǎng)絡(luò)協(xié)議棧之上的應(yīng)用進(jìn)程,它們借助網(wǎng)絡(luò)協(xié)議棧進(jìn)行通信。而C/S模式描述了進(jìn)程之間服務(wù)與被服務(wù)的關(guān)系??蛻魴C(jī)是服務(wù)的請(qǐng)求方(被服務(wù)方),服務(wù)器是服務(wù)的提供方。服務(wù)器的工作過程是:打開一通信通道,并告知服務(wù)器所在的主機(jī),它愿意在某一公認(rèn)的地址上(熟知端口)接收客戶請(qǐng)求。等待客戶的請(qǐng)求到達(dá)該端口。服務(wù)器接收到服務(wù)請(qǐng)求,處理該請(qǐng)求并發(fā)送應(yīng)答信號(hào)。為了能并發(fā)地接收多個(gè)客戶的服務(wù)請(qǐng)求,要激活一個(gè)新進(jìn)程或新線程來(lái)處理這個(gè)客戶請(qǐng)求。服務(wù)完成后,關(guān)閉此新進(jìn)程與客戶的通信鏈路,并終止。返回第二步,等待并處理另一客戶請(qǐng)求。在特定的情況下,關(guān)閉服務(wù)器客戶方的工作過程:打開一通信通道,并連接到服務(wù)器所在主機(jī)的特定監(jiān)聽端口。向服務(wù)器發(fā)送請(qǐng)求報(bào)文,等待并接收應(yīng)答;繼續(xù)提出請(qǐng)求。與服務(wù)器的會(huì)話按照應(yīng)用協(xié)議進(jìn)行。通信結(jié)束后,關(guān)閉通信通道并終止?;谝蛱鼐W(wǎng)的C/S模式的應(yīng)用程序的特點(diǎn)有:客戶和服務(wù)器都是軟件進(jìn)程。它指出的是提供服務(wù)和被服務(wù)的關(guān)系。非對(duì)稱性:服務(wù)器通過網(wǎng)絡(luò)提供服務(wù),客戶通過網(wǎng)絡(luò)使用服務(wù),這種不對(duì)稱性體現(xiàn)在軟件結(jié)構(gòu)和工作過程上。對(duì)等性:客戶和服務(wù)器必有一套共識(shí)的約定,必與以某種應(yīng)用層協(xié)議相聯(lián),并且協(xié)議必須在通信的兩端實(shí)現(xiàn)。服務(wù)器的被動(dòng)性:服務(wù)器必須先行啟動(dòng),只要有客戶請(qǐng)求,就立即處理并響應(yīng)。但決不主動(dòng)提供服務(wù)。客戶機(jī)的主動(dòng)性:一次請(qǐng)求與服務(wù)的過程是由客戶機(jī)首先激發(fā)的。客戶可以隨時(shí)向服務(wù)器提出請(qǐng)求,通過網(wǎng)絡(luò)得到服務(wù)。一對(duì)多:一個(gè)服務(wù)器可以為多個(gè)客戶服務(wù),客戶也可以連接到多個(gè)服務(wù)器。分布性與共享性:資源被組織、存儲(chǔ)在分散的服務(wù)器端,可通過網(wǎng)絡(luò)為多個(gè)客戶端使用。2、畫框圖說(shuō)明無(wú)連接數(shù)據(jù)報(bào)套接字編程的基本步驟。答:無(wú)連接的套接字編程有兩種模式:C/S(客戶/服務(wù)器)模式和P2P(對(duì)等)模式。(1)對(duì)等模式數(shù)據(jù)報(bào)套接字的編程模型:(2)客戶/服務(wù)器模式編程模型FD_WRITE事件:通知可以寫數(shù)據(jù)。FD_ACCEPT事件:通知監(jiān)聽套接字有連接請(qǐng)求可以接受。FD_CONNECT事件:通知請(qǐng)求連接的套接字,連接的要求已被處理。FD_CLOSE事件:通知套接字已關(guān)閉。FD_OOB事件通知:通知將有帶外數(shù)據(jù)到達(dá)。當(dāng)上述的網(wǎng)絡(luò)事件發(fā)生時(shí),MFC框架按照Windows的消息驅(qū)動(dòng)機(jī)制,把消息發(fā)送給相應(yīng)的套接字對(duì)象,并調(diào)用作為該對(duì)象成員函數(shù)的事件處理函數(shù)對(duì)相應(yīng)的網(wǎng)絡(luò)事件進(jìn)行處理。5、說(shuō)明基于流式套接字的CSocket類編程模型(1)服務(wù)器端CSocketsockServ;//創(chuàng)建空的服務(wù)器端監(jiān)聽套接字對(duì)象。sockServ.Create(nPort);//用眾所周知的端口,創(chuàng)建監(jiān)聽套接字對(duì)象的底層套接字句柄。sockServ.Listen();//啟動(dòng)對(duì)于客戶端連接請(qǐng)求的監(jiān)聽。CSocketsockRecv;//創(chuàng)建空的服務(wù)器端連接套接字對(duì)象。sockServ.Accept(sockRecv);//接收客戶端的連接請(qǐng)求,并將其他任務(wù)轉(zhuǎn)交連接套接字對(duì)象。//創(chuàng)建文件對(duì)象并關(guān)聯(lián)到連接套接字對(duì)象。CSockFile*file;file=newCSockFile(&sockRecv);//創(chuàng)建用于輸入/輸出的歸檔對(duì)象,并必須關(guān)聯(lián)到文件對(duì)象。CArchive*arIn,arOut;arIn=CArchive(&file,CArchive::load);arOut=CArchive(&file,CArchive::store);arIn>>dwValue;//進(jìn)行數(shù)據(jù)輸入。adOut<<dwValue;//進(jìn)行數(shù)據(jù)輸出。輸入或輸出可以反復(fù)進(jìn)行。sockRecv.Close();//傳輸完畢,關(guān)閉套接字對(duì)象。sockServ.Close();(2)客戶端CSocketsockClient;//創(chuàng)建空的客戶機(jī)端套接字對(duì)象。sockClient.Create();//創(chuàng)建套接字對(duì)象的底層套接字。sockClient.Connect(strAddr,nPort);//請(qǐng)求連接到服務(wù)器。//創(chuàng)建文件對(duì)象,并關(guān)聯(lián)到套接字對(duì)象。CSockFile*file;file=newCSockFile(&sockClient);//創(chuàng)建用于輸入/輸出的歸檔對(duì)象,歸檔對(duì)象必須關(guān)聯(lián)到文件對(duì)象。CArchive*arIn,arOut;arIn=CArchive(&file,CArchive::load);arOut=CArchive(&file,CArchive::store);arIn>>dwValue;//進(jìn)行數(shù)據(jù)輸入。adOut<<dwValue;//進(jìn)行數(shù)據(jù)輸出??梢苑磸?fù)進(jìn)行。sockClient.Close();//傳輸完畢,關(guān)閉套接字對(duì)象。6、現(xiàn)已經(jīng)聲明如下變量,其中num的值是已經(jīng)創(chuàng)建并存儲(chǔ)在數(shù)組s中套接字的數(shù)量?,F(xiàn)要求通過select模型來(lái)檢查數(shù)組s中的套接字是否有數(shù)據(jù)可以接收,只有當(dāng)至少一個(gè)套接實(shí)際上有數(shù)據(jù)可接收才會(huì)從select中返回。若某一套接字上有數(shù)據(jù)可以接收,則通過調(diào)用函數(shù)MyRecv(SOCKETs)來(lái)完成數(shù)據(jù)接收和處理操作。試補(bǔ)充完成如下程序來(lái)實(shí)現(xiàn)上述功能。SOCKETs[10];fd_setfdread;intnum;答:inti,ret;FD_ZERO(&fdread);for(i=0;i<num;i++)FD_SET(s[i],&fdread);if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR){…//出錯(cuò)處理}if(ret>0){for(i=0;i<num;i++)if(FD_ISSET(s[i],&fdread))MyRecv(s[i]);}7、使用WSAAsyncSelect異步I/O模型編寫一個(gè)基于對(duì)話框的網(wǎng)絡(luò)應(yīng)用程序,請(qǐng)根據(jù)要求,完成以下題目:當(dāng)在套接字MySocket上有數(shù)據(jù)可讀或者對(duì)方釋放與MySocket的連接時(shí),向?qū)υ捒虬l(fā)送一條消息號(hào)為WM_MYSOCKMSG消息。該對(duì)話框的句柄保存在變量hWnd中。請(qǐng)寫出能完成該功能的WSAAsyncSelect()函數(shù)調(diào)用語(yǔ)句。答:完成該功能的語(yǔ)句如下:WSAAsyncSelect(MySocket,hWnd,WM_MYSOCKMSG,FD_READ|FD_CLOSE);對(duì)話框通過調(diào)用消息處理函數(shù)voidMyMsgHandle(WPARAMwParam,LPARAMlParam)完成對(duì)WM_MYSOCKMSG消息的處理。為實(shí)現(xiàn)該功能,如何對(duì)MFC生成的對(duì)話框應(yīng)用程序進(jìn)行修改?答:在對(duì)話框中添加自定義消息的方法為:定義消息號(hào):可以使用宏定義語(yǔ)句“#define”增加一個(gè)用戶自定義消息,該定義的作用范圍應(yīng)該包括整個(gè)類。該消息號(hào)不能與現(xiàn)有消息的消息相同。通常用戶自定義的消息號(hào)從系統(tǒng)定義的常量WM_USER開始分配。例如:#defineWM_MYSOCKMSG(WM_USER+1)增加消息處理函數(shù):在對(duì)話框中增加一個(gè)成員函數(shù),用于對(duì)自定義消息進(jìn)行處理。比如:voidMyMsgHandle(WPARAMwParam,LPARAMlParam);在對(duì)話框類的頭文件中,移動(dòng)消息處理函數(shù)聲明到類的AFX_MSG塊,并在函數(shù)聲明前面添加afx_msg。比如://Generatedmessagemapfunctions//{{AFX_MSG(CTestDlg)…afx_msgvoidMyMsgHandle(WPARAMwParam,LPARAMlParam);…//}}AFX_MSGDECLARE_MESSAGE_MAP()在類的實(shí)現(xiàn)文件的消息塊中,使用ON_MESSAGE宏指令將消息映射到消息處理函數(shù)。比如:BEGIN_MESSAGE_MAP(CTestDlg,CDialog) //{{AFX_MSG_MAP(CTestDlg)… ON_MESSAGE(WM_MYMSG,MyMsgHandle)… //}}AFX_MSG_MAPEND_MESSAGE_MAP()在消息處理函數(shù)中添加代碼,以實(shí)現(xiàn)對(duì)消息的處理。傳遞給消息處理函數(shù)的參數(shù)wParam和lParam攜帶了與消息相關(guān)的更詳細(xì)的信息。若接收到對(duì)方發(fā)送的消息,將消息直接輸出;若是對(duì)方釋放連接,則顯示“對(duì)方掉線”,然后關(guān)閉套接字。請(qǐng)給出實(shí)現(xiàn)該功能的消息處理函數(shù)voidMyMsgHandle(WPARAMwParam,LPARAMlParam)。答:相應(yīng)的關(guān)鍵代碼如下:switch(WSAGETSELECTEVENT(lParam)){caseFD_READ:…//接收并顯示消息break;caseFD_CLOSE:…//輸出對(duì)方掉線closesocket(wParam);break;default:…}8、簡(jiǎn)述WSAEventSelect事件選擇模型的編程模型。答:WSAEventSelect事件選擇模型的編程步驟如下:(1)創(chuàng)建事件對(duì)象句柄通過調(diào)用WSACreateEvent函數(shù)來(lái)創(chuàng)建一個(gè)對(duì)象,該函數(shù)的返回值為事件句柄對(duì)象句柄。函數(shù)原型如下:WSAEVENTWSACreateEvent(void);比如:WSAEVENTnewEventWSACreateEvent(void);(2)關(guān)聯(lián)套接字和事件對(duì)象,注冊(cè)關(guān)心的網(wǎng)絡(luò)事件通過調(diào)用WSAEventSelect函數(shù),把事件對(duì)象句柄與套接字關(guān)聯(lián)在一起,同時(shí)注冊(cè)感興趣的網(wǎng)絡(luò)事件類型。WSAEventSelect函數(shù)的原型為:intWSAEventSelect(SOCKETs,WSAEVENThEventObject,longlNetworkEvents);比如當(dāng)在套接字s上發(fā)生有數(shù)據(jù)可讀或者對(duì)方關(guān)閉套接字時(shí),向事件對(duì)象newEvent傳信,則相應(yīng)的代碼為:WSAEventSelect(s,newEvent,FD_READ|FD_CLOSE);(3)等待網(wǎng)絡(luò)事件觸發(fā)事件對(duì)象句柄的工作狀態(tài)調(diào)用WSAWaitForMultipleEvents函數(shù),等待網(wǎng)絡(luò)事件觸發(fā)事件對(duì)象句柄的工作狀態(tài)。函數(shù)原型如下:DWORDWSAWaitForMultipleEvents(DWORDcEvents,constWSAEVENTFAR*lphEvents,BOOLfWaitAll,DWORDdwTimeout,BOOLfAlertable);比如:Index=WSAWaitForMultipleEvent(1,&newEvent,FALSE,WSA_INFINITE,FALSE);(4)檢查套接字上所發(fā)生的網(wǎng)絡(luò)事件類型調(diào)用WSAEnumNetworkEvents函數(shù),檢查出套接字上發(fā)生的網(wǎng)絡(luò)事件類型。函數(shù)原型定義如下:intWSAEnumNetworkEvents(SOCKETs,WSAEVENThEventObject,LPWSANETWORKEVENTSlpNetworkEvents);比如:WSANETWORKEVENTSNetworkEvent;WSAEnumNetworkEvents(s,newEvent,&NetworkEvent);(5)處理網(wǎng)絡(luò)事件確定在套接字上發(fā)生的網(wǎng)絡(luò)事件類型,然后根據(jù)不同的情況做出相應(yīng)的處理。應(yīng)用程序完成了對(duì)一個(gè)事件對(duì)象的處理后,便應(yīng)調(diào)用WSACloseEvent函數(shù),釋放由事件句柄使用的系統(tǒng)資源。比如:if(NetworkEvent.lNetworkEvent&FD_READ){if(NetworkEvent.lErrorCode[FD_READ_BIT]==0){…//接收數(shù)據(jù)}else{…//出錯(cuò)處理}}if(NetworkEvent.lNetworkEvent&FD_CLOSE){if(NetworkEvent.lErrorCode[FD_CLOSE_BIT]==0){…//關(guān)閉連接處理}else{…//出錯(cuò)處理}}WSACloseEvent(newEvent);9、編寫一個(gè)基于數(shù)據(jù)報(bào)套接字的點(diǎn)到點(diǎn)通信程序,具體要求如下:基于數(shù)據(jù)報(bào)套接字來(lái)實(shí)現(xiàn)。服務(wù)器方工作的端口號(hào)為2000。客戶方通過鍵盤接收服務(wù)器方的IP地址和要發(fā)送給服務(wù)器方的消息,然后把該消息發(fā)送到服務(wù)器方。服務(wù)器方接收客戶方的消息并顯示,然后產(chǎn)生一條消息并發(fā)送給客戶方,該消息的內(nèi)容是客戶方的IP地址、端口號(hào)??蛻舴浇邮辗?wù)器方響應(yīng)的消息并顯示雙方釋放套接字。答:服務(wù)器端代碼如下:#include"stdafx.h"#include"winsock2.h"#pragmacomment(lib,"ws2_32.lib")intmain(intargc,char*argv[]){SOCKETsock;SOCKADDR_INSerAddr,CliAddr;intalen=sizeof(SOCKADDR_IN);intmsglen;charbuf[1000];WORDwVerReq;WSADATAwsaData;wVerReq=MAKEWORD(1,1);if(WSAStartup(wVerReq,&wsaData))return1;memset(&SerAddr,0,alen);SerAddr.sin_family=AF_INET;SerAddr.sin_port=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);buf[msglen]='\0';printf("%s\n",buf);sprintf(buf,"%s:%d",inet_ntoa(CliAddr.sin_addr),ntohs(CliAddr.sin_port));sendto(sock,buf,strlen(buf),0,(LPSOCKADDR)&CliAddr,alen);closesocket(sock);WSACleanup();return0;}客戶端代碼如下:#include"stdafx.h"#include"winsock2.h"#pragmacomment(lib,"ws2_32.lib")intmain(intargc,char*argv[]){SOCKETsock;SOCKADDR_INSerAddr;intalen=sizeof(SOCKADDR_IN);intmsglen;charbuf[1000];WORDwVerReq;WSADATAwsaData;wVerReq=MAKEWORD(1,1);if(WSAStartup(wVerReq,&wsaData))return1;printf("請(qǐng)輸入服務(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("請(qǐng)輸入要發(fā)送到服務(wù)器的消息:");scanf("%s",buf);sock=socket(PF_INET,SOCK_DGRAM,0);sendto(sock,buf,strlen(buf),0,(LPSOCKADDR)&SerAddr,alen);while((msglen=recvfrom(sock,buf,1000,0,(LPSOCKADDR)&SerAddr,&alen))<=0) ;buf[msglen]='\0';printf("%s\n",buf);closesocket(sock);WSACleanup();return0;}10、設(shè)計(jì)一個(gè)工作在Windows環(huán)境下、基于流式套接字的網(wǎng)絡(luò)客戶端應(yīng)用程序,要求如下:基于流式套接字。服務(wù)器端使用的IP地址為:10.132.254.200,端口號(hào)是:2000??蛻舳诉B接到服務(wù)器端后,把保存在變量msg1中的以’\0’結(jié)尾的字符串發(fā)送到服務(wù)器。服務(wù)器端使用printf()函數(shù)顯示接收到的字符串,然后再把該字符串的長(zhǎng)度以長(zhǎng)整型數(shù)據(jù)的形式發(fā)送給客戶端??蛻舳私邮盏椒?wù)器返回的字符串長(zhǎng)度,然后使用printf()函數(shù)以“服務(wù)器返回的數(shù)據(jù)是XXXX”形式輸出服務(wù)器的返回結(jié)果。其中XXXX是服務(wù)器返回的數(shù)據(jù)。最后服務(wù)器和客戶均釋放連接。給出能夠完成以上功能的服務(wù)器端和客戶端程序的關(guān)鍵代碼。答:(1)服務(wù)器端關(guān)鍵代碼如下:SOCKETsockListen,sockRecv;SOCKADDR_INSerAddr,CliAddr;WORDwVerReq;WSADATAwsaData;charBuf[1000];unsignedlongintmsglen;intalen=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(sockListen,(LPSOCKADDR)&SerAddr,alen);listen(sockListen,5);alen=sizeof(SOCKADDR);sockRecv=ac

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論