網(wǎng)絡(luò)通信協(xié)議分析課程設(shè)計(jì)源代碼和實(shí)驗(yàn)報(bào)告+幀封裝、IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第1頁(yè)
網(wǎng)絡(luò)通信協(xié)議分析課程設(shè)計(jì)源代碼和實(shí)驗(yàn)報(bào)告+幀封裝、IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第2頁(yè)
網(wǎng)絡(luò)通信協(xié)議分析課程設(shè)計(jì)源代碼和實(shí)驗(yàn)報(bào)告+幀封裝、IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第3頁(yè)
網(wǎng)絡(luò)通信協(xié)議分析課程設(shè)計(jì)源代碼和實(shí)驗(yàn)報(bào)告+幀封裝、IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第4頁(yè)
網(wǎng)絡(luò)通信協(xié)議分析課程設(shè)計(jì)源代碼和實(shí)驗(yàn)報(bào)告+幀封裝、IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、網(wǎng)絡(luò)協(xié)議分析課程設(shè)計(jì)之協(xié)議編程實(shí)驗(yàn)一 幀封裝實(shí)驗(yàn)?zāi)康模?編寫程序,根據(jù)給出的原始數(shù)據(jù),組裝一個(gè)IEEE 802.3格式的幀(題目)默認(rèn)的輸入文件為二進(jìn)制原始數(shù)據(jù)(文件名分別為input1和input2)。 要求程序?yàn)槊钚谐绦?。比如,可?zhí)行文件名為framer.exe,則命令行形式如下:framer inputfile outputfile,其中,inputfile為原始數(shù)據(jù)文件,outputfile為輸出結(jié)果。 輸出:對(duì)應(yīng)input1和input2得結(jié)果分別為output1和output2。試驗(yàn)要求: 編寫程序,根據(jù)給出的原始數(shù)據(jù),組裝一個(gè)IEEE 802.3格式的幀(題目)默認(rèn)的輸入文件為

2、二進(jìn)制原始數(shù)據(jù)(文件名分別為input1和input2)。 要求程序?yàn)槊钚谐绦?。比如,可?zhí)行文件名為framer.exe,則命令行形式如下:framer inputfile outputfile,其中,inputfile為原始數(shù)據(jù)文件,outputfile為輸出結(jié)果。輸出:對(duì)應(yīng)input1和input2得結(jié)果分別為output1和output2驗(yàn)設(shè)計(jì)相關(guān)知識(shí):幀:來(lái)源于串行線路上的通信。其中,發(fā)送者在發(fā)送數(shù)據(jù)的前后各添加特殊的字符,使它們成為一個(gè)幀。Ethernet從某種程度上可以被看作是機(jī)器之間的數(shù)據(jù)鏈路層連接。按802.3標(biāo)準(zhǔn)的幀結(jié)構(gòu)如下表所示(802.3標(biāo)準(zhǔn)的Ethernet幀結(jié)構(gòu)由7

3、部分組成)802.3標(biāo)準(zhǔn)的幀結(jié)構(gòu)前導(dǎo)碼幀前定界符目的地址源地址長(zhǎng)度字段數(shù)據(jù)字段校驗(yàn)字段7B1B(2/6B)(2/6B)(2B)(長(zhǎng)度可變)(4B)其中,幀數(shù)據(jù)字段的最小長(zhǎng)度為46B。如果幀的LLC數(shù)據(jù)少于46B,則應(yīng)將數(shù)據(jù)字段填充至46B。填充字符是任意的,不計(jì)入長(zhǎng)度字段值中。在校驗(yàn)字段中,使用的是CRC校驗(yàn)。校驗(yàn)的范圍包括目的地址字段、源地址字段、長(zhǎng)度字段、LLC數(shù)據(jù)字段。循環(huán)冗余編碼(CRC)是一種重要的線性分組碼、編碼和解碼方法,具有簡(jiǎn)單、檢錯(cuò)和糾錯(cuò)能力強(qiáng)等特點(diǎn),在通信領(lǐng)域廣泛地用于實(shí)現(xiàn)差錯(cuò)控制。CRC校驗(yàn)碼的檢錯(cuò)能力很強(qiáng),不僅能檢查出離散錯(cuò)誤,還能檢查出突發(fā)錯(cuò)誤。利用CRC進(jìn)行檢錯(cuò)的過(guò)

4、程可簡(jiǎn)單描述如下:在發(fā)送端根據(jù)要傳送的k位二進(jìn)制碼序列,以一定的規(guī)則產(chǎn)生一個(gè)校驗(yàn)用的r位監(jiān)督碼(CRC碼),附在原始信息的后邊,構(gòu)成一個(gè)新的二進(jìn)制碼序列(共k+r位),然后發(fā)送出去。在接收端,根據(jù)信息碼和CRC碼之間所遵循的規(guī)則進(jìn)行檢驗(yàn),以確定傳送中是否出錯(cuò)。這個(gè)規(guī)則在差錯(cuò)控制理論中稱為“生成多項(xiàng)式”。CRC的基本實(shí)現(xiàn)前導(dǎo)碼幀前定界符目的地址源地址長(zhǎng)度字段數(shù)據(jù)字段校驗(yàn)字段7B1B(2/6B)(2/6B)(2B)(長(zhǎng)度可變)(4B)循環(huán)冗余校驗(yàn)碼的特點(diǎn):(1)CRC校驗(yàn)碼可檢測(cè)出所有單個(gè)錯(cuò)誤。(2)CRC校驗(yàn)碼可檢測(cè)出所有奇數(shù)位錯(cuò)誤。(3)CRC校驗(yàn)碼可檢測(cè)出所有雙位的錯(cuò)誤(4)CRC校驗(yàn)碼可檢

5、測(cè)出所有小于、等于校驗(yàn)位長(zhǎng)度的突發(fā)錯(cuò)誤。(5)CRC校驗(yàn)碼可以的概率檢測(cè)出長(zhǎng)度為(K+1)位的突發(fā)錯(cuò)誤實(shí)驗(yàn)分析: 填充幀頭部字段 要完成一次幀封裝的過(guò)程,首先要完成的就是幀頭部的裝入,這一過(guò)程只要將簽到嗎、定界符、目的地址、源地址、長(zhǎng)度字段的相應(yīng)數(shù)值按順序?qū)懭刖涂梢粤?。其中,長(zhǎng)度字段的值即為要發(fā)送的數(shù)據(jù)的實(shí)際長(zhǎng)度。 填充數(shù)據(jù)字段在填充數(shù)據(jù)字段的過(guò)程中要注意的主要問(wèn)題是數(shù)據(jù)字段的長(zhǎng)度。802.3標(biāo)準(zhǔn)中規(guī)定了幀數(shù)據(jù)字段的最小長(zhǎng)度為46B,最大長(zhǎng)度為1500B。如果數(shù)據(jù)不足46B,則需要通過(guò)填充0來(lái)補(bǔ)足;若數(shù)據(jù)長(zhǎng)度超過(guò)1500B,則的大獎(jiǎng)超過(guò)部分封裝入下一個(gè)幀進(jìn)行發(fā)送。 CRC校驗(yàn) 幀封裝的最后一步

6、就是對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),并將校驗(yàn)結(jié)果記入幀校驗(yàn)字段。程序流程圖:CRC計(jì)算流程圖:序源代碼:#include#include#includevoid main(int argc,char*argv) /如果輸入命令行不正確,則輸出提示后退出。 if(argc!=3) coutendl請(qǐng)按以下格式輸入:framer inputfile outputfileendl; exit(0); /打開(kāi)指定的輸出文件,以二進(jìn)制方式打開(kāi)并可讀可寫,如文件存在,則清除其內(nèi)容。 fstream file(argv2,ios:out|ios:in|ios:binary|ios:trunc,0); for(int i=0

7、;i8); file.put(char(length&0xff);/將文件長(zhǎng)度值按照逆序?qū)懭氲捷敵鑫募拈L(zhǎng)度字段中。 file.write(data,length);/將data內(nèi)容寫入到輸出文件中。 /如果輸入文件長(zhǎng)度不足B,則用補(bǔ)足B。 if(length46) for(int j=length;j46;j+) file.put(char(0x00); file.put(char(0x00);/將數(shù)據(jù)字段后添加個(gè) file.seekg(8,ios:beg);/將讀指針指向目的地址字段,從此處開(kāi)始CRC計(jì)算 unsigned char ch;/ch用來(lái)保存讀入的字符。 unsigned ch

8、ar crc=char(0x00);/余數(shù)初始值為。 while(1)/進(jìn)行CRC計(jì)算 file.get(ch); if(ch=0xff)/判斷是否到了文件結(jié)尾,如果是,則退出循環(huán)。 break; for(i=0;i8;i+)/對(duì)入讀入的字符的位分別處理。 if(0x80=(crc&(0x80)/當(dāng)前余數(shù)最高位為,需要進(jìn)行除法運(yùn)算。 crc=(crc7);/將輸入數(shù)據(jù)相應(yīng)的值遞補(bǔ)到余數(shù)末位。 crc=crc(0x07);/進(jìn)行除法運(yùn)算,即與除數(shù)的低位相異或。 else/當(dāng)前余數(shù)的最高位為,不需要進(jìn)行除法運(yùn)算。 crc=(crc7);/將輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(shù)末位。 ch=ch1;/讀到的

9、字符左移位,使數(shù)據(jù)下一位作為輸入位。 file.clear(); file.seekp(-1,ios:end);/將寫指針移到輸出文件的最后。 file.put(crc);/寫入crc碼。 file.close(); infile.close();/關(guān)閉輸入文件和輸出文件。 coutendl數(shù)據(jù)幀文件argv2 封裝完成endl;運(yùn)行結(jié)果:運(yùn)行結(jié)果如下所示:執(zhí)行framer.exe文件的結(jié)果如下所示:實(shí)驗(yàn)小結(jié):實(shí)現(xiàn)幀的封裝,主要是將幀的七個(gè)部分-前導(dǎo)碼、幀前定界符、目的地址、源地址、長(zhǎng)度字段、數(shù)據(jù)字段和校驗(yàn)字段,一個(gè)一個(gè)按順序封裝的,最后使得一個(gè)幀的封裝得以完成。同時(shí),在編寫程序的過(guò)程中,用到

10、了很多的函數(shù),這些函數(shù)的運(yùn)用使得程序簡(jiǎn)便而且正確的運(yùn)行出來(lái)。實(shí)驗(yàn)二 解析IP數(shù)據(jù)包實(shí)驗(yàn)?zāi)康模?設(shè)計(jì)一個(gè)解析IP數(shù)據(jù)包的程序,并根據(jù)這個(gè)程序,說(shuō)明IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問(wèn)題,從而對(duì)IP層的工作原理有更好的理解和認(rèn)識(shí)。實(shí)驗(yàn)要求: 本實(shí)驗(yàn)的目標(biāo)是捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,見(jiàn)個(gè)結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時(shí)寫入日志文件。 程序的具體要求如下: 以命令行形式運(yùn)行:ipparse logfile,其中ipparse是程序名,而logfile則代表記錄結(jié)果的日志文件。 在標(biāo)準(zhǔn)輸出、和日志文件中寫入捕獲的IP包的版本、頭長(zhǎng)度、服務(wù)類型、數(shù)據(jù)包總長(zhǎng)度、數(shù)據(jù)包標(biāo)識(shí)、分段標(biāo)志、分段偏移值、生

11、存時(shí)間、上層協(xié)議類型、頭校驗(yàn)和、源IP地址和目的IP地址等內(nèi)容。 當(dāng)程序接收到鍵盤輸入Ctrl+C時(shí)退出。設(shè)計(jì)相關(guān)知識(shí):IP數(shù)據(jù)報(bào)的格式說(shuō)明IP協(xié)議都具有什么功能。其首部,版本目前廣泛使用的版本號(hào)為4;首部長(zhǎng)度站4bit;服務(wù)類型占8bit,其中服務(wù)類型TOS子域占4位,優(yōu)先級(jí)子域占3位,另一位為保留位;總長(zhǎng)度字段為2B,IP數(shù)據(jù)包的最大長(zhǎng)度是65535B;標(biāo)識(shí)占16bit,它是一個(gè)計(jì)數(shù)器,用來(lái)產(chǎn)生數(shù)據(jù)報(bào)的標(biāo)識(shí);標(biāo)志占3bit,其中最低為為MF,MF=1時(shí)為后面“還有分片”,MF=0表示這是數(shù)據(jù)報(bào)片中的最后一個(gè),DF=0時(shí),表示允許分片;片偏移以8個(gè)字節(jié)為偏移單位;生存時(shí)間字段記為TTL,單位

12、為秒;協(xié)議段占8bit,用于指出次數(shù)據(jù)是使用何種協(xié)議,典型的協(xié)議號(hào)有6:TCP,17:UDP,1:ICMP。本程序使用套接字socket編程,將網(wǎng)卡設(shè)為能夠接受流經(jīng)網(wǎng)卡的所有類型的數(shù)據(jù)包。首先,初始化套接字,然后監(jiān)聽(tīng)數(shù)據(jù)包,解析數(shù)據(jù)包。SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用來(lái)創(chuàng)建套接字,其參數(shù)為通信發(fā)生的區(qū)字段和套接字的類型。WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen)函數(shù)用來(lái)把網(wǎng)卡設(shè)置為混雜模式。recv(sock,buffer,65535,0)函數(shù)

13、用來(lái)接收經(jīng)過(guò)的IP包,其參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)的大小。typedef struct IP_HEADip_head;用來(lái)定義IP頭部數(shù)據(jù)。setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)函數(shù)用來(lái)獲取本機(jī)IP地址htons()函數(shù)將無(wú)符號(hào)短整型轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序的數(shù)據(jù)本程序在windows環(huán)境下利用C+語(yǔ)言編寫。實(shí)驗(yàn)設(shè)計(jì)分析: 為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對(duì)網(wǎng)卡進(jìn)行編程,我們使用套接字進(jìn)行編程。 使用套接字 接收數(shù)據(jù)包 定義IP頭部的數(shù)據(jù)結(jié)構(gòu) IP包的解析程序流程圖:具體程序代碼:#include #include #inclu

14、de #include#include #pragma comment(lib,ws2_32) /指定連接到網(wǎng)絡(luò)應(yīng)用和internet#define IO_RCVALL _WSAIOW(IOC_VENDOR,1) typedef struct IP_HEAD union /定義聯(lián)合 unsigned char Version; unsigned char HeadLen; ; unsigned char ServiceType; unsigned short TotalLen; unsigned short Identifier; union unsigned short Flags; uns

15、igned short FragOffset; ; unsigned char TimeToLive; unsigned char Protocol; unsigned short HeadChecksum; unsigned int SourceAddr; unsigned int DestinAddr; unsigned char Options; ip_head; /定義IP頭部的數(shù)據(jù)結(jié)構(gòu)void main(int argc,char *argv) using namespace std; ofstream outfile(C:logfile.txt,ios:out);if(argc!=

16、2) coutendl請(qǐng)以下格式輸入命令行:PackParse packet_sumendl; return; WSADATA WSAData; if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0) coutendlWSASTartup初始化失敗endl; return; SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); /三個(gè)參分別為通信發(fā)生的區(qū)字段,套接字的類型,與IP協(xié)議if(sock=INVALID_SOCKET) coutendl創(chuàng)建Socket失敗!endl; closesocket(sock); WS

17、ACleanup(); BOOL flag=TRUE; if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *) &flag,sizeof(flag)=SOCKET_ERROR) coutendlsetsockopt操作失敗:WSAGetLastError()endl; closesocket(sock); WSACleanup(); char hostName128;/獲取主機(jī)名 if(gethostname(hostName,100)=SOCKET_ERROR) coutendlgethostname操作失敗:WSAGetLastError()en

18、dl; closesocket(sock); WSACleanup(); hostent *pHostIP; /獲取本地IPif(pHostIP=gethostbyname(hostName)=NULL) coutendlgethostbyname操作失敗:WSAGetLastError()h_addr_list0; if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr)=SOCKET_ERROR) coutendlbind操作失敗:WSAGetLastError()endl; closesocket(sock); /綁定網(wǎng)卡WSACleanu

19、p(); DWORD dwBufferLen10; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; if(WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen) , &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)=SOCKET_ERROR) coutendlWSAIoctl操作失敗:WSAGetLastError()endl; closesocket(sock); /將網(wǎng)卡設(shè)為混雜模式,以接受所有數(shù)

20、據(jù)WSACleanup(); coutendl開(kāi)始解析IP包:endl; char buffer65535; /設(shè)置緩沖區(qū)int packsum=atoi(argv1); /字符串轉(zhuǎn)換為整形for(int i=0;i0) /四個(gè)參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)大小,附加標(biāo)志 ip_head ip=*(ip_head *)buffer; cout-endl; cout版本:4)endl; /獲取頭部長(zhǎng)度字段cout頭部長(zhǎng)度:(ip.HeadLen &0x0f)*4)endl; /獲取頭部長(zhǎng)度字段cout服務(wù)類型:Priority5), Service1)&0x0f)endl; /優(yōu)先

21、級(jí)子域和TOS子域cout總長(zhǎng)度:ip.TotalLenendl;/獲取總長(zhǎng)度字段 cout標(biāo)識(shí)符:ip.Identifierendl;/獲取標(biāo)識(shí)字段 cout標(biāo)志位:15)&0x01),DF= 14)&0x01),Mf=13)&0x01)endl; /獲得標(biāo)志字段cout片偏移:(ip.FragOffset&0x1fff)endl; /獲取分段偏移字段cout生存周期:(int)ip.TimeToLiveendl; /獲取生存時(shí)間字段cout協(xié)議:Protocol(int)ip.Protocolendl; /獲取協(xié)議字段cout頭部校驗(yàn)和:ip.HeadChecksumendl; /獲取頭校

22、驗(yàn)和字段cout原地址:inet_ntoa(*(in_addr *)&ip.SourceAddr)endl; /獲取源IP地址字段cout目的IP地址:inet_ntoa(*(in_addr *)&ip.DestinAddr)endl; /獲取目的IP地址字段outfile-endl; outfile版本:4)endl; outfile頭部長(zhǎng)度:(ip.HeadLen &0x0f)*4)endl; outfile服務(wù)類型:Priority5), Service1)&0x0f)endl; outfile總長(zhǎng)度:ip.TotalLenendl; outfile標(biāo)識(shí)符:ip.Identifieren

23、dl; outfile標(biāo)志位:15)&0x01),DF= 14)&0x01),Mf=13)&0x01)endl; outfile片偏移:(ip.FragOffset&0x1fff)endl; outfile生存周期:(int)ip.TimeToLiveendl; outfile協(xié)議:Protocol(int)ip.Protocolendl; outfile頭部校驗(yàn)和:ip.HeadChecksumendl; outfile原地址:inet_ntoa(*(in_addr *)&ip.SourceAddr)endl; outfile目的IP地址:inet_ntoa(*(in_addr *)&ip.

24、DestinAddr)1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (USHORT)(cksum); 程序流程圖:源程序代碼:#include #include #include #include #include #include #include #include #pragma comment(lib,ws2_32.lib)#define IPV

25、ER 4 /IP協(xié)議預(yù)定#define MAX_BUFF_LEN 65500 /發(fā)送緩沖區(qū)最大值typedef struct ip_hdr /定義IP首部 UCHAR h_verlen; /4位首部長(zhǎng)度,4位IP版本號(hào) UCHAR tos; /8位服務(wù)類型TOS USHORT total_len; /16位總長(zhǎng)度(字節(jié)) USHORT ident; /16位標(biāo)識(shí) USHORT frag_and_flags; /3位標(biāo)志位 UCHAR ttl; /8位生存時(shí)間 TTL UCHAR proto; /8位協(xié)議 (TCP, UDP 或其他) USHORT checksum; /16位IP首部校驗(yàn)和 U

26、LONG sourceIP; /32位源IP地址 ULONG destIP; /32位目的IP地址 IP_HEADER; typedef struct tsd_hdr /定義TCP偽首部 ULONG saddr; /源地址ULONG daddr; /目的地址 UCHAR mbz; /沒(méi)用UCHAR ptcl; /協(xié)議類型 USHORT tcpl; /TCP長(zhǎng)度 PSD_HEADER; typedef struct tcp_hdr /定義TCP首部 USHORT th_sport; /16位源端口 USHORT th_dport; /16位目的端口 ULONG th_seq; /32位序列號(hào) U

27、LONG th_ack; /32位確認(rèn)號(hào) UCHAR th_lenres; /4位首部長(zhǎng)度/6位保留字 UCHAR th_flag; /6位標(biāo)志位 USHORT th_win; /16位窗口大小 USHORT th_sum; /16位校驗(yàn)和 USHORT th_urp; /16位緊急數(shù)據(jù)偏移量 TCP_HEADER; /CheckSum:計(jì)算校驗(yàn)和的子函數(shù) USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); i

28、f(size) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (USHORT)(cksum); int main(int argc, char* argv) WSADATA WSAData; SOCKET sock; IP_HEADER ipHeader; TCP_HEADER tcpHeader; PSD_HEADER psdHeader; char Sendto_BuffMAX_BUFF_LEN; /發(fā)送緩沖區(qū) unsigned short check

29、_BuffMAX_BUFF_LEN; /檢驗(yàn)和緩沖區(qū) const char tcp_send_data=This is my homework of networt,I am happy!; BOOL flag; int rect,nTimeOver; if (argc!= 5) printf(Useage: SendTcp soruce_ip source_port dest_ip dest_port n); return false; if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) printf(WSAStartup Error!n); return

30、 false; if(sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED)=INVALID_SOCKET) printf(Socket Setup Error!n); return false; flag=true; if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag)=SO CKET_ERROR) printf(setsockopt IP_HDRINCL error!n); return false; nTimeOver=1

31、000; if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver)=SOCKET_ERROR) printf(setsockopt SO_SNDTIMEO error!n); return false; /填充IP首部 ipHeader.h_verlen=(IPVER4 | sizeof(ipHeader)/sizeof(unsigned long); ipHeader.tos=(UCHAR)0; ipHeader.total_len=htons(unsigned short)sizeo

32、f(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data); ipHeader.ident=0; /16位標(biāo)識(shí) ipHeader.frag_and_flags=0; /3位標(biāo)志位 ipHeader.ttl=128; /8位生存時(shí)間 ipHto=IPPROTO_UDP; /協(xié)議類型 ipHeader.checksum=0; /檢驗(yàn)和暫時(shí)為0 ipHeader.sourceIP=inet_addr(argv1); /32位源IP地址 ipHeader.destIP=inet_addr(argv3); /32位目的IP地址 /計(jì)算IP頭部

33、檢驗(yàn)和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER); ipHeader.checksum=checksum(check_Buff,sizeof(IP_HEADER); /構(gòu)造TCP偽首部 psdHeader.saddr=ipHeader.sourceIP; psdHeader.daddr=ipHeader.destIP; psdHeader.mbz=0; psdHeader.ptcl=ipHto; psdHeader.tcpl=htons(sizeof(TCP

34、_HEADER)+sizeof(tcp_send_data); /填充TCP首部 tcpHeader.th_dport=htons(atoi(argv4); /16位目的端口號(hào) tcpHeader.th_sport=htons(atoi(argv2); /16位源端口號(hào) tcpHeader.th_seq=0; /SYN序列號(hào) tcpHeader.th_ack=0; /ACK序列號(hào)置為0 /TCP長(zhǎng)度和保留位 tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)4|0); tcpHeader.th_flag=2; /修改這里來(lái)實(shí)

35、現(xiàn)不同的標(biāo)志位探測(cè),2是SYN,1是/FIN,16是ACK探測(cè) 等等 tcpHeader.th_win=htons(unsigned short)16384); /窗口大小 tcpHeader.th_urp=0; /偏移大小 tcpHeader.th_sum=0; /檢驗(yàn)和暫時(shí)填為0 /計(jì)算TCP校驗(yàn)和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&psdHeader,sizeof(psdHeader); memcpy(check_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader); memcpy(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER),tcp_send_data,sizeof(tcp_send_data); tcpHeader.th_sum=checksum(check_Buff,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+sizeof(tcp_send_da

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論