計算機網絡實驗報告2014年_第1頁
計算機網絡實驗報告2014年_第2頁
計算機網絡實驗報告2014年_第3頁
計算機網絡實驗報告2014年_第4頁
計算機網絡實驗報告2014年_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 計算機網絡 實 驗 報 告 學生姓名 學 號 09091219 專業(yè)班級 計科12 指導教師 學 院 信息科學與工程學院 完成時間 2014年5月實驗一 網絡路由層協(xié)議模擬實驗 【實驗目的和要求】1. 掌握VB、VC+、VS或JAVA等集成開發(fā)環(huán)境編寫路由仿真程序的方法;2. 理解并掌握距離向量路由協(xié)議和鏈路狀態(tài)路由協(xié)議的工作原理。【實驗內容】 模擬距離向量路由算法的路由表交換過程,演示每輪交換后路由表的變化。基本要求(動態(tài)生成網絡拓撲圖,節(jié)點間的距離隨機生成。從初始路由表開始,進行交換路由表,演示每輪交換后的路由表的變化。觀察和討論多少輪交換后路由表穩(wěn)定)【實驗原理】 距離矢量路由算法”的

2、基本思想如下:每個路由器維護一個距離矢量(通常是以延時是作變量的)表,然后通過相鄰路由器之間的距離矢量通告進行距離矢量表的更新。每個距離矢量表項包括兩部分:到達目的結點的最佳輸出線路,和到達目的結點所需時間或距離,通信子網中的其它每個路由器在表中占據一個表項,并作為該表項的索引。每隔一段時間,路由器會向所有鄰居結點發(fā)送它到每個目的結點的距離表,同時它也接收每個鄰居結點發(fā)來的距離表。這樣以此類推,經過一段時間后便可將網絡中各路由器所獲得的距離矢量信息在各路由器上統(tǒng)一起來,這樣各路由器只需要查看這個距離矢量表就可以為不同來源分組找到一條最佳的路由?!揪幊陶Z言和環(huán)境】1. Windows操作系統(tǒng),編

3、程語言C+2. 編程環(huán)境VC【實驗具體設計實現(xiàn)及結果(含流程圖及關鍵代碼說明)】采用網絡拓撲結構CDAGEFB93524581源代碼:#include "stdio.h"#include "stdlib.h"#include "conio.h" /atoi的頭文件#define ROUTNUM 7 /定義路由的個數為7個typedef structint dis; /存延遲大小int from; /存下一跳的路由RoutNode;RoutNode dataROUTNUMROUTNUM;/*路由表,能存7行7列數據,數據為權值*/voi

4、d InitData(FILE* pfile);/*從數據文件讀取數據,初始化路由表*/void OutputRoutData();/*輸出所有的路由表*/void Communication(int recv, int send);/*send點向recv點發(fā)送自己的路由表*/void Exchange();/*所有節(jié)點進行一次數據交換, 更新路由表*/void main()int start, end, i, j;FILE *pfile;pfile = fopen("1.txt", "r");if (pfile = NULL)printf("

5、;文件打開錯誤,按任意鍵退出.n");getch();return;elseprintf("n路由表初始:n");InitData(pfile);fclose(pfile);for (i = 0; i<ROUTNUM; i+)printf("%c|", i + 65);for (j = 0; j < ROUTNUM; j+)if (dataij.dis > 0)printf("<%c %d> ", j + 65, dataij.dis);printf("n"); /顯示各路由

6、的路由表 for (i = 0; i < ROUTNUM; i+) /循環(huán)7次(好像多余,改成一次得到同樣結果)Exchange(); printf("n路由表交換:n");OutputRoutData();printf("輸入起始路由節(jié)點數字(%d-%d)0代表A,1代表B. : ", 0, ROUTNUM - 1);scanf("%d", &start);printf("輸入終點路由節(jié)點數字(%d-%d)0代表A,1代表B. : ", 0, ROUTNUM - 1);scanf("%d&

7、quot;, &end);if (start = end | start < 0 | start > 6 | end < 0 | end > 6)printf("n輸入錯誤,請按任意鍵退出n");getch();return;elseint cur = start;int total = 0;if (datastartend.dis < 0)printf("沒有路由路徑發(fā)現(xiàn)!n");getch();return; printf("%c->", cur + 65);while (datacur

8、end.from >= 0) /起始點與終點不相連。0是Atotal += datacurdatacurend.from.dis; /total變成cur與下一跳的延遲printf("%c->", datacurend.from + 65);cur = datacurend.from; /起始路由變成下一跳 total += datacurend.dis;printf("%cn總的路由距離 = %d", end + 65, total);getch();return; void InitData(FILE *pfile)char num10;

9、int i = 0;char c;int m, n;fseek(pfile, 0, 0); /文件指針從距0位置0距離開始讀取for (m = 0; !feof(pfile) && m < 7; m+) /feof(pfile),文件尾返回1,不是返回0.即不是文件尾部且m<7循環(huán).for (n = 0; !feof(pfile) && n < 7; n+)while (!feof(pfile)c = fgetc(pfile); /讀取單個字節(jié)if (c = ',')/*讀完一個數字*/numi = '0' /賦

10、值為空datamn.dis = atoi(num);/atoi將字符變成數字,將路由權值給data.disdatamn.from = -1; /直接相連下一跳全都賦值為-1i = 0;break; /*end of if*/else if (c >= '0' && c <= '9') | c = '-') /*如果讀到數字或符號.本題路由權值只能0到9*/numi+ = c; /*end of else if*/ /*end of while*/ /*end of for (n = 0*/ /*end of for (

11、m = 0*/void OutputRoutData()int i, j;printf(" ");for (i = 0; i < ROUTNUM; i+)printf(" %c ", i + 65);printf("n");for (i = 0; i < ROUTNUM; i+)printf("%c ", i + 65);for (j = 0; j < ROUTNUM; j+)if (dataij.dis < 0)/如果無路徑printf(" -");elseif(dat

12、aij.dis>=10)printf(" %d", dataij.dis);elseprintf(" %d", dataij.dis);if (dataij.from < 0)/如果未經過其它節(jié)點 所以直接相連的路由下一跳為-1printf(" - ");elseprintf(" %c ", dataij.from + 65); /輸出下一跳路由 printf("n"); void Communication(int recv, int send) /相連的兩路由recv和send交

13、換數據計算一次得到暫時最短距離int i;for (i = 0; i < ROUTNUM; i+)if (datasendi.dis > 0)/如果send節(jié)點到i號節(jié)點有路線if (datarecvi.dis < 0)/如果recv到i號節(jié)點無路徑 datarecvi.dis = datasendi.dis + datarecvsend.dis; /第一種recv不予i相連,recv到不與他相連的i的延遲datarecvi.from = send; /下一跳為sendelse if (datarecvi.dis > datasendi.dis + datarecvse

14、nd.dis)/第二種recv與i相連,且直接相連值大于間接到i的延遲/如果現(xiàn)有路徑比新路徑遠datarecvi.dis = datasendi.dis + datarecvsend.dis; /將recv到i的延遲改為間接延遲的值datarecvi.from = send; /下一跳改為send void Exchange() /實現(xiàn)所有相連的兩路由進行數據交換并計算最短數值int i, j;for (i = 0; i < ROUTNUM; i+)for (j = 0; j < ROUTNUM; j+)if (dataij.dis > 0)/如果兩個節(jié)點之間有路徑Commu

15、nication(j, i);/將i號節(jié)點的路由表發(fā)送給j號節(jié)點 /*1.text中存者路由信息0, 2,-1,-1, 8,-1, 5,2, 0,4, 5,-1,-1,-1,-1,4, 0,-1,-1, 9,-1,-1, 5,-1, 0,1,-1,-1,8,-1,-1,1, 0,-1, 7,-1,-1, 9,-1,-1, 0, 3,5,-1,-1,-1, 7, 3, 0,數值代表權值(如延遲大小)0代表目的網絡到其本身-1代表無法直接相連 */【實驗總結】 通過做模擬距離向量路由算法的路由表交換過程,使我更加深刻的了解了網絡路由層的協(xié)議。距離矢量路由算法簡單來說就是每個路由器維護一張表,表中給

16、出了到每個目的路由器的已知最短“距離”和相應輸出線路,并通過與相鄰路由器交換距離信息來更新表由運行結果可知實驗結果正確。起始點D下一跳為E到達G。其最短的距離為8.多次驗證均正確。本實驗的路由表由一個而為數組結構體實現(xiàn),數組名代表兩個相關路由,結構體中存放延時和下一跳。 路由表初始信息從文件讀取,根據距離向量路由算法系統(tǒng)自動完成路由表的更新操作,最后任意輸入兩個路由表接點,則可得出兩接點之間的最短路徑。 距離矢量路由算法在理論中可以工作,但在實踐中有一個嚴重的缺陷:雖然它總是能夠達到正確的答案,但是它收斂到正確答案的速度非常慢,尤其是,它對于好消息的反應非常快,但是對于壞消息的反應非常遲緩。實

17、驗二Socket通信實驗【實驗目的和要求】3. 掌握VB、VC+、VS或JAVA等集成開發(fā)環(huán)境編寫網絡程序的方法;4. 掌握客戶/服務器(C/S)應用的工作方式;5. 學習網絡中進程之間通信的原理和實現(xiàn)方法;6. 理解單播、組播和廣播的原理并比較其不同之處;7. 要求本機既是客戶端又是服務器端;【實驗內容】所編寫的程序應具有如下功能:1. 具有點對點通信功能,任意客戶端之間能夠發(fā)送消息;2. 具有群組通信功能,客戶端能夠向組內成員同時發(fā)送消息,其他組成員不能收到;3. 具有廣播功能,客戶端能夠向所有其他成員廣播消息;【實驗原理】實驗原理:Socket即為網絡上的兩個程序通過一個雙向的通信連接實

18、現(xiàn)數據的交換,這個雙向鏈路的一段成為一個socket。Socket通常用來實現(xiàn)客戶端和服務端的連接。它既能接受請求,也能發(fā)送請求。在我選擇使用java語言中,有專門的SocketServer類和Socket類來處理用戶的請求和響應。網絡編程是通過使用套接字來達到進程間通信目的的編程,Socket編程是網絡編程的主流工具,Socket API是實現(xiàn)進程間通信的一種編程設施,也是一種為進程間提供底層抽象的機制,提供了訪問下層通信協(xié)議的大量系統(tǒng)調用和相應的數據結構。【編程語言和環(huán)境】3. 編程語言C+4. 編程環(huán)境Windows(VC)【實驗具體設計實現(xiàn)及結果】服務器端客戶端socketbindli

19、stensocketconnectacceptrecvsendrecvclosesendclose阻塞自己等待客戶連接請求數據應答數據1. 點對點通信功能實現(xiàn)網絡點對點通訊程序的關鍵步驟就是實現(xiàn)信息在網絡中的發(fā)送和接收。數據接收使用的是Socket,數據發(fā)送使用的是NetworkStream。1.1利用Socket來接收信息TcpListener tlListen1 = new TcpListener ( 8889 ) ;    /偵聽端口號    tlListen1.Start ( ) ;    Soc

20、ket skSocket = tlListen1.AcceptSocket ( ) ;    /接受遠程計算機的連接請求,并獲得用以接收數據的Socket實例    EndPoint tempRemoteEP = skSocket.RemoteEndPoint  ;    /獲得遠程計算機對應的網絡遠程終結點    while (  true )          

21、  Byte byStream = new Byte80 ;         /定義從遠程計算機接收到數據存放的數據緩沖區(qū)         int i = skSocket.ReceiveFrom  ( byStream   , ref tempRemoteEP  ) ;         /接收數據,并存放到定義的緩沖區(qū)中 &#

22、160;       string sMessage = System.Text.Encoding.UTF8.GetString ( byStream  ) ;         /以指定的編碼,從緩沖區(qū)中解析出內容         MessageBox.Show ( sMessage ) ;         /顯示傳送來的數據&

23、#160;    1.2利用NetworkStream來傳送信息TcpClient tcpc = new TcpClient (  "13"  , 8888  ) ;     /對IP地址為“13”的計算機的8888端口提出連接申請    NetworkStream tcpStream = tcpc.GetStream ( ) ;    /如果連接申請建立,則獲得用以傳送數據的數據流str

24、ing sMsg = "您好,見到您很高興" ;    StreamWriter reqStreamW = new StreamWriter ( tcpStream  ) ;    /以特定的編碼往向數據流中寫入數據 ,默認為UTF8編碼    reqStreamW.Write ( sMsg  ) ;    /將字符串寫入數據流中    reqStreamW.Flush ( ) ;  &

25、#160; /清理當前編寫器的所有緩沖區(qū),并使所有緩沖數據寫入基礎流2. 群組通信功能組播編程需要UDP,有兩個類支持組播網絡編程Socket和UdpClient.一臺計算機要加入某一個組,然后接收發(fā)往這個組的信息。Socket類要調用SetSocketOption函數加入和離開某一個組。UdpClient類有直接的加入和離開某個組的成員函數可以調用。而向某個組發(fā)信息,則沒有什么特殊的,只需把發(fā)送數據的目的地址設為組播地址就可以了。發(fā)送端:            Socket s =

26、new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(""), 3000);            EndPoint ep =

27、 (EndPoint)iep;      byte b = Encoding.ASCII.GetBytes("just a test!");            s.SendTo(b, ep);            s.Close();接收端:    &#

28、160;         Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);              IPEndPoint iep = new IPEndPoint(IPAddress.Any, 3000);     

29、;         EndPoint ep=(EndPoint)iep;              s.Bind(iep);              s.SetSocketOption(SocketOptionLevel.IP,SocketOptionNam

30、e.AddMembership,new MulticastOption(IPAddress.Parse("");              byteb=new byte1024;              s.ReceiveFrom(b,ref ep);    

31、          string test;              test = System.Text.Encoding.ASCII.GetString(b);             Console.WriteLine(test); 

32、0;      s.Close();              Console.ReadKey();3. 廣播功能此功能和組播功能實現(xiàn)類似,只要在發(fā)送端獲得子網中IP廣播地址發(fā)送休息即可。/ 廣播模式(自動獲得子網中的IP廣播地址) broadcastIpEndPoint = new IPEndPoint(IPAddress.Broadcast, 3000);【實驗結果】【實驗總結】此次實驗是對Socket的一個應用

33、,讓我更深的了解了Socket函數的作用及使用方法。實驗過程中遇到了很多的問題,例如:程序只能通信一次。剛開始我以為建立的socket套接口只要建立一次并更新連接地址就可以多次使用。當初不知道問題存在的在于這,在程序加入很多錯誤報告代碼,發(fā)現(xiàn)再客戶端再次connect的時候返回負值。在網上查看很多相關代碼之后,發(fā)現(xiàn)問題所在,把建立socket的代碼寫進客戶端的循環(huán)體中,每次通信都重新建立socket套接口就可以。Socket搭建基本步驟:1、 創(chuàng)建socket;2、阻塞等待客戶端連接;3、客戶端連接之后獲取輸入輸出流,按照協(xié)議對客戶端進行讀寫;4、關閉socket??蛻舳诉B接的基本步驟也是一樣

34、的,即:1、創(chuàng)建客戶端,連上相應的服務器;2、連上之后獲取輸入輸出流,按照協(xié)議進行讀寫操作;3、關閉客戶端。通過本次實驗能夠感受到網絡在實際當中的運用,使我對網絡編程有了更深的概念。同時讓我發(fā)現(xiàn)自己知識結構的欠缺。比如群組通信功能和廣播功能難以實現(xiàn),需要我查閱大量的資料才能有所頭緒。源代碼:服務器端/#include "stdafx.h" 服務器端#include<tchar.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string

35、.h>#include <sys/types.h>#include<conio.h> #include<windows.h> #include<winsock2.h> #pragma comment(lib,"ws2_32.lib") #define MYPORT 3490 /*定義用戶連接端口*/ #define BACKLOG 10 /*多少等待連接控制*/ #define SERVER_IP_ADDR "1" /*服務器的IP地址*/ int _tmain(int argc,

36、 _TCHAR* argv) SOCKET sock, msgsock; int length = 0; struct sockaddr_in server; struct sockaddr tcpaddr; char buf1024 = "" int rval= 0, len= 0, err = 0; WORD wVersionRequested; WSADATA wsaData; /*指定socket版本,否則創(chuàng)建socket失敗,即使創(chuàng)建socket返回值不為-1,但是bind時會失敗*/ wVersionRequested = MAKEWORD( 2, 2 ); e

37、rr = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return -1; /* 建立套接字*/ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) perror("opening stream socket"); exit(1); /* 使用任意端口命名套接字*/ server.sin_family = AF_INET; server.sin_port = htons(MYPORT); server.sin_addr.s_addr

38、 = inet_addr(SERVER_IP_ADDR); memset(server.sin_zero, 0, sizeof(server.sin_zero); /將服務器地址與socket綁定在一起 rval = bind(sock, (struct sockaddr *)&server, sizeof(server); if (rval < 0) perror("binding stream socket"); exit(1); / 找出指定的端口號并打印出來 length = sizeof(server); if (getsockname(sock,

39、(struct sockaddr *)&server, &length) < 0) perror("getting socket name"); exit(1); printf("socket port #%dn", ntohs(server.sin_port); / 開始接收連接,最大請求數為 listen(sock, 5); len = sizeof(struct sockaddr); do msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&l

40、en); if (msgsock = -1) perror("accept"); else memset(buf, 0, sizeof(buf); if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0) perror("reading stream message"); if (rval = 0) printf("->%sn", buf); closesocket(msgsock); while(1); closesocket(msgsock);return 0;客戶端:#include<tchar.h>#include <stdio.h>#include <stdlib.h

溫馨提示

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

評論

0/150

提交評論