湖南科技大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告.doc
《湖南科技大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《湖南科技大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告.doc(9頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
計(jì)算機(jī)網(wǎng)絡(luò) 課程設(shè)計(jì)報(bào)告 姓名: 學(xué)號(hào): 班級(jí): 指導(dǎo)老師: 湖南科技大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院 2016年 1 月 網(wǎng)絡(luò)聊天程序的設(shè)計(jì)與實(shí)現(xiàn) 一、 課程設(shè)計(jì)題目 了解Socket通信的原理,在此基礎(chǔ)上編寫(xiě)一個(gè)聊天程序。 二、 課程設(shè)計(jì)內(nèi)容 1.TCP/IP協(xié)議與WinSock網(wǎng)絡(luò)編程接口的關(guān)系 WinSock 并不是一種網(wǎng)絡(luò)協(xié)議,它只是一個(gè)網(wǎng)絡(luò)編程接口,也就是說(shuō),它不是協(xié)議,但是它可以訪問(wèn)很多種網(wǎng)絡(luò)協(xié)議,你可以把它當(dāng)作一些協(xié)議的封裝?,F(xiàn)在的 WinSock已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無(wú)關(guān)。你可以使用WinSock來(lái)調(diào)用多種協(xié)議的功能。那么,WinSock和TCP/IP協(xié)議到底是什么關(guān)系呢?實(shí)際上,WinSock就是TCP/IP協(xié)議的一種封裝,你可以通過(guò)調(diào)用WinSock的接口函數(shù)來(lái)調(diào)用TCP/IP的各種功能.例如我想用TCP/IP 協(xié)議發(fā)送數(shù)據(jù),你就可以使用WinSock的接口函數(shù)Send()來(lái)調(diào)用TCP/IP的發(fā)送數(shù)據(jù)功能,至于具體怎么發(fā)送數(shù)據(jù),WinSock已經(jīng)幫你封裝好了這種功能。 2. WinSock編程簡(jiǎn)單流程 WinSock編程分為服務(wù)器端和客戶端兩部分,TCP服務(wù)器端的大體流程如下: 對(duì)于任何基于WinSock的編程首先必須要初始化WinSock DLL庫(kù)。 int WSAStarup( WORD wVersionRequested,LPWSADATA lpWsAData )。 wVersionRequested是我們要求使用的WinSock的版本。 調(diào)用這個(gè)接口函數(shù)可以初始化WinSock 。 然后必須創(chuàng)建一個(gè)套接字(Socket)。 SOCKET Socket(int af,int type,int protocol); 套接字可以說(shuō)是WinSock通訊的核心。WinSock通訊的所有數(shù)據(jù)傳輸,都是通過(guò)套接字來(lái)完成的,套接字包含了兩個(gè)信息,一個(gè)是IP地址,一個(gè)是Port端口號(hào),使用這兩個(gè)信息,就可以確定網(wǎng)絡(luò)中的任何一個(gè)通訊節(jié)點(diǎn)。 當(dāng)調(diào)用了Socket()接口函數(shù)創(chuàng)建了一個(gè)套接字后,必須把套接字與你需要進(jìn)行通訊的地址建立聯(lián)系,可以通過(guò)綁定函數(shù)bind來(lái)實(shí)現(xiàn)這種聯(lián)系。 int bind(SOCKET s,const struct sockaddr FAR* name,int namelen) ; struct sockaddr_in{ short sin_family ; u_short sin_port; struct in_addr sin_addr ; char sin_sero[8] ; } 就包含了需要建立連接的本地的地址,包括地址族、IP和端口信息。sin_family字段必須把它設(shè)為AF_INET,這是告訴WinSock使用的是IP地址族。sin_port就是要用來(lái)通訊的端口號(hào)。sin_addr就是要用來(lái)通訊的IP地址信息。 在這里,必須還得提一下有關(guān)大頭(big-endian)小頭(little-endian)。因?yàn)楦鞣N不同的計(jì)算機(jī)處理數(shù)據(jù)時(shí)的方法是不一樣的,Intel X86處理器上是用小頭形式來(lái)表示多字節(jié)的編號(hào),就是把低字節(jié)放在前面,把高字節(jié)放在后面,而互聯(lián)網(wǎng)標(biāo)準(zhǔn)卻正好相反,所以,必須把主機(jī)字節(jié)轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)的順序。WinSock API提供了幾個(gè)函數(shù)。 把主機(jī)字節(jié)轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)的函數(shù); u_long htonl(u_long hostlong); u_short htons(u_short hostshort); 把網(wǎng)絡(luò)字節(jié)轉(zhuǎn)化成主機(jī)字節(jié)的函數(shù); u_long ntohl(u_long netlong); u_short ntohs(u_short netshort) ; 這樣,設(shè)置IP地址和port端口時(shí),就必須把主機(jī)字節(jié)轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)后,才能用Bind()函數(shù)來(lái)綁定套接字和地址。 當(dāng)綁定完成之后,服務(wù)器端必須建立一個(gè)監(jiān)聽(tīng)的隊(duì)列來(lái)接收客戶端的連接請(qǐng)求。 int listen(SOCKET s,int backlog); 這個(gè)函數(shù)可以把套接字轉(zhuǎn)成監(jiān)聽(tīng)模式。 如果客戶端有了連接請(qǐng)求,我們還必須使用 int accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen); 來(lái)接受客戶端的請(qǐng)求。 現(xiàn)在基本上已經(jīng)完成了一個(gè)服務(wù)器的建立,而客戶端的建立的流程則是初始化WinSock,然后創(chuàng)建Socket套接字,再使用 int connect(SOCKET s,const struct sockaddr FAR* name,int namelen) ; 來(lái)連接服務(wù)端。 計(jì)算機(jī)網(wǎng)絡(luò)(第6版)295頁(yè)圖6-32所示的系統(tǒng)調(diào)用使用順序: 3.VC中socket編程步驟 服務(wù)器端編程的步驟: 1:加載套接字庫(kù),創(chuàng)建套接字(WSAStartup()/socket()); 2:綁定套接字到一個(gè)IP地址和一個(gè)端口上(bind()); 3:將套接字設(shè)置為監(jiān)聽(tīng)模式等待連接請(qǐng)求(listen()); 4:請(qǐng)求到來(lái)后,接受連接請(qǐng)求,返回一個(gè)新的對(duì)應(yīng)于此次連接的套接字(accept()); 5:用返回的套接字和客戶端進(jìn)行通信(send()/recv()); 6:返回,等待另一連接請(qǐng)求; 7:關(guān)閉套接字,關(guān)閉加載的套接字庫(kù)(closesocket()/WSACleanup())。 客戶端編程的步驟: 1:加載套接字庫(kù),創(chuàng)建套接字(WSAStartup()/socket()); 2:向服務(wù)器發(fā)出連接請(qǐng)求(connect()); 3:和服務(wù)器端進(jìn)行通信(send()/recv()); 4:關(guān)閉套接字,關(guān)閉加載的套接字庫(kù)(closesocket()/WSACleanup())。 三、 結(jié)果及結(jié)果分析 服務(wù)器端: 客服端: 客戶端發(fā)送hello,服務(wù)器端接收hello;然后服務(wù)器端發(fā)送hi,客戶端接收hi??蛻羰褂胹end發(fā)送請(qǐng)求,而服務(wù)器使用send發(fā)送回答。服務(wù)器使用recv接收客戶用send調(diào)用發(fā)送的請(qǐng)求??蛻粼诎l(fā)完請(qǐng)求后用recv接收回答。 在調(diào)試過(guò)程中,曾輸出了“燙燙燙燙燙燙燙燙燙燙燙燙”。先將服務(wù)器端設(shè)為活動(dòng)工程,再運(yùn)行,然后將客戶端設(shè)為活動(dòng)工程,再運(yùn)行,即可。 由于程序的缺陷,當(dāng)運(yùn)行多個(gè)客戶端時(shí),多個(gè)客戶端競(jìng)爭(zhēng)與服務(wù)器端連接,僅能一個(gè)客戶端與服務(wù)器端相連。 基于IP多播的網(wǎng)絡(luò)會(huì)議程序 一、 課程設(shè)計(jì)題目 設(shè)計(jì)一個(gè)圖形界面的網(wǎng)絡(luò)會(huì)議程序(實(shí)現(xiàn)文本多播方式即可)。 二、 課程設(shè)計(jì)內(nèi)容 在局域網(wǎng)中,管理員常常需要將某條信息發(fā)送給一組用戶。如果使用一對(duì)一的發(fā)送方法,雖然是可行的,但是過(guò)于麻煩,也常會(huì)出現(xiàn)漏發(fā)、錯(cuò)發(fā)。為了更有效的解決這種組通信問(wèn)題,出現(xiàn)了一種多播技術(shù)(也常稱為組播通信),它是基于IP層的通信技術(shù)。 眾所周知,普通IP通信是在一個(gè)發(fā)送者和一個(gè)接收者之間進(jìn)行的,我們常把它稱為點(diǎn)對(duì)點(diǎn)的通信,但對(duì)于有些應(yīng)用,這種點(diǎn)對(duì)點(diǎn)的通信模式不能有效地滿足實(shí)際應(yīng)用的需求。廣播也是一種實(shí)現(xiàn)一對(duì)多數(shù)據(jù)通信的模式,但廣播與多播在實(shí)現(xiàn)方式上有所不同。廣播是將數(shù)據(jù)從一個(gè)工作站發(fā)出,局域網(wǎng)內(nèi)的其他所有工作站都能收到它。這一特征適用于無(wú)連接協(xié)議,因?yàn)長(zhǎng)AN上的所有機(jī)器都可獲得并處理廣播消息。使用廣播消息的不利之處是每臺(tái)機(jī)器都必須對(duì)該消息進(jìn)行處理。多播通信則不同,數(shù)據(jù)從一個(gè)工作站發(fā)出后,如果在其它LAN上的機(jī)器上面運(yùn)行的進(jìn)程表示對(duì)這些數(shù)據(jù)"有興趣",多播數(shù)據(jù)才會(huì)發(fā)給它們。 編程步驟 1、啟動(dòng)Visual C++6.0,創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目工程MultiCase。 #define MCASTADDR "233.0.0.1" //多播組地址 #define MCASTPORT 5150 //本地端口號(hào) Receiver項(xiàng)目實(shí)現(xiàn)步驟: (1)、創(chuàng)建一個(gè)SOCK_DGRAM類型的Socket。 (2)、將此Socket綁定到本地的一個(gè)端口上,為了接收服務(wù)器端發(fā)送的多播數(shù)據(jù)。 local.sin_family = AF_INET; local.sin_port = htons(MCASTPORT); local.sin_addr.s_addr = INADDR_ANY; if( bind(sock,(struct sockaddr*)&local,sizeof(local)) == SOCKET_ERROR ) { printf( "bind failed with:%d \n",WSAGetLastError()); closesocket(sock); WSACleanup(); return -1; } (3)、加入多播組。 remote.sin_family = AF_INET; remote.sin_port = htons(MCASTPORT); remote.sin_addr.s_addr = inet_addr( MCASTADDR ); mcast.imr_multiaddr.s_addr = inet_addr(MCASTADDR); mcast.imr_interface.s_addr = INADDR_ANY; if( setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mcast, sizeof(mcast)) == SOCKET_ERROR) { printf("setsockopt(IP_ADD_MEMBERSHIP) failed:%d\n",WSAGetLastError()); closesocket(sockM); WSACleanup(); return -1; } (4)、接收多播數(shù)據(jù)。 Sender實(shí)現(xiàn)步驟: (1)、創(chuàng)建一個(gè)SOCK_DGRAM類型的Socket。 (2)、加入多播組。 remote.sin_family = AF_INET; remote.sin_port = htons(MCASTPORT); remote.sin_addr.s_addr = inet_addr( MCASTADDR ); if(( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote, sizeof(remote),NULL,NULL,NULL,NULL, JL_BOTH)) == INVALID_SOCKET) { printf("WSAJoinLeaf() failed:%d\n",WSAGetLastError()); closesocket(sock); WSACleanup(); return -1; } (3)、發(fā)送多播數(shù)據(jù)。 2、編譯兩個(gè)項(xiàng)目,在局域網(wǎng)中按如下步驟測(cè)試: (1)、將Sender.exe拷貝到發(fā)送多播數(shù)據(jù)的PC上。 (2)、將Receiver.exe拷貝到多個(gè)要求接收多播數(shù)據(jù)的PC上。 (3)、各自運(yùn)行相應(yīng)的程序。 (4)、在Sender PC上輸入多播數(shù)據(jù)后,你就可以在Receiver PC上看到輸入的多播數(shù)據(jù)。 三、結(jié)果及結(jié)果分析 Sender: Receiver: Sender與receiver只要綁定相同的多播組地址和端口號(hào),sender就可以向多個(gè)receiver發(fā)送信息,receiver也可以接收多個(gè)sender發(fā)出的信息。在此只列出一個(gè)sender向receiver發(fā)送信息的情況。 Tracert與Ping程序設(shè)計(jì)與實(shí)現(xiàn) 一、 課程設(shè)計(jì)題目 了解Tracert程序的實(shí)現(xiàn)原理,并調(diào)試通過(guò)。然后參考Tracert程序和教材4.4.2節(jié),編寫(xiě)一個(gè)Ping程序,并能測(cè)試本局域網(wǎng)的所有機(jī)器是否在線,運(yùn)行Ping程序。 二、 課程設(shè)計(jì)內(nèi)容 實(shí)現(xiàn)原理 Tracert程序關(guān)鍵是對(duì)IP頭部生存時(shí)間(time to live)TTL字段的使用,程序?qū)崿F(xiàn)時(shí)是向目地主機(jī)發(fā)送一個(gè)ICMP回顯請(qǐng)求消息,初始時(shí)TTL等于1,這樣當(dāng)該數(shù)據(jù)報(bào)抵達(dá)途中的第一個(gè)路由器時(shí),TTL的值就被減為0,導(dǎo)致發(fā)生超時(shí)錯(cuò)誤,因此該路由生成一份ICMP超時(shí)差錯(cuò)報(bào)文返回給源主機(jī)。隨后,主機(jī)將數(shù)據(jù)報(bào)的TTL值遞增1,以便IP報(bào)能傳送到下一個(gè)路由器,并由下一個(gè)路由器生成ICMP超時(shí)差錯(cuò)報(bào)文返回給源主機(jī)。不斷重復(fù)這個(gè)過(guò)程,直到數(shù)據(jù)報(bào)達(dá)到最終的目地主機(jī),此時(shí)目地主機(jī)將返回ICMP回顯應(yīng)答消息。這樣,源主機(jī)只需對(duì)返回的每一份ICMP報(bào)文進(jìn)行解析處理,就可以掌握數(shù)據(jù)報(bào)從源主機(jī)到達(dá)目地主機(jī)途中所經(jīng)過(guò)的路由信息。 三、 結(jié)果及結(jié)果分析 Tracert程序結(jié)果: 輸出數(shù)據(jù)包往返時(shí)間及IP地址 心得體會(huì) 通過(guò)本次的課程設(shè)計(jì)中對(duì)計(jì)算機(jī)程序?qū)崿F(xiàn)的編寫(xiě)與對(duì)網(wǎng)絡(luò)的某些功能的模擬,本應(yīng)更好地理解并掌握計(jì)算機(jī)網(wǎng)絡(luò)的基本工作原理和工作過(guò)程,以及更好地理解應(yīng)用程序和操作系統(tǒng)之間傳遞控制權(quán)的機(jī)制。但是,由于對(duì)計(jì)算機(jī)網(wǎng)絡(luò)的基本原理掌握得不好,及對(duì)C語(yǔ)言的生疏,不能很好地利用原理去分析代碼、編寫(xiě)代碼。因此,不能很好地達(dá)到本來(lái)的課程設(shè)計(jì)目的。不過(guò)也使我了解了套接字socket的創(chuàng)建和運(yùn)用。要注重平時(shí)的知識(shí)積累,培養(yǎng)查閱技術(shù)文獻(xiàn)、資料及手冊(cè)的能力,多動(dòng)手實(shí)踐,提高實(shí)際編程能力和靈活運(yùn)用所學(xué)知識(shí)解決問(wèn)題的能力。- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 湖南 科技大學(xué) 計(jì)算機(jī)網(wǎng)絡(luò) 課程設(shè)計(jì) 報(bào)告
鏈接地址:http://www.3dchina-expo.com/p-9460365.html