計算機網絡課程設計報告--監(jiān)控ip包流量_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課 程 設 計</b></p><p>  課程名稱 計算機網路課程設計</p><p>  題目名稱 監(jiān)控IP包流量</p><p>  學生學院 信息工程學院</p><p>  專業(yè)班級 電子信息工程(2)班</p><p>  學 號

2、 </p><p>  學生姓名 </p><p>  指導教師 </p><p>  2011 年 6 月 10 日</p><p><b>  目錄</b></p><p>  一、課程設計目的:………………………………………………3</p>

3、;<p>  二、課程設計要求:………………………………………………3</p><p>  三、課程設計主要思路分析:……………………………………3</p><p>  四、設計流程圖:………………………………………………….4</p><p>  五、運行結果:…………………………………………………….5</p><p>  

4、六、總結:………………………………………………………….6</p><p>  參考文獻…………………………………………………………..6</p><p>  源代碼:…………………………………………………………….6 </p><p><b>  一、課程設計目的</b></p><p>  隨著Internet技術的

5、發(fā)展,基于IP協議的應用成為網絡技術研究與軟件開發(fā)的一個重要基礎,因此學習網絡層以基本概念,了解IP協議的基本內容,對于掌握TCP/IP協議的主要內容和學習網絡課程是十分重要的,通過本次課程設計,有助于熟悉IP包格式和加深對IP協議的理解。</p><p><b>  二、課程設計要求</b></p><p>  編制程序,監(jiān)控網絡,捕獲一段時間內網絡上的IP數據包,

6、按IP數據包的源地址統計出該源地址在該時間段內發(fā)出的IP包的個數,將其寫入日志文件中或用圖形表示出來(建議用圖形表示出統計結果)。</p><p>  程序的具體要求如下:</p><p>  用命令行運行:IPStatistic time logfile</p><p>  其中,IPStatistic是程序名;time是設定的統計時間間隔(單位為分鐘,比如,2表

7、示2分鐘);logfile表示統計結果寫入的日志文件名(若用圖形表示統計結果則可以不選這個參數)。</p><p><b>  相關知識:</b></p><p>  IP是ICP/IP協議體系中的網絡層協議,TCP、UDP、ICMP和IGMP等其他協議都是以IP 協議為基礎的。IP的特點如下:</p><p>  IP協議是一種不可靠、無連接

8、的數據報傳送協議。</p><p>  IP協議是點對點的網絡層通信協議。</p><p>  IP協議向通信層隱藏了物理網絡的差異。</p><p>  三、課程設計主要思路分析</p><p>  1.課程設計中的重點及難點</p><p> ?。?)程序中會用到Winpcap, Winpcap是Windows p

9、acket capture的縮寫,這是UNIX下的lipbcap移植到Windows下的產物,是Win32環(huán)境下數據包捕獲的開放代碼函數庫。Winpcap由內核級的數據包過濾器,底層動態(tài)鏈接庫(packet.dll)和一個高層的獨立于系統的庫(wpcap.dll)組成。</p><p>  Winpcap提供以下功能:</p><p>  捕獲原始數據報,包括共享網絡上各主機發(fā)送/接收的數

10、據報以及各主機之間交換的數據報。</p><p>  在數據報發(fā)往應用程序之前,按照自定義的規(guī)則過濾某些特殊的數據報。</p><p>  將用戶構造的數據報發(fā)送到網絡中。</p><p><b>  統計網絡的流量。</b></p><p>  Winpcap的主要功能在于獨立于主機協議(如TCP/IP)發(fā)送和接收原始

11、數據報。也就是說,Winpcap不能阻塞、過濾或控制其他應用程序數據報的收發(fā),它只是監(jiān)聽共享網絡上傳送的數據報。因此,它不能用于QoS調度程序或個人防火墻。</p><p>  基于Winpcap的應用程序一般按照下面幾個步驟編寫:</p><p><b>  獲取網絡設備列表。</b></p><p><b>  選擇網卡并打開。&

12、lt;/b></p><p>  當捕獲數據包時,可能需要設置過濾器。</p><p>  捕獲數據包或者發(fā)送數據包。</p><p>  Packet.dll相關數據結構</p><p>  typedef struct_ADAPTER ADAPTER //描述一個網絡適配器</p><p>  type

13、def struct_PACKET PACKET具 //描述一組網絡數據報的結構</p><p>  typedef struct NetType NetType //描述網絡類型的數據結構</p><p>  typedef struct npf_if_addr npf_if_addr //描述一個網絡適配器的IP地址</p><p>  struct b

14、pf_hdr //數據報頭部</p><p>  struct bpf_stat //當前捕獲數據報</p><p> ?。?)列出網卡列表,讓用戶選擇可用的網卡。</p><p>  (3)注意過濾器的使用,只需捕獲IP所,別的包都需過濾掉。</p><

15、;p><b>  2.參考算法</b></p><p>  (1)取得當前網絡設備列表(在標準輸出上顯示,以讓用戶進行選擇)。</p><p> ?。?)將用戶選擇的Ethernet卡以混雜模式打開,以接收到所有的數據包。</p><p>  (3)設置過濾器,此處的過濾器“IP”。</p><p> ?。?)捕獲

16、IP包并按包的源地址進行統計(用鏈表結構進行實現)。程序流程如圖1-1所示:</p><p><b>  四、設計流程圖。</b></p><p><b>  圖1-1程序流程圖</b></p><p><b>  五、運行結果:</b></p><p>  安裝好WinPca

17、p軟件,在VC++界面上點擊工具->選項->目錄。添加Include文件夾下的所有文件和Lib下的所有內容,調試完程序無誤后,點擊開始—>運行“cmd”進入目標文件夾Debug下運行IPI.EXE文件并加入參數2 bl.txt。此時程序會檢測電腦系統中的網卡數,然后選擇程序運行時的網絡接口,耐心等待兩分鐘后就會得到程序的運行結果.</p><p>  圖1-2系統中網絡接口數</p>

18、<p>  圖1-3選擇第一個網絡接口</p><p>  圖1-4 1分鐘之后捕獲的ip地址和數據包</p><p><b>  六、總結:</b></p><p>  通過本次計算機網絡課程設計,我更加充分的理解了課本上的知識,并能夠加以擴展,從而應用于實踐當中,這幾天的課程設計令我受益匪淺,我意識到我們所學的東西將來都是要付

19、諸實踐的,所以一切要從實際情況出發(fā),理論聯系實際,這樣才能真正發(fā)揮我們所具備的能力。這次計算機網絡課程設計歷時二個星期,在整整十多天的日子里,可以說得是苦多于甜,但是可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。以前對于編程工具的使用還處于一知半解的狀態(tài)上,但是經過一段上機的實踐,對于怎么去排錯、查錯,怎么去看每一步的運行結果。通過這次課程設計使我懂得了理論與實際相結合是很重要的,

20、只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發(fā)現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固。這次課程設計終于順利完成了,在設計中遇到了很多編程問題,最后在老師的辛勤指</p><p>

21、;<b>  參考文獻</b></p><p>  [1] 吳功宜 胡曉英.計算機網課程設計 北京:機械工業(yè)出版社,2007.12.</p><p>  [2] 張蕘學 郭國強.計算機網絡與Internet教程(第二版) 北京:清華大學出版社2006.11.</p><p>  [3] 王春曉 趙艷標.計算機網絡教程 北京:機械工業(yè)出版社,20

22、05.08.</p><p>  [4] 張仁 何云.計算機網絡課程設計指導 北京:清華大學出版社 2006.05.</p><p><b>  源代碼: </b></p><p><b>  //主程序</b></p><p>  #include <iostream.h></p

23、><p>  #include <iomanip.h></p><p>  #include <fstream.h></p><p>  #include <stdlib.h></p><p>  #include <stdio.h></p><p>  #include &

24、lt;conio.h></p><p>  #include "pcap.h"</p><p>  //#include "IPNodeList.h"</p><p>  #pragma comment(lib,"Wpcap.lib")</p><p>  #pragma co

25、mment(lib,"Ws2_32.lib")</p><p>  //IP包的頭部包括</p><p>  struct ip_header{</p><p>  unsigned char ver_ihl; //版本號(4位)+頭部長度(4位)</p><p>  unsigned char tos

26、; //服務類型</p><p>  unsigned short tlen; //總長度</p><p>  unsigned short identification; //標識</p><p>  unsigned short flags_fo; //標志+片偏移</p>&

27、lt;p>  unsigned char tll; //生存時間</p><p>  unsigned char proto; //協議</p><p>  unsigned short crc; //校驗碼</p><p>  DWORD saddr;

28、 //源地址</p><p>  DWORD daddr; //目的地址</p><p>  unsigned int op_pad; //選項+填充</p><p><b>  };</b></p><p>  class IPNode</

29、p><p><b>  {</b></p><p><b>  private:</b></p><p>  long m_lIPAddress; //IP地址</p><p>  long m_lCount; //發(fā)送數據包數</p>&l

30、t;p><b>  public:</b></p><p>  IPNode *pNext; //指向下一個IP結點</p><p><b>  //構造函數</b></p><p>  IPNode(long sourceIP)</p><p><b>

31、  {</b></p><p>  m_lIPAddress=sourceIP;</p><p>  m_lCount=1; //初始化數據包個數為1</p><p><b>  }</b></p><p><b>  //數據包個數加1</b></p>

32、;<p>  void addCount()</p><p><b>  {</b></p><p>  m_lCount++;</p><p><b>  }</b></p><p><b>  //返回數據包個數</b></p><p>

33、;  long getCount()</p><p><b>  {</b></p><p>  return m_lCount;</p><p><b>  }</b></p><p><b>  //返回IP地址</b></p><p>  long

34、 getIPAddress()</p><p><b>  {</b></p><p>  return m_lIPAddress;</p><p><b>  }</b></p><p><b>  };</b></p><p><b>  

35、//結點鏈表</b></p><p>  class NodeList</p><p><b>  {</b></p><p>  IPNode *pHead;</p><p>  IPNode *pTail;</p><p>  public:NodeList()</p>

36、<p><b>  {</b></p><p>  pHead=pTail=NULL;</p><p><b>  }</b></p><p>  ~NodeList()</p><p><b>  {</b></p><p>  if(p

37、Head!=NULL)</p><p><b>  {</b></p><p>  IPNode *pTemp=pHead;</p><p>  pHead=pHead->pNext;</p><p>  delete pTemp;</p><p><b>  }</b>

38、;</p><p><b>  }</b></p><p>  //IP結點加入鏈表</p><p>  void addNode(long sourceIP)</p><p><b>  {</b></p><p>  if(pHead==NULL) //

39、當鏈表為空時</p><p><b>  {</b></p><p>  pTail=new IPNode(sourceIP);</p><p>  pHead=pTail;</p><p>  pTail->pNext=NULL;</p><p><b>  }</b>

40、;</p><p>  else //不為空時</p><p><b>  {</b></p><p>  for(IPNode *pTemp=pHead;pTemp;pTemp=pTemp->pNext)</p><p><b>  {</b><

41、/p><p>  //如果鏈表中存在此IP,發(fā)送數據包個數加1</p><p>  if(pTemp->getIPAddress()==sourceIP)</p><p><b>  {</b></p><p>  pTemp->addCount();</p><p><b> 

42、 break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //如果鏈表中沒有此IP,則加入鏈表</p><p>  if(pTemp==NULL)</p><p><b>  {</

43、b></p><p>  pTail->pNext=new IPNode(sourceIP);</p><p>  pTail=pTail->pNext;</p><p>  pTail->pNext=NULL;</p><p><b>  }</b></p><p>&l

44、t;b>  }</b></p><p><b>  }</b></p><p>  //輸出IP結點,即IP地址和其他送的IP包的個數</p><p>  ostream& print(ostream & out)</p><p><b>  {</b></p

45、><p>  for(IPNode *pTemp=pHead;pTemp;pTemp=pTemp->pNext)</p><p><b>  {</b></p><p>  long lTemp=pTemp->getIPAddress();</p><p>  out<<inet_ntoa(*(in_

46、addr*)&(lTemp))<<'\t';</p><p>  out<<pTemp->getCount()<<endl;</p><p><b>  }</b></p><p>  return out;</p><p><b>  }<

47、;/b></p><p><b>  };</b></p><p>  void main(int argc,char *argv[])</p><p><b>  {</b></p><p>  if (argc!=3) //判斷是否正確</p&

48、gt;<p><b>  {</b></p><p>  cout<<"Usage:IPStatistic time logfile"<<endl;</p><p>  cout<<"Press any key to continue..."<<endl;</p

49、><p><b>  _getch();</b></p><p><b>  return;</b></p><p><b>  }</b></p><p>  double min=atof(argv[1]);</p><p>  pcap_if_t *a

50、lldevs; //網絡設備結構</p><p>  pcap_if_t *d,*head=NULL;</p><p>  pcap_t *fp; //網卡描述</p><p>  char errbuf[PCAP_ERRBUF_SIZE]; //錯誤信息</p><p>

51、;  unsigned int netmask; //子網掩碼</p><p>  char packet_filter[]="ip"; //過濾,選擇IP協議</p><p>  struct bpf_program fcode;</p><p>  struct pcap_pkthdr *header;<

52、;/p><p>  const unsigned char *pkt_data;</p><p>  //獲取網絡設備列表</p><p>  if(pcap_findalldevs(&alldevs,errbuf) == -1)</p><p><b>  {</b></p><p>  c

53、out<<"Error in pcap_findalldevs:"<<errbuf;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  int i=1; //網卡數<

54、;/p><p>  if(i==0) //無設備</p><p><b>  {</b></p><p>  cout<<"\nNo interfaces found! Make sure Winpacp is installed.\n";</p><

55、;p><b>  return;</b></p><p><b>  }</b></p><p><b>  if(i>=1)</b></p><p><b>  {</b></p><p><b>  int j=0;</b&

56、gt;</p><p>  for(d=alldevs;d;d=d->next) //列出網卡列表,讓用戶進行選擇</p><p><b>  {</b></p><p>  cout<<++j<<":"<<d->name;</p><p>  if(d

57、->description)</p><p>  cout<<" "<<d->description<<endl;</p><p><b>  }</b></p><p>  cout<<"\nEnter the interface number(1-&q

58、uot;<<j<<"):";</p><p><b>  int k;</b></p><p><b>  cin>>k;</b></p><p>  if(k<1||k>j)</p><p><b>  {</b&

59、gt;</p><p>  cout<<"out of range"<<endl;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  for(d=alldevs,i=1;i<k;d=d-&

60、gt;next,i++); //找到選擇的網卡</p><p><b>  head=d;</b></p><p><b>  }</b></p><p>  //以混雜模式方式打開網卡</p><p>  if((fp=pcap_open_live(head->name,1000,1,1

61、000,errbuf))==NULL)</p><p><b>  {</b></p><p>  cout<<"\nUnable to open the adapter."<<endl;</p><p>  pcap_freealldevs(alldevs);</p><p>

62、;<b>  return;</b></p><p><b>  }</b></p><p><b>  //獲取子網掩碼</b></p><p>  if(head->addresses!=NULL)</p><p>  netmask=((struct sockadd

63、r_in*)(head->addresses->netmask))->sin_addr.S_un.S_addr;</p><p><b>  else</b></p><p>  //沒有地址則假設為C類地址</p><p>  netmask=0xFFFFFF00;</p><p><b>

64、  //編譯過濾器</b></p><p>  if(pcap_compile(fp,&fcode,packet_filter,1,netmask)<0)</p><p><b>  {</b></p><p>  cout<<"\nUnable to compile the packet fil

65、ter.Check the syntax.\n";</p><p>  pcap_freealldevs(alldevs);</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  //設置濾波器</b>

66、</p><p>  if(pcap_setfilter(fp,&fcode)<0)</p><p><b>  {</b></p><p>  cout<<"\nError setting the filter.\n";</p><p>  pcap_freealldevs

67、(alldevs);</p><p><b>  return;</b></p><p><b>  }</b></p><p>  //顯示提示信息及每項的含義</p><p>  cout<<"\t\tlistening on"<<head->d

68、escription<<"..."<<endl<<endl;</p><p>  ofstream fout(argv[2],ios::app); //日志記錄文件</p><p>  fout<<"\tIP Statistic:("<<min<<"

69、;minutes)"<<endl;</p><p>  time_t tmp=time(NULL);</p><p>  fout<<ctime(&tmp);</p><p>  cout<<"IP Statistic:("<<min<<"minutes)&q

70、uot;<<endl;</p><p>  fout<<" Sour ip"<<"\tpacket numbers"<<endl;</p><p><b>  //釋放設備列表</b></p><p>  pcap_freealldevs(alldevs);

71、</p><p>  NodeList link; //存儲數據用鏈表</p><p><b>  int res;</b></p><p>  time_t beg;</p><p>  time_t end;</p><p>  time(&am

72、p;beg); //獲取當前時間</p><p>  while((res=pcap_next_ex(fp,&header,&pkt_data))>=0)</p><p><b>  {</b></p><p>  time(&end);

73、 //獲得系統時間</p><p>  if(end-beg>=min*60) //計算系統時間</p><p><b>  break;</b></p><p>  if(res==0)</p><p>  continue; //超

74、時</p><p>  ip_header *ih;</p><p><b>  //找到I頭得位置</b></p><p>  ih=(ip_header*)(pkt_data+14); //14為以太頭的長度</p><p>  link.addNode(ih->saddr); //將源IP地

75、址加入鏈表</p><p><b>  }</b></p><p>  cout<<"Sour IP"<<'\t'<<"packet numbers"<<endl;</p><p>  link.print(cout);

溫馨提示

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

評論

0/150

提交評論