




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程設計分析為了獲取網絡中的IP數據包,必須對網卡進行編程,在這里我們使用套接字(socket)進行編程。但是,在通常情況下,網絡通信的套接字程序只能響應與自己硬件地址相匹配的數據包或是以廣播形式出發(fā)的數據包。對于其他形式的數據包,如已到達網絡接口但卻不是發(fā)送到此地址的數據包,網絡接口在驗證投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關的數據包。我們要想獲取流經網絡設備的所有數據包,就需要將網卡設置為混雜模式。本程序主要由三部分構成:初始化原始套接字,反復監(jiān)聽捕獲數據包和解析數據包。下面就結合核心代碼對程序的具體實現進行講解,同時使程序流程更加清晰,去掉了錯誤檢查等保
2、護性代碼。1. 使用原始套接字套接字分為三種,即流套接字(Stream Socket)、數據報套接字(Datagram Socket)和原始套接字(Raw Socket)。要進行IP數據包的接受與發(fā)送,應使用原始套接字。創(chuàng)建原始套接字的代碼如下:SOCKET sock;Sock=WSASoccet(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERRLAPPED);在WSASoccet函數中,第一個參數指定通信發(fā)生的區(qū)字段,AF_INET是針對Internet的,允許在遠程主機之間通信。第二個參數是套接字的類型,AF_INET地址族下,有SOCK_
3、STREAM、SOCK_DGRAM、SOCK_RAW三種套接字類型。在這里,我們設置為SOCK_RAW,表示我們聲明的是一個原始套接字類型。第三個參數依賴于第二個參數,用于指定套接字所用的特定協(xié)議,這里使用IP協(xié)議。第四個參數為WSAPROTOCOL_INFO位,該位可以置空,永遠置0。第六個參數是標志位,WSA_FLAG_OVERRLAPPED表明可以使用發(fā)送接收超時設置,本課程設計也可以把這個標志位設置為NULL,因為本設計不用考慮超時情況。創(chuàng)建原始套接字后,IP頭就會包含在接收的數據中。然后,我們可以設置IP頭操作選項,調用sotscockpot函數。其中flag設置為TRUE,并設定I
4、P_HDRINCL選項,表明用戶可以親自對IP頭進行處理。BOOL flag=true;setsockopt (sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);之后,使用如下代碼完成對socket的初始化工作/*獲取主機名*/char hostname128;gethostname(hostname, 100);/*獲取IP地址*/hostent *pHostIP;pHostIP=gethostbyname(hostname);/* 填充SOCKADDR_IN的結構內容*/sockaddr_in addr_in;addr_in.
5、sin_addr= *(in_addr*)pHostIP->h_addr_list0;addr_in.sin_family=AF_TNET;addr-in.sin_port=htons(6000); /* 綁定socket */bind(sock, (POSCKADDR)&addr_in,sizeof(addr_in); 填寫sockaddr_in的內容時,其地址值應填寫為本機IP地址可以通過gethostbyname()函數獲??;端口號可以隨便填寫,但不能與系統(tǒng)沖突;協(xié)議族應填寫為AF_INET。注意,sockaddr_in 結構的值必須是以網絡字節(jié)順序表示的值,而不能直接使用
6、本機字節(jié)順序的值,使用htoms()函數可以將無符號短整型的主機數據轉換為網絡字節(jié)的順序的數據。最后使用bind()函數將socket綁定到本地網卡上。 綁定網卡后,需要WSAIoctl()函數把網卡設置為混雜模式,使網卡能夠接收所有網絡數據,其關鍵代碼如下:#define SIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORD dwBufferLen10;DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;WSAIoctl(SnifferSocket,IO-RCVALL,&dwBufferInLen,sizeof(dwBuff
7、erInLen),&dwBufferLen,Sizeof(dwBufferLen),&dwByteReturned,NULL,NULL); 如果接收的數據包中的協(xié)議類型和定義的原始套接字匹配,那么接收到的數據就拷貝到套接字中。因此,網卡就可以接收所有經過的IP包。2.接收數據包 在程序中可使用RECV()函數接收經過的IP包。該函數有四個參數,第一個參數接收操作所用的套接字描述符;第二個參數接收到緩沖區(qū)的地址;第二個參數接收緩沖區(qū)的地址;第三個參數接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數;第四個參數是一個附加標志,如果對所發(fā)送的數據沒特殊要求,直接設為0。因為IP數據包的最大長
8、度是65536B,因此緩沖區(qū)的大小不能小于65535B。設置緩沖區(qū)后,可利用循環(huán)來反復監(jiān)聽接收IP包,用recv()函數接收功能的代碼如下:#dedine BUFFER_SIZE 65535Char bufferBUFFER_SIZE; /設置緩沖區(qū)While(true)recv(sock,buffer,BUFFER_SIZE,0); /j接收數據包.3.定義IP頭部的數據結構程序需要定義一個數據結構表示IP頭部。這個數據結構應該和圖7-1吻合,其代碼如下:typedef struct _IP_HEADER /定義IP頭unionBYTE Version; /版本前4位BYTE HdrLen;
9、 /報頭標長(后四位),IP頭長度;BYTE ServiceType;/服務類型WORD TotalLen; /總長度WORD ID; /標識union WORD Flags; /標志Word FragOff; /分段偏移;BYTE TimeToLive; /生命期BYTE Protiocol; /協(xié)議WORD HdrChksum; /頭校驗和DWORD SrcAddr; /源地址DWORD DstAddr: /目的地址BYTE Options; /選項IP_HEADER;這是我們只考慮IP頭部結構,不考慮數據部分。在捕獲IP數據包后,可以通過指針把緩沖區(qū)的內容強制轉化為IP_HEADER數據
10、結構。IP_HEADER ip = *( IP_HEADER *)buffer;4.IP包的解析解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段 (或子字段)時,可以利用IP_HEADER的成員指教獲取。要解析長度不是9位倍數的字段(或子字段)時,可以利用C語言中的位移以及與、或操作完成。下面給出了通過IP_HEADER解析IP頭各個字段的代碼。/*獲取版本字段*/ip.Version>>4;/*獲取頭部長度字段*/ip.HdrLen & 0x0f;/*獲取服務類型字段中的優(yōu)先級子域*/ip.ServiceType>>5;/*獲取服務類型字段中的
11、TOS子域*/(IP.sERVICEtYPE>>1)&0X0F;/*獲取總長度字段*/ip.TotalLEN;/*獲取標識字段*/ip.ID;/*解析標識字段*/DF=(ip.Flags>>14) &0x01;MF=(ip.Flags>>13) &0X01;/*獲取分段偏移字段*/ip.FragOff &0x1fff;/*獲取生存時間字段*/ip.TimeToLive;/*獲取協(xié)議字段*/ip.Protocol;/*獲取頭校驗和字段*/ip.HdrChksum;/*解析源IP地址字段*/inet_ntoa(*(in_addr*
12、)&ip.SrcAddr;/*解析目的的IP地址字段*/inet_ntoa(*(in_addr*)&ip.DstAddr);程序運行結果程序流程圖:開始構造程序運行環(huán)境,生成輸出文件創(chuàng)建原始套接字,并初始化捕獲IP包解析IP包輸出IP包信息Ctrl+CN結束Y八實習體會 通過這次實驗,了解到關于計算機網絡數據傳送及處理過程中,軟件起到了巨大的作用。熟悉了VC+在計算機網絡方面的應用,是一次難得的機會。 同學們的默鍥配合和合作精神是實驗成功的必要條件,而謹慎對待事物的態(tài)度是成功的關鍵。九. 參考文獻:1計算機網絡 宋凱 劉念 金海月等2數據通信與網絡(第四版)吳時霖 周正康 吳永
13、輝 譯3計算機網絡課程設計 吳功宜 胡曉英 張仁 何云 王寧編著 程序源代碼#include "winsock2.h"#include "ws2tcpip.h"#include <windows.h>#include<fstream>#include <iostream>#pragma comment(lib,"ws2_32.lib")using namespace std;typedef
14、60;struct _IP_HEADER union BYTE Version; /版本 BYTE HdrLen; /ip頭部長度
15、60; BYTE ServiceType;
16、; /服務類型 WORD TotalLen; /總長度 WORD ID; /標識 union WORD Flags; /標志 WORD
17、;Fragoff; /分段偏移 BYTE TimeToLive; /生命期 BYTE Protocol; /協(xié)議 WORD HdrChksum; /頭校驗和 DWORD SrcAddr;
18、60; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /選項IP_HEADER;int main () SOCKET sock; WSADATA wsData; if (WSAStartup(MAKEWORD(2,2),
19、160;&wsData) != 0) printf("WSAStartup failed!n"); return -1; if ( ( sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP) ) = INVALID_SOCKET ) printf("create
20、160;socket failedn"); return -1; BOOL flag = true; if ( setsockopt(sock, IPPROTO_IP, IP_HDRINCL,(char*)&flag, sizeof(flag) = SOCKET_ERROR ) printf("setsockopt failed!n"
21、;); return -1; char hostName128; if ( gethostname(hostName, 100) = SOCKET_ERROR ) printf("gethostname failed!n"); return -1; hostent* pHostIP; if( ( pHost
22、IP = gethostbyname(hostName) ) = NULL ) printf("gethostbyname failedn"); return -1; sockaddr_in addr_in; addr_in.sin_addr = *(in_addr*)pHostIP->h_addr_list0; addr_in.sin_family =
23、 AF_INET; addr_in.sin_port = htons(6000); if ( bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in) = SOCKET_ERROR ) printf("bind failedn"); return -1; #define IO_RCVALL _WSAIOW(
24、IOC_VENDOR,1) DWORD dwBufferLen10; DWORD dwBufferInLen = 1; DWORD dwBytesReturned = 0; char buffer100; if ( WSAIoctl(sock, IO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &
25、;dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL) = SOCKET_ERROR ) printf("ioctlsocket faildn"); return -1; printf("開始解析經過本機的IP數據包!nn"); while ( true )
26、 int size = recv(sock, buffer, sizeof(buffer), 0); IP_HEADER ip = *(IP_HEADER *)buffer; cout << "-" << endl; cout << "版本:
27、0;" << (ip.Version>>4) << endl; cout << "IP頭部長度: " << ( (ip.HdrLen & 0x0f) * 4) << endl; cout << "服務類型: Priorit
28、y" << (ip.ServiceType >> 5) << ", Service" << ( (ip.ServiceType >> 1 ) & 0x0f) << endl; cout << "總長度: &qu
29、ot; << ip.TotalLen << endl; cout << "標識符: " << ip.ID << endl; cout << "標志位: " << ( (ip.Flags >> 15) & 0x01) << ", DF = " << ( (ip.Flags >> 14) & 0x01) << ", Mf = "
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 可再生能源公司未來展望及發(fā)展趨勢
- 人才興旺面試題及答案
- 軟件推廣面試題及答案
- 人工智能產品市場需求調研與分析
- 林場考試題及答案
- 就業(yè)崗位面試題及答案
- 人民職業(yè)面試題及答案
- 麗水幼教面試題及答案
- 基于深度學習的工控系統(tǒng)入侵檢測技術研究
- 強化產品質量管理確保消費者信任
- 電梯考試復習測試卷附答案
- 醫(yī)學資料 單孔腹腔鏡在婦科中的應用 學習課件
- 賭博酒駕警示教育
- 建筑工程企業(yè)財務管理制度
- 電銷團隊管理心得
- 全站儀測角、測距記錄表(自動計算)
- 管理學基礎-形考任務三-國開-參考資料
- 無錫市2025年數學五下期末監(jiān)測試題含答案
- 工貿企業(yè)重大事故隱患判斷標準解讀培訓課件
- 2025-2030年地下管道檢測機器人行業(yè)跨境出海戰(zhàn)略研究報告
- 中小學校食堂膳食經費管理制度
評論
0/150
提交評論