監(jiān)控IP包流量05062124(吳文強)_第1頁
監(jiān)控IP包流量05062124(吳文強)_第2頁
監(jiān)控IP包流量05062124(吳文強)_第3頁
監(jiān)控IP包流量05062124(吳文強)_第4頁
監(jiān)控IP包流量05062124(吳文強)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、南昌航空大學(xué)計算機學(xué)院課程設(shè)計說明書課程名稱: 計算機網(wǎng)絡(luò)課程設(shè)計 設(shè)計題目: 監(jiān)控IP包流量 專業(yè): 網(wǎng)絡(luò)工程 班級: 050621 姓名: 吳文強 學(xué)號: 24 評分: 指導(dǎo)教師: 周之平 鄧林生 2008 年 6 月 29 日一課程設(shè)計目的 隨著Internet技術(shù)的發(fā)展,基于IP協(xié)議的網(wǎng)絡(luò)應(yīng)用成為網(wǎng)絡(luò)技術(shù)研究與軟件開發(fā)的一個重要基礎(chǔ),因此學(xué)習(xí)網(wǎng)絡(luò)層的基本概念,了解IP協(xié)議的基本內(nèi)容,對于掌握TCP/IP協(xié)議的主要內(nèi)容和學(xué)習(xí)網(wǎng)絡(luò)課程是十分重要的。通過本課程設(shè)計,有助于熟悉IP包格式和加深對IP協(xié)議的理解。二需求分析 1編制程序,監(jiān)控網(wǎng)絡(luò),捕獲一段時間內(nèi)網(wǎng)絡(luò)上IP數(shù)據(jù)包,按IP數(shù)據(jù)包的源地

2、址統(tǒng)計出該源地址在該時間內(nèi)發(fā)出的IP包個數(shù),將其寫入日志文件中或用圖形表示出來。2設(shè)計可視化圖形界面,可以進行捕獲操作和停止操作,并且捕獲完成后有統(tǒng)計結(jié)果顯示和日志文件生成。3程序設(shè)計采用C+或者Java(本次設(shè)計決定采用C+)。三概要設(shè)計本次課程設(shè)計的主要目的是接收統(tǒng)計IP包,所以主要任務(wù)就是設(shè)置網(wǎng)卡以及相關(guān)的一系列操作,而圖形界面的設(shè)計要求次之,所以主要介紹下我門對接收統(tǒng)計IP包的一些設(shè)計:定義一些用于存儲所要記錄的源地址和該源地址發(fā)出的包的個數(shù)的結(jié)構(gòu)體以及鏈表;主要是查找網(wǎng)卡,設(shè)置網(wǎng)卡為混雜模式,編輯過濾器,設(shè)置過濾器;捕獲IP數(shù)據(jù)包并按包的源地址進行統(tǒng)計(存入鏈表中)。程序流程圖如下:

3、 圖1程序流程圖四詳細設(shè)計及編碼(1)新建一個基于對話框的MFC AppWizardexe工程,取名為IPStatistic。在IDD_IPSTATISTIC_DIALOG中加入界面所需要的控件,所加的控件從上到下依次有靜態(tài)文本取名為網(wǎng)卡列表,下拉列表框(定義變量為m_comboboxx),靜態(tài)文本取名為捕獲包個數(shù),靜態(tài)文本(設(shè)置ID為IDC_CLOCK,用于顯示捕獲的包個數(shù)),開始捕獲按鈕,停止按鈕,退出按鈕,靜態(tài)文本(設(shè)置ID為IDC_STATE,用于表示當(dāng)前狀態(tài)),一個組合框(取名為統(tǒng)計結(jié)果如下:), 一個清空列表按鈕,最后一個是列表控制框(用于顯示最后捕獲的數(shù)據(jù)統(tǒng)計),此時的界面如下圖

4、: 圖2 初始化界面 (2)向工程里添加C+頭文件,命名為IPNodeList(存儲結(jié)構(gòu)接點和鏈表的定義),代碼如下: /IP結(jié)點類,存放IP包的源IP地址和其它發(fā)送數(shù)據(jù)包個數(shù)class IPNodeprivate: long m_lIPAddress; /IP地址 long m_lCount; /發(fā)送數(shù)據(jù)包數(shù) public: IPNode * pNext; /構(gòu)造函數(shù) IPNode(long sourceIP) m_lIPAddress=sourceIP; m_lCount=1; /初始化數(shù)據(jù)包個數(shù)為1 void addCount() m_lCount+; /返回數(shù)據(jù)包個數(shù) long get

5、Count() return m_lCount; /返回IP地址 long getIPAddress() return m_lIPAddress; ;/結(jié)點鏈表class NodeListIPNode * pHead; /鏈表頭 IPNode * pTail; /鏈表尾 public: NodeList() pHead=pTail=NULL; NodeList() if(pHead!=NULL) IPNode * pTemp=pHead; pHead=pHead-pNext; delete pTemp; /將IP結(jié)點加入鏈表 void addNode(long sourceIP) if(pHe

6、ad=NULL) /當(dāng)鏈表為空時 pTail=new IPNode(sourceIP); pHead=pTail; pTail-pNext=NULL; else /當(dāng)鏈表不為空時 for(IPNode * pTemp=pHead;pTemp;pTemp=pTemp-pNext) /如果鏈表中存在此IP,發(fā)送數(shù)據(jù)包個數(shù)加1 if(pTemp-getIPAddress()=sourceIP) pTemp-addCount(); break; /如果鏈表中沒有此IP,則加入鏈表 if(pTemp=NULL) pTail-pNext=new IPNode(sourceIP); pTail=pTail-

7、pNext; pTail-pNext=NULL; IPNode* GetpHead() return pHead;(3)本次設(shè)計需要用到Winpcap軟件,必須設(shè)置VC的環(huán)境,首先下載wpdpack,解壓后看到其中包含docs,Includes,lib,Examples等文件,然后打開VC,點擊“Tools-Option-Directories”, 在include files添加wpdpackInclude目錄;在Library files 中添加wpdpackLib目錄(4)在IPStatisticDlg.cpp中添加下列頭文件: #include stdafx.h#include IPS

8、tatistic.h#include IPStatisticDlg.h#include IPNodeList.h#include #include #include #include #include #include #include pcap.h#pragma comment(lib,Wpcap.lib)#pragma comment(lib,Ws2_32.lib) (5)定義一些程序中將要用的全局變量和IP包的頭部結(jié)構(gòu),如下:/IP包的頭部結(jié)構(gòu)struct ip_header unsigned char ver_ihl; unsigned char tos; unsigned short

9、 tlen; unsigned short identification; unsigned short flags_fo; unsigned char ttl; unsigned char proto; unsigned short crc; DWORD saddr; DWORD daddr; unsigned int op_pad; ;pcap_if_t *d; /當(dāng)前所用網(wǎng)卡pcap_if_t *alldev5; /所有網(wǎng)卡存儲數(shù)組pcap_t *fp; /網(wǎng)卡描述符char errbufPCAP_ERRBUF_SIZE; /錯誤信息存儲unsigned int netmask; /子網(wǎng)

10、掩碼char packet_filter=ip; /過濾,選擇IP協(xié)議struct bpf_program fcode; /將過濾規(guī)則轉(zhuǎn)換為內(nèi)核能夠處理的字節(jié)碼struct pcap_pkthdr *header; const unsigned char *pkt_data;NodeList link; /存儲數(shù)據(jù)用鏈表bool capstop; /信號量:線程需要中止。CWinThread* cap; /定義線程int count=0; /計數(shù)器(6)窗口初始化時加入的一些關(guān)鍵代碼如下: pcap_if_t *alldevs; /網(wǎng)卡鏈表的一個指針if(pcap_findalldevs(&a

11、lldevs,errbuf)=-1) MessageBox(找不到網(wǎng)卡!); /查找網(wǎng)卡int i;for(d=alldevs,i=0;d;d=d-next,i+)m_comboboxx.AddString(d-description); /下拉列表中顯示網(wǎng)卡描述alldevi=d; /將網(wǎng)卡存入數(shù)組中 m_comboboxx.SetCurSel(0); /下拉列表中第一項顯示0號網(wǎng)卡 m_listcontrol.InsertColumn(0,Source IP,LVCFMT_LEFT,170,-1); /列表控制框標題欄 m_listcontrol.InsertColumn(1,Packet

12、 numbers,LVCFMT_LEFT,155,-1); /列表控制框標題欄GetDlgItem(IDC_BUTTON3)-EnableWindow(false); /初始停止按鈕不可用 此時已經(jīng)找到主機上的網(wǎng)卡并加入到下拉列表中供用戶選擇,此時的界面如下: 圖3初始化窗口(有網(wǎng)卡選擇)(7)捕獲包線程函數(shù)定義如下: UINT Threadcap()if (fp= pcap_open_live(d-name, 65536, 1,1000, errbuf) = NULL) /以混雜模式打開網(wǎng)卡AfxMessageBox( 無法打開指定網(wǎng)卡! ); return 0; if(d-addresse

13、s!=NULL) netmask=(structsockaddr_in*)(d-addresses-netmask)-sin_addr.S_un.S_addr;/獲得子網(wǎng)掩碼 else netmask=0xffffff; if(pcap_compile(fp,&fcode,packet_filter,1,netmask)0) /編輯過濾器 AfxMessageBox(n無法編輯過器!n); return 0; if(pcap_setfilter(fp,&fcode)m_hWnd); int res; while(res=pcap_next_ex(fp,&header,&pkt_data)=0)

14、 /循環(huán)抓包 if(res=0) /如果沒抓到包,則結(jié)束此次循環(huán) continue; if(capstop=false)break; /接收到停止按鈕發(fā)來的終止線程信號,終止線程 count+; /如果抓到包,計數(shù)器加1 CString s; s.Format(%dn,count); pall-GetDlgItem(IDC_CLOCK)-SetWindowText(s); /改變顯示所抓到的包個數(shù) ip_header *ih; /一個臨時存儲 ih=(ip_header *)(pkt_data+14); /找到IP頭的位置 link.addNode(ih-saddr); /將源IP地址加入鏈表

15、 return 1;(8)捕獲按鈕關(guān)鍵代碼: void CIPStatisticDlg:OnButton1() d=alldevm_comboboxx.GetCurSel(); /找到用戶選擇的網(wǎng)卡GetDlgItem(IDC_STATE)-SetWindowText(正在捕獲中.); /顯示當(dāng)前狀態(tài)GetDlgItem(IDC_COMBO1)-EnableWindow(false); /網(wǎng)卡列表不可用 GetDlgItem(IDC_BUTTON1)-EnableWindow(false); /開始捕獲按鈕不可用 GetDlgItem(IDC_BUTTON3)-EnableWindow(tru

16、e); /停止按鈕變?yōu)榭捎胢_listcontrol.DeleteAllItems(); capstop=true; /信號量賦值cap=AfxBeginThread(AFX_THREADPROC)Threadcap,NULL); /創(chuàng)建線程并立即執(zhí)行 (9)停止按鈕代碼: void CIPStatisticDlg:OnButton3() GetDlgItem(IDC_STATE)-SetWindowText(已停止捕獲!); /顯示當(dāng)前狀態(tài)GetDlgItem(IDC_COMBO1)-EnableWindow(true); /網(wǎng)卡列表可用 GetDlgItem(IDC_BUTTON1)-En

17、ableWindow(true); /開始捕獲按鈕可用 GetDlgItem(IDC_BUTTON3)-EnableWindow(false); /停止按鈕不可用capstop=false; /發(fā)送信號,終止線程ofstream fout(login.txt,ios:app); /日志記錄文件 foutt捕獲IP包記錄如下:endl; /往日志文件寫東西 fout開始時間為:; time_t tmp=time(NULL); foutctime(&tmp); /寫入當(dāng)前系統(tǒng)時間作為捕獲開始時間 fout Sour IP tpacket numberspNext)/輸出結(jié)果到日志與列表 long

18、lTemp=pTemp-getIPAddress(); long r=pTemp-getCount(); foutinet_ntoa(*(in_addr*)&(lTemp)t; foutgetCount()endl; int row=m_listcontrol.InsertItem(0,inet_ntoa(*(in_addr*)&(lTemp);/將存儲的源地址輸出到列表控制框中 sprintf(tmpstr,%ld,(long*)r); /將r轉(zhuǎn)換為字符型 m_listcontrol.SetItemText(row,1,tmpstr); /將存儲的源IP地址所對應(yīng)的包個數(shù)輸出到列表控制框中(10)退出按鈕代碼: void CIPStatisticDlg:OnButton2() /退出按鈕 PostQuitMessage(0);(11)清空按鈕代碼:void CIPStatisticDlg:OnButton4() m_listcontrol.DeleteAllItems(); /清空列表控制框五系統(tǒng)調(diào)試與測試(一)程序的運行(1)由圖3中的有網(wǎng)卡選擇的初始化界面繼而完善各個按鈕功能以及抓包線程的定義后,程序可以運行,運行界面如下:圖4捕獲包中(2)再以上界面的基礎(chǔ)上按下停止按鈕后,進入停止狀態(tài)。此時截圖如下: 圖5 停止捕獲(3)停止捕獲后在界面上已經(jīng)顯示了I

溫馨提示

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

評論

0/150

提交評論