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