版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)分析為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對(duì)網(wǎng)卡進(jìn)行編程,在這里我們使用套接字(socket)進(jìn)行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式出發(fā)的數(shù)據(jù)包。對(duì)于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在驗(yàn)證投遞地址并非自身地址之后將不引起響應(yīng),也就是說(shuō)應(yīng)用程序無(wú)法收取與自己無(wú)關(guān)的數(shù)據(jù)包。我們要想獲取流經(jīng)網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就需要將網(wǎng)卡設(shè)置為混雜模式。本程序主要由三部分構(gòu)成:初始化原始套接字,反復(fù)監(jiān)聽(tīng)捕獲數(shù)據(jù)包和解析數(shù)據(jù)包。下面就結(jié)合核心代碼對(duì)程序的具體實(shí)現(xiàn)進(jìn)行講解,同時(shí)使程序流程更加清晰,去掉了錯(cuò)誤檢查等保
2、護(hù)性代碼。1. 使用原始套接字套接字分為三種,即流套接字(Stream Socket)、數(shù)據(jù)報(bào)套接字(Datagram Socket)和原始套接字(Raw Socket)。要進(jìn)行IP數(shù)據(jù)包的接受與發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下:SOCKET sock;Sock=WSASoccet(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERRLAPPED);在WSASoccet函數(shù)中,第一個(gè)參數(shù)指定通信發(fā)生的區(qū)字段,AF_INET是針對(duì)Internet的,允許在遠(yuǎn)程主機(jī)之間通信。第二個(gè)參數(shù)是套接字的類(lèi)型,AF_INET地址族下,有SOCK_
3、STREAM、SOCK_DGRAM、SOCK_RAW三種套接字類(lèi)型。在這里,我們?cè)O(shè)置為SOCK_RAW,表示我們聲明的是一個(gè)原始套接字類(lèi)型。第三個(gè)參數(shù)依賴(lài)于第二個(gè)參數(shù),用于指定套接字所用的特定協(xié)議,這里使用IP協(xié)議。第四個(gè)參數(shù)為WSAPROTOCOL_INFO位,該位可以置空,永遠(yuǎn)置0。第六個(gè)參數(shù)是標(biāo)志位,WSA_FLAG_OVERRLAPPED表明可以使用發(fā)送接收超時(shí)設(shè)置,本課程設(shè)計(jì)也可以把這個(gè)標(biāo)志位設(shè)置為NULL,因?yàn)楸驹O(shè)計(jì)不用考慮超時(shí)情況。創(chuàng)建原始套接字后,IP頭就會(huì)包含在接收的數(shù)據(jù)中。然后,我們可以設(shè)置IP頭操作選項(xiàng),調(diào)用sotscockpot函數(shù)。其中flag設(shè)置為T(mén)RUE,并設(shè)定I
4、P_HDRINCL選項(xiàng),表明用戶(hù)可以親自對(duì)IP頭進(jìn)行處理。BOOL flag=true;setsockopt (sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);之后,使用如下代碼完成對(duì)socket的初始化工作/*獲取主機(jī)名*/char hostname128;gethostname(hostname, 100);/*獲取IP地址*/hostent *pHostIP;pHostIP=gethostbyname(hostname);/* 填充SOCKADDR_IN的結(jié)構(gòu)內(nèi)容*/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); 填寫(xiě)sockaddr_in的內(nèi)容時(shí),其地址值應(yīng)填寫(xiě)為本機(jī)IP地址可以通過(guò)gethostbyname()函數(shù)獲??;端口號(hào)可以隨便填寫(xiě),但不能與系統(tǒng)沖突;協(xié)議族應(yīng)填寫(xiě)為AF_INET。注意,sockaddr_in 結(jié)構(gòu)的值必須是以網(wǎng)絡(luò)字節(jié)順序表示的值,而不能直接使用
6、本機(jī)字節(jié)順序的值,使用htoms()函數(shù)可以將無(wú)符號(hào)短整型的主機(jī)數(shù)據(jù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)的順序的數(shù)據(jù)。最后使用bind()函數(shù)將socket綁定到本地網(wǎng)卡上。 綁定網(wǎng)卡后,需要WSAIoctl()函數(shù)把網(wǎng)卡設(shè)置為混雜模式,使網(wǎng)卡能夠接收所有網(wǎng)絡(luò)數(shù)據(jù),其關(guān)鍵代碼如下:#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); 如果接收的數(shù)據(jù)包中的協(xié)議類(lèi)型和定義的原始套接字匹配,那么接收到的數(shù)據(jù)就拷貝到套接字中。因此,網(wǎng)卡就可以接收所有經(jīng)過(guò)的IP包。2.接收數(shù)據(jù)包 在程序中可使用RECV()函數(shù)接收經(jīng)過(guò)的IP包。該函數(shù)有四個(gè)參數(shù),第一個(gè)參數(shù)接收操作所用的套接字描述符;第二個(gè)參數(shù)接收到緩沖區(qū)的地址;第二個(gè)參數(shù)接收緩沖區(qū)的地址;第三個(gè)參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個(gè)參數(shù)是一個(gè)附加標(biāo)志,如果對(duì)所發(fā)送的數(shù)據(jù)沒(méi)特殊要求,直接設(shè)為0。因?yàn)镮P數(shù)據(jù)包的最大長(zhǎng)
8、度是65536B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來(lái)反復(fù)監(jiān)聽(tīng)接收IP包,用recv()函數(shù)接收功能的代碼如下:#dedine BUFFER_SIZE 65535Char bufferBUFFER_SIZE; /設(shè)置緩沖區(qū)While(true)recv(sock,buffer,BUFFER_SIZE,0); /j接收數(shù)據(jù)包.3.定義IP頭部的數(shù)據(jù)結(jié)構(gòu)程序需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu)表示IP頭部。這個(gè)數(shù)據(jù)結(jié)構(gòu)應(yīng)該和圖7-1吻合,其代碼如下:typedef struct _IP_HEADER /定義IP頭unionBYTE Version; /版本前4位BYTE HdrLen;
9、 /報(bào)頭標(biāo)長(zhǎng)(后四位),IP頭長(zhǎng)度;BYTE ServiceType;/服務(wù)類(lèi)型WORD TotalLen; /總長(zhǎng)度WORD ID; /標(biāo)識(shí)union WORD Flags; /標(biāo)志W(wǎng)ord FragOff; /分段偏移;BYTE TimeToLive; /生命期BYTE Protiocol; /協(xié)議WORD HdrChksum; /頭校驗(yàn)和DWORD SrcAddr; /源地址DWORD DstAddr: /目的地址BYTE Options; /選項(xiàng)IP_HEADER;這是我們只考慮IP頭部結(jié)構(gòu),不考慮數(shù)據(jù)部分。在捕獲IP數(shù)據(jù)包后,可以通過(guò)指針把緩沖區(qū)的內(nèi)容強(qiáng)制轉(zhuǎn)化為IP_HEADER數(shù)據(jù)
10、結(jié)構(gòu)。IP_HEADER ip = *( IP_HEADER *)buffer;4.IP包的解析解析IP包的字段有兩種策略。針對(duì)長(zhǎng)度為8位、16位和32位的字段 (或子字段)時(shí),可以利用IP_HEADER的成員指教獲取。要解析長(zhǎng)度不是9位倍數(shù)的字段(或子字段)時(shí),可以利用C語(yǔ)言中的位移以及與、或操作完成。下面給出了通過(guò)IP_HEADER解析IP頭各個(gè)字段的代碼。/*獲取版本字段*/ip.Version>>4;/*獲取頭部長(zhǎng)度字段*/ip.HdrLen & 0x0f;/*獲取服務(wù)類(lèi)型字段中的優(yōu)先級(jí)子域*/ip.ServiceType>>5;/*獲取服務(wù)類(lèi)型字段中的
11、TOS子域*/(IP.sERVICEtYPE>>1)&0X0F;/*獲取總長(zhǎng)度字段*/ip.TotalLEN;/*獲取標(biāo)識(shí)字段*/ip.ID;/*解析標(biāo)識(shí)字段*/DF=(ip.Flags>>14) &0x01;MF=(ip.Flags>>13) &0X01;/*獲取分段偏移字段*/ip.FragOff &0x1fff;/*獲取生存時(shí)間字段*/ip.TimeToLive;/*獲取協(xié)議字段*/ip.Protocol;/*獲取頭校驗(yàn)和字段*/ip.HdrChksum;/*解析源IP地址字段*/inet_ntoa(*(in_addr*
12、)&ip.SrcAddr;/*解析目的的IP地址字段*/inet_ntoa(*(in_addr*)&ip.DstAddr);程序運(yùn)行結(jié)果程序流程圖:開(kāi)始構(gòu)造程序運(yùn)行環(huán)境,生成輸出文件創(chuàng)建原始套接字,并初始化捕獲IP包解析IP包輸出IP包信息Ctrl+CN結(jié)束Y八實(shí)習(xí)體會(huì) 通過(guò)這次實(shí)驗(yàn),了解到關(guān)于計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)傳送及處理過(guò)程中,軟件起到了巨大的作用。熟悉了VC+在計(jì)算機(jī)網(wǎng)絡(luò)方面的應(yīng)用,是一次難得的機(jī)會(huì)。 同學(xué)們的默鍥配合和合作精神是實(shí)驗(yàn)成功的必要條件,而謹(jǐn)慎對(duì)待事物的態(tài)度是成功的關(guān)鍵。九. 參考文獻(xiàn):1計(jì)算機(jī)網(wǎng)絡(luò) 宋凱 劉念 金海月等2數(shù)據(jù)通信與網(wǎng)絡(luò)(第四版)吳時(shí)霖 周正康 吳永
13、輝 譯3計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì) 吳功宜 胡曉英 張仁 何云 王寧編著 程序源代碼#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頭部長(zhǎng)度
15、60; BYTE ServiceType;
16、; /服務(wù)類(lèi)型 WORD TotalLen; /總長(zhǎng)度 WORD ID; /標(biāo)識(shí) union WORD Flags; /標(biāo)志 WORD
17、;Fragoff; /分段偏移 BYTE TimeToLive; /生命期 BYTE Protocol; /協(xié)議 WORD HdrChksum; /頭校驗(yàn)和 DWORD SrcAddr;
18、60; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /選項(xiàng)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("開(kāi)始解析經(jīng)過(guò)本機(jī)的IP數(shù)據(jù)包!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頭部長(zhǎng)度: " << ( (ip.HdrLen & 0x0f) * 4) << endl; cout << "服務(wù)類(lèi)型: Priorit
28、y" << (ip.ServiceType >> 5) << ", Service" << ( (ip.ServiceType >> 1 ) & 0x0f) << endl; cout << "總長(zhǎng)度: &qu
29、ot; << ip.TotalLen << endl; cout << "標(biāo)識(shí)符: " << ip.ID << endl; cout << "標(biāo)志位: " << ( (ip.Flags >> 15) & 0x01) << ", DF = " << ( (ip.Flags >> 14) & 0x01) << ", Mf = "
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《金字塔原理》讀書(shū)筆記個(gè)人所感
- 2022年“安全生產(chǎn)月”宣傳活動(dòng)方案【4篇】
- 2021公司年終個(gè)人總結(jié)五篇
- 幼兒園教育實(shí)習(xí)調(diào)查報(bào)告匯編4篇
- 驕傲的初中滿(mǎn)分作文素材700字
- 科學(xué)發(fā)展觀提出的背景及形成與發(fā)展
- 生物學(xué)院食品安全-課件
- 全面保潔服務(wù)協(xié)議書(shū)(2篇)
- 兒童圖書(shū)銷(xiāo)售代理合同(2篇)
- 山西呂梁2025屆高三上學(xué)期11月期中考試化學(xué)試卷試題及答案解析
- 中班聽(tīng)課記錄15篇
- GB/T 8750-2022半導(dǎo)體封裝用金基鍵合絲、帶
- 體育科學(xué)研究方法學(xué)習(xí)通課后章節(jié)答案期末考試題庫(kù)2023年
- 2023天津市和平區(qū)七年級(jí)上學(xué)期語(yǔ)文期末試卷及答案
- 校園藝術(shù)節(jié)比賽評(píng)分表
- 挖機(jī)租賃協(xié)議(通用6篇)
- 院內(nèi)按病種分值付費(fèi)(DIP)專(zhuān)題培訓(xùn)
- 有機(jī)磷中毒專(zhuān)家共識(shí)
- 2023-2024學(xué)年遼寧省調(diào)兵山市小學(xué)數(shù)學(xué)五年級(jí)上冊(cè)期末高分通關(guān)試題
- 地方公務(wù)員考試:2022西藏真題及答案
- 電化學(xué)培優(yōu)專(zhuān)題
評(píng)論
0/150
提交評(píng)論