《網(wǎng)絡(luò)編程與協(xié)議分析》課程設(shè)計(jì)--網(wǎng)絡(luò)數(shù)據(jù)包抓取與分析軟件_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 </p><p>  課 程 設(shè) 計(jì) 報(bào) 告</p><p>  課程名稱(chēng):網(wǎng)絡(luò)編程與協(xié)議分析</p><p>  專(zhuān) 業(yè): </p><p>  班 級(jí): </p><p>  學(xué)

2、 號(hào): </p><p>  姓 名: </p><p>  指導(dǎo)老師: </p><p>  《網(wǎng)絡(luò)編程與協(xié)議分析》課程設(shè)計(jì)報(bào)告</p><p><b>  一、課設(shè)題目:</b></p><

3、;p>  網(wǎng)絡(luò)數(shù)據(jù)包抓取與分析軟件</p><p><b>  二、課設(shè)要求:</b></p><p>  能抓取本地主機(jī)所在局域網(wǎng)子網(wǎng)內(nèi)的所有數(shù)據(jù)包</p><p>  分析并顯示所抓取數(shù)據(jù)包的IP頭部各字段的信息</p><p>  分析并顯示所抓取數(shù)據(jù)包的封裝在IP數(shù)據(jù)包內(nèi)的協(xié)議頭部字段信息(TCP、UDP、

4、ICMP等)</p><p>  生成日志信息,以文本文檔形式保存</p><p>  分析并顯示所抓取數(shù)據(jù)包應(yīng)用層協(xié)議頭部字段信息(HTTP、FTP、DNS、Telnet、SMTP、POP等各種應(yīng)用層協(xié)議中至少取三種)</p><p>  三、用到的基本概念及原理</p><p> ?。?)Winpcap的組成和結(jié)構(gòu)</p>

5、<p>  (4)Winpcap基本原理</p><p> ?。?)NPF在windows系統(tǒng)中的位置</p><p><b>  (6)系統(tǒng)構(gòu)架</b></p><p><b>  四、部分代碼</b></p><p><b>  1)初始化套接字</b></

6、p><p>  BOOL CTestDlg::SockInit()</p><p><b>  {</b></p><p>  WSADATA wsa;</p><p>  if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)</p><p><b>  {&l

7、t;/b></p><p>  AfxMessageBox("WSAStartup fail!");</p><p><b>  }</b></p><p>  m_sock=socket(AF_INET,SOCK_RAW,0);</p><p>  if(m_sock==INVALID_SOC

8、KET)</p><p><b>  {</b></p><p>  AfxMessageBox("socket fail!");</p><p><b>  }</b></p><p>  SOCKADDR_IN addr;</p><p>  addr

9、.sin_family=AF_INET;</p><p>  addr.sin_port=htons(5000);</p><p>  struct hostent FAR * pHostent;</p><p>  char FAR name[25];</p><p>  gethostname(name, 25);</p>

10、<p>  pHostent = gethostbyname(name);</p><p>  memcpy(&addr.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_len);</p><p>  if(bind(m_sock,(SOCKADDR *)&addr,sizeof(ad

11、dr))!=0)</p><p><b>  {</b></p><p>  AfxMessageBox("bind fail!");</p><p><b>  }</b></p><p>  DWORD dwBytesRet;</p><p>  un

12、signed int optval = 1;</p><p>  int pCount=0;</p><p>  if(INVALID_SOCKET==(WSAIoctl(m_sock,SIO_RCVALL,&optval,sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL)))</p><p><

13、b>  {</b></p><p>  AfxMessageBox("WSAIoctl Fail!");</p><p>  return false;</p><p><b>  }</b></p><p>  return true;</p><p>&

14、lt;b>  }</b></p><p><b>  2)初始化表格</b></p><p>  BOOL CTestDlg::ListInit()</p><p><b>  {</b></p><p>  DWORD dwStyle = GetWindowLong(m_List

15、.m_hWnd, GWL_STYLE);</p><p>  SetWindowLong(m_List.m_hWnd,GWL_STYLE,dwStyle|LVS_REPO);</p><p>  DWORD dwStyles = m_List.GetExStyle();</p><p>  dwStyles &= ~LVS_EX_CHECKBOXES;<

16、;/p><p>  m_List.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT|LVXGRIDLINES);</p><p>  m_List.InsertColumn(1,"版本",LVCFMT_CENTER,40,0);</p><p>  m_List.InsertColumn(2,"頭

17、部長(zhǎng)度",LVCFMT_CENTER,60,1);</p><p>  m_List.InsertColumn(3,"服務(wù)類(lèi)型",LVCFMT_CENTER,60,2);</p><p>  m_List.InsertColumn(4,"總長(zhǎng)度",LVCFMT_CENTER,50,3);</p><p>  m_Li

18、st.InsertColumn(5,"標(biāo)識(shí)符",LVCFMT_CENTER,50,4);</p><p>  m_List.InsertColumn(6,"標(biāo)志位",LVCFMT_CENTER,50,5);</p><p>  m_List.InsertColumn(7,"片偏移",LVCFMT_CENTER,50,6);<

19、/p><p>  m_List.InsertColumn(8,"生存周期",LVCFMT_CENTER,60,7);</p><p>  m_List.InsertColumn(9,"協(xié)議",LVCFMT_CENTER,40,8);</p><p>  m_List.InsertColumn(10,"首部校驗(yàn)和"

20、;,LVCFMT_CENTER,80,9);</p><p>  m_List.InsertColumn(11,"源地址",LVCFMT_CENTER,100,10);</p><p>  m_List.InsertColumn(12,"目的IP地址",LVCFMT_CENTER,100,11);</p><p>  retu

21、rn true;</p><p><b>  }</b></p><p>  3)ip,tcp,udp,icmp頭部定義</p><p>  struct iphead</p><p><b>  {</b></p><p>  unsigned char ip_EdiAnd

22、Len;//版本&首部長(zhǎng)度</p><p>  unsigned char ip_Serve;//服務(wù)類(lèi)型</p><p>  unsigned short int ip_Len;//總長(zhǎng)度</p><p>  unsigned short int ip_Sign;//標(biāo)識(shí)</p><p>  unsig

23、ned short int ip_MarkAndMove;//標(biāo)識(shí)&片偏移</p><p>  unsigned char ip_Ttl;//生存時(shí)間</p><p>  unsigned char ip_Protocol;//上層協(xié)議</p><p>  unsigned short int ip_Sum;//首部校驗(yàn)和<

24、/p><p>  unsigned int ip_SoIp;//源ip</p><p>  unsigned int ip_DeIp;//目的ip</p><p><b>  };</b></p><p>  struct tcphead</p><p><b>  {&

25、lt;/b></p><p>  unsigned short tcp_SoPort; //16位的源端口</p><p>  unsigned short tcp_DePort; //16位的目的端口</p><p>  unsigned int tcp_Seq; //32位的序列號(hào)</p><

26、;p>  unsigned int tcp_Ack; //32位的確認(rèn)號(hào)</p><p>  unsigned char tcp_LenAndRes; //4位的首部長(zhǎng)度和4位的保留字</p><p>  unsigned char tcp_Flag; //2位的保留字和6位的標(biāo)志位</p><p>  unsi

27、gned short tcp_Win; //16位的窗口大小</p><p>  unsigned short tcp_Wum; //16位校驗(yàn)和</p><p>  unsigned short tcp_Mov; //16位的緊急數(shù)據(jù)偏移量</p><p><b>  };</b><

28、/p><p>  struct udphead</p><p><b>  {</b></p><p>  unsigned short udp_SoPort;//源端口</p><p>  unsigned short udp_DePort;//目的端口</p><p>  unsigne

29、d short udp_Len;//總長(zhǎng)度</p><p>  unsigned short udp_Sum;//校驗(yàn)和</p><p><b>  };</b></p><p>  struct icmphead</p><p><b>  {</b></p><p

30、>  unsigned char icmp_Type; //類(lèi)型</p><p>  unsigned char icmp_Code; //代碼</p><p>  unsigned short icmp_Sum; //16位檢驗(yàn)和</p><p><b>  };</b></p><p&

31、gt;  4)“開(kāi)始”按鈕事件</p><p>  void CTestDlg::OnStart() </p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code here</p><p>  DWORD code;&

32、lt;/p><p>  if (!GetExitCodeThread(m_thr,&code) || (code != STILL_ACTIVE))</p><p><b>  {</b></p><p>  alldata * recvdata=new alldata;</p><p>  recvdata-

33、>lis=&m_List;</p><p>  recvdata->sock=m_sock;</p><p>  m_thr=CreateThread(NULL,0,RecvProc,(LPVOID)recvdata,0,NULL);</p><p>  CloseHandle(m_thr);</p><p><b

34、>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  m_List.DeleteAllItems();</p><p>  ResumeThread(m_thr);</p><p><

35、;b>  }</b></p><p>  GetDlgItem(IDC_STOP)->EnableWindow(TRUE);</p><p>  GetDlgItem(IDC_START)->EnableWindow(FALSE);</p><p>  GetDlgItem(IDC_STOP)->SetFocus();</p

36、><p><b>  }</b></p><p>  5)數(shù)據(jù)包抓取與初步處理</p><p>  DWORD WINAPI CTestDlg::RecvProc(LPVOID lpParameter)</p><p><b>  {</b></p><p>  SOCKET s

37、ock=((alldata*)lpParameter)->sock;</p><p>  CListCtrl * lis=(CListCtrl *)(((alldata*)lpParameter)->lis);</p><p>  struct iphead *ih;</p><p>  SOCKADDR_IN tem;</p><p

38、>  char RecvBuf[65535] = {0};</p><p>  char soip[16];</p><p>  char deip[16];</p><p>  char buf[100];</p><p><b>  int i=0;</b></p><p><b&

39、gt;  while(1)</b></p><p><b>  {</b></p><p>  if(int a=recv(sock,ddat[++count].buff,sizeof(ddat[count].buff),0)<=0)</p><p><b>  continue;</b></p&g

40、t;<p>  ih=(struct iphead *)(ddat[count].buff);</p><p>  tem.sin_addr.s_addr=ih->ip_SoIp;</p><p>  strncpy(soip,inet_ntoa(tem.sin_addr),16);</p><p>  tem.sin_addr.s_addr=i

41、h->ip_DeIp;</p><p>  strncpy(deip,inet_ntoa(tem.sin_addr),16);</p><p>  lis->InsertItem(i, "fdgfg"); </p><p>  sprintf(buf,"%d",ih->ip_EdiAndLen>>

42、4);</p><p>  lis->SetItemText(i,0,buf);</p><p>  sprintf(buf,"%d",ih->ip_EdiAndLen&0xf);</p><p>  lis->SetItemText(i,1,buf);</p><p>  sprintf(buf

43、,"%d",ih->ip_Serve);</p><p>  lis->SetItemText(i,2,buf);</p><p>  sprintf(buf,"%d",ih->ip_Len);</p><p>  lis->SetItemText(i,3,buf);</p><p&

44、gt;  sprintf(buf,"%d",ih->ip_Sign);</p><p>  lis->SetItemText(i,4,buf);</p><p>  sprintf(buf,"%d",ih->ip_MarkAndMove >>13);</p><p>  lis->SetIt

45、emText(i,5,buf);</p><p>  sprintf(buf,"%d",ih->ip_MarkAndMove&0x1fff);</p><p>  lis->SetItemText(i,6,buf);</p><p>  sprintf(buf,"%d",ih->ip_Ttl);<

46、;/p><p>  lis->SetItemText(i,7,buf);</p><p>  switch((int)ih->ip_Protocol)</p><p><b>  {</b></p><p>  case 1:sprintf(buf,"%s","ICMP&qu

47、ot;);break;</p><p>  case 2:sprintf(buf,"%s","IGMP");break;</p><p>  case 6:sprintf(buf,"%s","TCP");break;</p><p>  case 8:sprintf(buf,"

48、%s","EGP");break;</p><p>  case 9:sprintf(buf,"%s","IGP");break;</p><p>  case 17:sprintf(buf,"%s","UDP");break;</p><p>  case

49、 41:sprintf(buf,"%s","IPv6");break;</p><p>  case 89:sprintf(buf,"%s","OSPF");break;</p><p>  default:sprintf(buf,"%s","Error");</p

50、><p><b>  }</b></p><p>  lis->SetItemText(i,8,buf);</p><p>  sprintf(buf,"%d",ih->ip_Sum);</p><p>  lis->SetItemText(i,9,buf);</p>&

51、lt;p>  sprintf(buf,"%s",soip);</p><p>  lis->SetItemText(i,10,buf);</p><p>  sprintf(buf,"%s",deip);</p><p>  lis->SetItemText(i,11,buf);</p><

52、;p><b>  i++;</b></p><p>  Sleep(100);</p><p><b>  }</b></p><p>  return true;</p><p><b>  }</b></p><p><b>  6)

53、表格單擊事件</b></p><p>  void CTestDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) </p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code he

54、re</p><p>  NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;</p><p>  CString buf;</p><p>  char tem[100];</p><p><b>  int i;</b></p><p>  if(p

55、NMListView->iItem != -1)</p><p><b>  {</b></p><p>  i=pNMListView->iItem;</p><p>  CString strtemp;</p><p>  CNewDlg newdlg;</p><p>  iph

56、ead *iph=(iphead *)(ddat[i].buff);</p><p>  tcphead th=*((tcphead *)(ddat[i].buff+(iph->ip_EdiAndLen&0xf)*4));</p><p>  udphead uh=*((udphead *)(ddat[i].buff+(iph->ip_EdiAndLen&0xf

57、)*4));</p><p>  icmphead ih=*((icmphead *)(ddat[i].buff+(iph->ip_EdiAndLen&0xf)*4));</p><p>  switch((int)iph->ip_Protocol)</p><p><b>  {</b></p><p&

58、gt;<b>  case 6:</b></p><p>  sprintf(tem,"源端口:%d\r\n",th.tcp_SoPort);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,"目的端口:%d\r\n",th.tcp

59、_DePort);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,"序列號(hào):%d\r\n",th.tcp_Seq);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,&quo

60、t;確認(rèn)號(hào):%d\r\n",th.tcp_Ack);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,"數(shù)據(jù)偏移:%d\r\n",th.tcp_LenAndRes>>4);</p><p><b>  buf+=tem;</b>&

61、lt;/p><p>  sprintf(tem,"保留:%d\r\n",th.tcp_LenAndRes&0xf);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,"標(biāo)志:%d\r\n",th.tcp_Flag&0x3f);</p&g

62、t;<p><b>  buf+=tem;</b></p><p>  sprintf(tem,"窗口:%d\r\n",th.tcp_Win);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,"校驗(yàn)和:%d\r\n"

63、,th.tcp_Wum);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,"緊急指針:%d\r\n",th.tcp_Mov);</p><p><b>  buf+=tem;</b></p><p>  newdlg.m_da

64、ta=buf;</p><p><b>  break;</b></p><p><b>  case 17:</b></p><p>  sprintf(tem,"源端口:%d\r\r\n",uh.udp_SoPort);</p><p><b>  buf+=tem

65、;</b></p><p>  sprintf(tem,"目的端口:%d\r\n",uh.udp_DePort);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,"長(zhǎng)度:%d\r\n",uh.udp_Len);</p><

66、;p><b>  buf+=tem;</b></p><p>  sprintf(tem,"校驗(yàn)和:%d\r\n",uh.udp_Sum);</p><p><b>  buf+=tem;</b></p><p>  newdlg.m_data=buf;</p><p>&

67、lt;b>  break;</b></p><p><b>  case 1:</b></p><p>  sprintf(tem,"類(lèi)型:%d\r\n",ih.icmp_Type);</p><p><b>  buf+=tem;</b></p><p>  

68、sprintf(tem,"代碼:%d\r\n",ih.icmp_Code);</p><p><b>  buf+=tem;</b></p><p>  sprintf(tem,"校驗(yàn)和:%d\r\n",ih.icmp_Sum);</p><p><b>  buf+=tem;</b>

69、;</p><p>  newdlg.m_data=buf;</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  AfxMessageBox("No Data!");</p><p>

70、  newdlg.m_data="";</p><p><b>  }</b></p><p>  newdlg.DoModal();</p><p><b>  }</b></p><p>  *pResult = 0;</p><p><b>

71、;  }</b></p><p>  7)“停止”按鈕事件</p><p>  void CTestDlg::OnStop() </p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code here<

72、/p><p>  SuspendThread(m_thr);</p><p>  DWORD code;</p><p>  CString strDate;</p><p>  CString strBuf;</p><p>  int index = m_List.GetItemCount();</p>

73、<p>  int i,j = 0;</p><p>  GetExitCodeThread(m_thr,&code);</p><p>  if (code != STILL_ACTIVE)</p><p><b>  {</b></p><p>  AfxMessageBox("程序初始化

74、失?。n請(qǐng)檢查配置后重新運(yùn)行!");</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  CTime ttime = CTime::GetCurrentTime();<

75、;/p><p>  strDate.Format("%d-%d-%d-",ttime.GetYear(),ttime.GetMonth(),ttime.GeD </p><p><b>  ay());</b></p><p>  strDate += ttime.Format("%H-%M-%S"

76、);</p><p>  ofstream outfile("history\\" + strDate + ".log");</p><p>  outfile<<setw(6)<<"版本"</p><p>  <<setw(10)<<"頭部長(zhǎng)度&q

77、uot;</p><p>  <<setw(10)<<"服務(wù)類(lèi)型"</p><p>  <<setw(8)<<"總長(zhǎng)度"</p><p>  <<setw(8)<<"標(biāo)識(shí)符"</p><p>  <<

78、setw(8)<<"標(biāo)志位"</p><p>  <<setw(8)<<"片偏移"</p><p>  <<setw(10)<<"生存周期"</p><p>  <<setw(6)<<"協(xié)議"</p

79、><p>  <<setw(12)<<"首部校驗(yàn)和"</p><p>  <<setw(20)<<"源地址"</p><p>  <<setw(20)<<"目的IP地址"</p><p><b>  <

80、;<endl;</b></p><p>  while (j < index)</p><p><b>  {</b></p><p>  for (i = 0;i < 12;i++)</p><p><b>  {</b></p><p>  

81、strBuf = m_List.GetItemText(j,i);</p><p><b>  switch(i)</b></p><p><b>  {</b></p><p><b>  case 0:</b></p><p>  outfile<<setw(6

82、)<<strBuf;</p><p><b>  break;</b></p><p><b>  case 1:</b></p><p>  outfile<<setw(10)<<strBuf;</p><p><b>  break;</b&g

83、t;</p><p><b>  case 2:</b></p><p>  outfile<<setw(10)<<strBuf;</p><p><b>  break;</b></p><p><b>  case 3:</b></p>

84、<p>  outfile<<setw(8)<<strBuf;</p><p><b>  break;</b></p><p><b>  case 4:</b></p><p>  outfile<<setw(8)<<strBuf;</p>&l

85、t;p><b>  break;</b></p><p><b>  case 5:</b></p><p>  outfile<<setw(8)<<strBuf;</p><p><b>  break;</b></p><p><b>

86、;  case 6:</b></p><p>  outfile<<setw(8)<<strBuf;</p><p><b>  break;</b></p><p><b>  case 7:</b></p><p>  outfile<<setw(

87、10)<<strBuf;</p><p><b>  break;</b></p><p><b>  case 8:</b></p><p>  outfile<<setw(6)<<strBuf;</p><p><b>  break;</b&

88、gt;</p><p><b>  case 9:</b></p><p>  outfile<<setw(12)<<strBuf;</p><p><b>  break;</b></p><p><b>  case 10:</b></p>

89、;<p>  outfile<<setw(20)<<strBuf;</p><p><b>  break;</b></p><p><b>  case 11:</b></p><p>  outfile<<setw(20)<<strBuf;</p>

90、;<p>  outfile<<endl;</p><p><b>  j++;</b></p><p>  break;</p><p><b>  }</b></p><p><b>  }</b></p><p>

91、<b>  }</b></p><p>  outfile.close();</p><p>  AfxMessageBox("數(shù)據(jù)已寫(xiě)入日志文件!");</p><p><b>  }</b></p><p>  GetDlgItem(IDC_STOP)->EnableW

92、indow(FALSE);</p><p>  GetDlgItem(IDC_START)->EnableWindow(TRUE);</p><p>  GetDlgItem(IDC_START)->SetFocus();</p><p><b>  }</b></p><p><b>  五、

93、程序截圖</b></p><p><b>  “開(kāi)始”</b></p><p><b>  “停止”</b></p><p><b>  TCP</b></p><p><b>  UDP</b></p><p><

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論