計算機網絡-課程方案設計書源代碼和實驗報告-幀封裝、IP數(shù)據包解析和發(fā)送TCP數(shù)據包_第1頁
計算機網絡-課程方案設計書源代碼和實驗報告-幀封裝、IP數(shù)據包解析和發(fā)送TCP數(shù)據包_第2頁
計算機網絡-課程方案設計書源代碼和實驗報告-幀封裝、IP數(shù)據包解析和發(fā)送TCP數(shù)據包_第3頁
計算機網絡-課程方案設計書源代碼和實驗報告-幀封裝、IP數(shù)據包解析和發(fā)送TCP數(shù)據包_第4頁
計算機網絡-課程方案設計書源代碼和實驗報告-幀封裝、IP數(shù)據包解析和發(fā)送TCP數(shù)據包_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上計算機網絡課程設計報告院(系): 計算機學院 專 業(yè): 計算機科學與技術 姓 名: 班 級: 學 號: 指導教師: 2009 年 7 月 4 日計算機網絡課程設計之協(xié)議編程實驗一 幀封裝實驗目的: 編寫程序,根據給出的原始數(shù)據,組裝一個IEEE 802.3格式的幀(題目)默認的輸入文件為二進制原始數(shù)據(文件名分別為input1和input2)。矚慫潤厲釤瘞睞櫪廡賴。 要求程序為命令行程序。比如,可執(zhí)行文件名為framer.exe,則命令行形式如下:framer inputfile outputfile,其中,inputfile為原始數(shù)據文件,outputfile為輸出

2、結果。聞創(chuàng)溝燴鐺險愛氌譴凈。 輸出:對應input1和input2得結果分別為output1和output2。試驗要求: 編寫程序,根據給出的原始數(shù)據,組裝一個IEEE 802.3格式的幀(題目)默認的輸入文件為二進制原始數(shù)據(文件名分別為input1和input2)。殘騖樓諍錈瀨濟溆塹籟。 要求程序為命令行程序。比如,可執(zhí)行文件名為framer.exe,則命令行形式如下:framer inputfile outputfile,其中,inputfile為原始數(shù)據文件,outputfile為輸出結果。釅錒極額閉鎮(zhèn)檜豬訣錐。輸出:對應input1和input2得結果分別為output1和outpu

3、t2驗設計相關知識:幀:來源于串行線路上的通信。其中,發(fā)送者在發(fā)送數(shù)據的前后各添加特殊的字符,使它們成為一個幀。Ethernet從某種程度上可以被看作是機器之間的數(shù)據鏈路層連接。彈貿攝爾霽斃攬磚鹵廡。按802.3標準的幀結構如下表所示(802.3標準的Ethernet幀結構由7部分組成)802.3標準的幀結構前導碼幀前定界符目的地址源地址長度字段數(shù)據字段校驗字段7B1B(2/6B)(2/6B)(2B)(長度可變)(4B)其中,幀數(shù)據字段的最小長度為46B。如果幀的LLC數(shù)據少于46B,則應將數(shù)據字段填充至46B。填充字符是任意的,不計入長度字段值中。謀蕎摶篋飆鐸懟類蔣薔。在校驗字段中,使用的是

4、CRC校驗。校驗的范圍包括目的地址字段、源地址字段、長度字段、LLC數(shù)據字段。循環(huán)冗余編碼(CRC)是一種重要的線性分組碼、編碼和解碼方法,具有簡單、檢錯和糾錯能力強等特點,在通信領域廣泛地用于實現(xiàn)差錯控制。CRC校驗碼的檢錯能力很強,不僅能檢查出離散錯誤,還能檢查出突發(fā)錯誤。廈礴懇蹣駢時盡繼價騷。利用CRC進行檢錯的過程可簡單描述如下:在發(fā)送端根據要傳送的k位二進制碼序列,以一定的規(guī)則產生一個校驗用的r位監(jiān)督碼(CRC碼),附在原始信息的后邊,構成一個新的二進制碼序列(共k+r位),然后發(fā)送出去。在接收端,根據信息碼和CRC碼之間所遵循的規(guī)則進行檢驗,以確定傳送中是否出錯。這個規(guī)則在差錯控制

5、理論中稱為“生成多項式”。煢楨廣鰳鯡選塊網羈淚。CRC的基本實現(xiàn)前導碼幀前定界符目的地址源地址長度字段數(shù)據字段校驗字段7B1B(2/6B)(2/6B)(2B)(長度可變)(4B)循環(huán)冗余校驗碼的特點:(1)CRC校驗碼可檢測出所有單個錯誤。(2)CRC校驗碼可檢測出所有奇數(shù)位錯誤。(3)CRC校驗碼可檢測出所有雙位的錯誤(4)CRC校驗碼可檢測出所有小于、等于校驗位長度的突發(fā)錯誤。(5)CRC校驗碼可以的概率檢測出長度為(K+1)位的突發(fā)錯誤鵝婭盡損鵪慘歷蘢鴛賴。實驗分析: 填充幀頭部字段 要完成一次幀封裝的過程,首先要完成的就是幀頭部的裝入,這一過程只要將簽到嗎、定界符、目的地址、源地址、長

6、度字段的相應數(shù)值按順序寫入就可以了。其中,長度字段的值即為要發(fā)送的數(shù)據的實際長度。 籟叢媽羥為贍僨蟶練淨。 填充數(shù)據字段在填充數(shù)據字段的過程中要注意的主要問題是數(shù)據字段的長度。802.3標準中規(guī)定了幀數(shù)據字段的最小長度為46B,最大長度為1500B。如果數(shù)據不足46B,則需要通過填充0來補足;若數(shù)據長度超過1500B,則的大獎超過部分封裝入下一個幀進行發(fā)送。預頌圣鉉儐歲齦訝驊糴。 CRC校驗 幀封裝的最后一步就是對數(shù)據進行校驗,并將校驗結果記入幀校驗字段。程序流程圖:CRC計算流程圖:序源代碼:#include<iostream.h>#include<fstream.h>

7、;#include<stdlib.h>void main(int argc,char*argv) /如果輸入命令行不正確,則輸出提示后退出。 if(argc!=3) cout<<endl<<"請按以下格式輸入:framer inputfile outputfile"<<endl;滲釤嗆儼勻諤鱉調硯錦。 exit(0); /打開指定的輸出文件,以二進制方式打開并可讀可寫,如文件存在,則清除其內容。 fstream file(argv2,ios:out|ios:in|ios:binary|ios:trunc,0); 鐃誅臥瀉噦圣騁

8、貺頂廡。 for(int i=0;i<7;i+) file.put(char)0xaa); file.put(char)0xab);/寫入B的前導碼和B的幀前定界符。 char des_add=char(0x00),char(0x00),char(0xE4),char(0x86),char(0x3A),char(0xDC);擁締鳳襪備訊顎輪爛薔。 file.write(des_add,6);/寫入B的目的地址。 char sor_add=char(0x00),char(0x00),char(0x80),char(0x1A),char(0xE6),char(0x65);贓熱俁閫歲匱閶鄴鎵騷

9、。 file.write(sor_add,6);/寫入B的源地址。 /創(chuàng)建輸入文件流并打開指定的輸入文件,以二進制方式打開并可讀。 ifstream infile(argv1,ios:in|ios:binary,0); int length=0; infile.seekg(0,ios:end);/將讀指針移到文件末尾。 length=infile.tellg();/計算指針偏移量,即為輸入文件的長度。 unsigned char* data=new unsigned charlength;/創(chuàng)建字符指針并根據文件長度初始化。壇摶鄉(xiāng)囂懺蔞鍥鈴氈淚。 infile.seekg(0,ios:beg)

10、;/將讀指針移到文件開始。 infile.read(data,length);/將文件數(shù)據讀入到字符指針data中。 file.put(char(length>>8); file.put(char(length&0xff);/將文件長度值按照逆序寫入到輸出文件的長度字段中。蠟變黲癟報倀鉉錨鈰贅。 file.write(data,length);/將data內容寫入到輸出文件中。 /如果輸入文件長度不足B,則用補足B。 if(length<46) for(int j=length;j<46;j+) file.put(char(0x00); file.put(cha

11、r(0x00);/將數(shù)據字段后添加個 file.seekg(8,ios:beg);/將讀指針指向目的地址字段,從此處開始CRC計算 unsigned char ch;/ch用來保存讀入的字符。 unsigned char crc=char(0x00);/余數(shù)初始值為。 while(1)/進行CRC計算 file.get(ch); if(ch=0xff)/判斷是否到了文件結尾,如果是,則退出循環(huán)。 break; for(i=0;i<8;i+)/對入讀入的字符的位分別處理。 if(0x80=(crc&(0x80)/當前余數(shù)最高位為,需要進行除法運算。 crc=(crc<<

12、1)&(0xff);/crc左移位,最低位補。 crc=crc|(ch&0x80)>>7);/將輸入數(shù)據相應的值遞補到余數(shù)末位。 crc=crc(0x07);/進行除法運算,即與除數(shù)的低位相異或。 else/當前余數(shù)的最高位為,不需要進行除法運算。 crc=(crc<<1)&(0xff);/crc左移位,最低位補。 crc=crc|(ch&0x80)>>7);/將輸入數(shù)據相應位的值遞補到余數(shù)末位。 ch=ch<<1;/讀到的字符左移位,使數(shù)據下一位作為輸入位。 file.clear(); file.seekp(-1

13、,ios:end);/將寫指針移到輸出文件的最后。 file.put(crc);/寫入crc碼。 file.close(); infile.close();/關閉輸入文件和輸出文件。 cout<<endl<<"數(shù)據幀文件"<<argv2<<" 封裝完成"<<endl;運行結果:運行結果如下所示:執(zhí)行framer.exe文件的結果如下所示:實驗小結:實現(xiàn)幀的封裝,主要是將幀的七個部分-前導碼、幀前定界符、目的地址、源地址、長度字段、數(shù)據字段和校驗字段,一個一個按順序封裝的,最后使得一個幀的封裝得以

14、完成。同時,在編寫程序的過程中,用到了很多的函數(shù),這些函數(shù)的運用使得程序簡便而且正確的運行出來。買鯛鴯譖曇膚遙閆擷凄。實驗二 解析IP數(shù)據包實驗目的: 設計一個解析IP數(shù)據包的程序,并根據這個程序,說明IP數(shù)據包的結構及IP協(xié)議的相關問題,從而對IP層的工作原理有更好的理解和認識。綾鏑鯛駕櫬鶘蹤韋轔糴。實驗要求: 本實驗的目標是捕獲網絡中的IP數(shù)據包,解析數(shù)據包的內容,見個結果顯示在標準輸出上,并同時寫入日志文件。驅躓髏彥浹綏譎飴憂錦。 程序的具體要求如下: 以命令行形式運行:ipparse logfile,其中ipparse是程序名,而logfile則代表記錄結果的日志文件。貓蠆驢繪燈鮒誅髏

15、貺廡。 在標準輸出、和日志文件中寫入捕獲的IP包的版本、頭長度、服務類型、數(shù)據包總長度、數(shù)據包標識、分段標志、分段偏移值、生存時間、上層協(xié)議類型、頭校驗和、源IP地址和目的IP地址等內容。鍬籟饗逕瑣筆襖鷗婭薔。 當程序接收到鍵盤輸入Ctrl+C時退出。設計相關知識:IP數(shù)據報的格式說明IP協(xié)議都具有什么功能。其首部,版本目前廣泛使用的版本號為4;首部長度站4bit;服務類型占8bit,其中服務類型TOS子域占4位,優(yōu)先級子域占3位,另一位為保留位;總長度字段為2B,IP數(shù)據包的最大長度是65535B;標識占16bit,它是一個計數(shù)器,用來產生數(shù)據報的標識;標志占3bit,其中最低為為MF,MF

16、=1時為后面“還有分片”,MF=0表示這是數(shù)據報片中的最后一個,DF=0時,表示允許分片;片偏移以8個字節(jié)為偏移單位;生存時間字段記為TTL,單位為秒;協(xié)議段占8bit,用于指出次數(shù)據是使用何種協(xié)議,典型的協(xié)議號有6:TCP,17:UDP,1:ICMP。構氽頑黌碩飩薺齦話騖。本程序使用套接字socket編程,將網卡設為能夠接受流經網卡的所有類型的數(shù)據包。首先,初始化套接字,然后監(jiān)聽數(shù)據包,解析數(shù)據包。輒嶧陽檉籪癤網儂號澩。SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用來創(chuàng)建套接字,其參數(shù)為通信發(fā)生的區(qū)字段和套接字的類型。堯側閆繭絳闕絢勵蜆贅。W

17、SAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen)函數(shù)用來把網卡設置為混雜模式。識饒鎂錕縊灩筧嚌儼淒。recv(sock,buffer,65535,0)函數(shù)用來接收經過的IP包,其參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)的大小。凍鈹鋨勞臘鍇癇婦脛糴。typedef struct IP_HEADip_head;用來定義IP頭部數(shù)據。setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)函數(shù)用來獲取本機IP地址恥諤銪滅縈歡煬鞏鶩錦。htons()函數(shù)將無符號短整型轉換為網

18、絡字節(jié)順序的數(shù)據本程序在windows環(huán)境下利用C+語言編寫。實驗設計分析: 為了獲取網絡中的IP數(shù)據包,必須對網卡進行編程,我們使用套接字進行編程。 使用套接字 接收數(shù)據包 定義IP頭部的數(shù)據結構 IP包的解析程序流程圖:具體程序代碼:#include<iostream> #include<winsock2.h> #include<ws2tcpip.h> #include<fstream>#include <windows.h> #pragma comment(lib,"ws2_32") /指定連接到網絡應用和i

19、nternet#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; unsigned short FragOffset; ; unsigned char TimeToLive; unsigned

20、 char Protocol; unsigned short HeadChecksum; unsigned int SourceAddr; unsigned int DestinAddr; unsigned char Options; ip_head; /定義IP頭部的數(shù)據結構void main(int argc,char *argv) using namespace std; ofstream outfile("C:logfile.txt",ios:out);if(argc!=2) cout<<endl<<"請以下格式輸入命令行:Pack

21、Parse packet_sum"<<endl; 鯊腎鑰詘褳鉀溈懼統(tǒng)庫。return; WSADATA WSAData; if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0) cout<<endl<<"WSASTartup初始化失敗"<<endl; return; SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); /三個參分別為通信發(fā)生的區(qū)字段,套接字的類型,與IP協(xié)議碩癘鄴頏謅攆檸攜驤蘞。if(sock=INVALID_SOCK

22、ET) cout<<endl<<"創(chuàng)建Socket失敗!"<<endl; closesocket(sock); WSACleanup(); BOOL flag=TRUE; if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *) &flag,sizeof(flag)=SOCKET_ERROR) 閿擻輳嬪諫遷擇楨秘騖。 cout<<endl<<"setsockopt操作失敗:"<<WSAGetLastError()<<end

23、l; 氬嚕躑竄貿懇彈瀘頷澩。closesocket(sock); WSACleanup(); char hostName128;/獲取主機名 if(gethostname(hostName,100)=SOCKET_ERROR) cout<<endl<<"gethostname操作失敗:"<<WSAGetLastError()<<endl; 釷鵒資贏車贖孫滅獅贅。closesocket(sock); WSACleanup(); hostent *pHostIP; /獲取本地IPif(pHostIP=gethostbyname(h

24、ostName)=NULL) cout<<endl<<"gethostbyname操作失敗:"<<WSAGetLastError()<<endl; 慫闡譜鯪逕導嘯畫長涼。closesocket(sock); WSACleanup(); sockaddr_in host_addr;/ host_addr.sin_family=AF_INET; host_addr.sin_port=htons(6000); host_addr.sin_addr=*(in_addr *)pHostIP->h_addr_list0; 諺辭調擔鈧

25、諂動禪瀉類。if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr)=SOCKET_ERROR) 嘰覲詿縲鐋囁偽純鉿錈。 cout<<endl<<"bind操作失敗:"<<WSAGetLastError()<<endl; closesocket(sock); /綁定網卡WSACleanup(); DWORD dwBufferLen10; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; if(WSAIoctl(sock , I

26、O_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen) , &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)=SOCKET_ERROR) 熒紿譏鉦鏌觶鷹緇機庫。 cout<<endl<<"WSAIoctl操作失敗:"<<WSAGetLastError()<<endl; 鶼漬螻偉閱劍鯫腎邏蘞。closesocket(sock); /將網卡設為混雜模式,以接受所有數(shù)據WSACleanup();

27、cout<<endl<<"開始解析IP包:"<<endl; char buffer65535; /設置緩沖區(qū)int packsum=atoi(argv1); /字符串轉換為整形for(int i=0;i<packsum;i+) if(recv(sock,buffer,65535,0)>0) /四個參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)大小,附加標志紂憂蔣氳頑薟驅藥憫騖。 ip_head ip=*(ip_head *)buffer; cout<<"-"<<endl; cout&l

28、t;<"版本:"<<(ip.Version>>4)<<endl; /獲取頭部長度字段cout<<"頭部長度:"<<(ip.HeadLen &0x0f)*4)<<endl; /獲取頭部長度字段穎芻莖蛺餑億頓裊賠瀧。cout<服務類型:Priority"<<(ip.ServiceType>>5)<<", Service"<<(ip.ServiceType>>1)&0x0f

29、)<<endl; /優(yōu)先級子域和TOS子域濫驂膽閉驟羥闈詔寢賻。cout<<"總長度:"<<ip.TotalLen<<endl;/獲取總長度字段 cout<<"標識符:"<<ip.Identifier<<endl;/獲取標識字段 cout<<"標志位:"<<(ip.Flags>>15)&0x01)<<",DF= "<<(ip.Flags>>14)&

30、;0x01)<<",Mf="<<(ip.Flags>>13)&0x01)<<endl; /獲得標志字段銚銻縵嚌鰻鴻鋟謎諏涼。cout<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl; /獲取分段偏移字段擠貼綬電麥結鈺贖嘵類。cout<<"生存周期:"<<(int)ip.TimeToLive<<endl; /獲取生存時間字段賠荊紳諮侖驟遼輩襪錈。cout<<&qu

31、ot;協(xié)議:Protocol"<<(int)ip.Protocol<<endl; /獲取協(xié)議字段塤礙籟饈決穩(wěn)賽釙冊庫。cout<<"頭部校驗和:"<<ip.HeadChecksum<<endl; /獲取頭校驗和字段cout<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl; /獲取源IP地址字段裊樣祕廬廂顫諺鍘羋藺。cout<<"目的IP地址:"<&

32、lt;inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl; /獲取目的IP地址字段倉嫗盤紲囑瓏詁鍬齊驁。outfile<<"-"<<endl; outfile<<"版本:"<<(ip.Version>>4)<<endl; outfile<<"頭部長度:"<<(ip.HeadLen &0x0f)*4)<<endl; outfile<<"服務類型:

33、Priority"<<(ip.ServiceType>>5)<<", Service"<<(ip.ServiceType>>1)&0x0f)<<endl; 綻萬璉轆娛閬蟶鬮綰瀧。outfile<<"總長度:"<<ip.TotalLen<<endl; outfile<<"標識符:"<<ip.Identifier<<endl; outfile<<"標志位:&

34、quot;<<(ip.Flags>>15)&0x01)<<",DF= "<<(ip.Flags>>14)&0x01)<<",Mf="<<(ip.Flags>>13)&0x01)<<endl; 驍顧燁鶚巰瀆蕪領鱺賻。outfile<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl; outfile<<"生存周期:&q

35、uot;<<(int)ip.TimeToLive<<endl; outfile<<"協(xié)議:Protocol"<<(int)ip.Protocol<<endl; outfile<<"頭部校驗和:"<<ip.HeadChecksum<<endl; outfile<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl; 瑣釙濺曖惲錕縞馭篩涼。outfi

36、le<<"目的IP地址:"<<inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl; 鎦詩涇艷損樓紲鯗餳類。 closesocket(sock); WSACleanup(); 程序運行結果:程序編譯運行后:以命令行形式運行程序ipparse:同時在程序所在的文件夾中生成了名為logfile的txt文件,里面記錄了上面顯示的內容。試驗小結:IP數(shù)據報的格式說明了IP協(xié)議都具有什么功能,因為完全不知道如何使用套接字socket()函,查閱了相關資料,了解了IP數(shù)據報的各種位與協(xié)議的概念和意義,通過解析

37、IP數(shù)據包這個實驗,基本掌握了用套接字編程來實現(xiàn)獲取并解析IP數(shù)據包的方法。 櫛緶歐鋤棗鈕種鵑瑤錟。實驗三 發(fā)送TCP數(shù)據包實驗目的: 設計一個發(fā)送TCP數(shù)據包的程序,并根據本設計說明TCP數(shù)據包的結構以及TCP協(xié)議與IP協(xié)議的關系,使大家對TCP協(xié)議的工作原理有更深入的認識。轡燁棟剛殮攬瑤麗鬮應。實驗要求: 本程序的功能是填充一個TCP數(shù)據包,并發(fā)送給目的主機。 以命令行形式運行:SendTCP source_ip source_port dest_ip dest_port 峴揚斕滾澗輻灄興渙藺。其中SendTCP為程序名;source_ip為源IP地址; source_port為源端口;

38、dest_ip為目的IP地址; dest_port為目的端口。詩叁撻訥燼憂毀厲鋨驁。 其他的TCP頭部參數(shù)自行設定。 數(shù)據字段為“This is my homework of network!”. 成功發(fā)送后在屏幕上輸出“send OK”。課程設計分析: 使用原始套接字 定義IP頭部、TCP頭部和偽頭部的數(shù)據結構 填充數(shù)據包 發(fā)送數(shù)據包設計思想: 本課程設計的目標是發(fā)送一個TCP數(shù)據包,可以利用原始套接字來完成這個工作。整個程序由初始化原始套接字和發(fā)送TCP數(shù)據包兩個部分組成。則鯤愜韋瘓賈暉園棟瀧。創(chuàng)建一個原始套接字,并設置IP頭選項 SOCKET sock; sock = socket(AF

39、_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); 設置SOCK_RAW標志,表示我們聲明的是一個原始套接字類型。脹鏝彈奧秘孫戶孿釔賻。為使用發(fā)送接收超時設置,必須將標志位置位置為WSA_FLAG_OVERLAPPED。在本課程設計中,發(fā)送TCP包時隱藏了自己的IP地址,因此我們要自己填充IP頭,設置IP頭操作選項。其中flag設置為ture,并設定 IP_HDRINCL 選項,表明自己來構造IP頭。注意,如果設置IP_HDRINCL 選

40、項,那么必須具有 administrator權限,要不就必須修改注冊表: HKEY_LOCAL_MACHINESystemCurrentControlSetServicesAfdParameter 修改鍵:DisableRawSecurity(類型為DWORD),把值修改為 1。如果沒有,就添加。 BOOL Flag=TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&Flag, sizeof(Flag);鰓躋峽禱紉誦幫廢掃減。int timeout=1000;setsockopt(sock, SOL_SOCKET,SO_SN

41、DTIMEO,(char*)&timeout, sizeof(timeout);稟虛嬪賑維嚌妝擴踴糶。在這里我們使用基本套接字SOL_SOCKET,設置SO_SNDTIMEO表示使用發(fā)送超時設置,超時時間設置為1000ms。陽簍埡鮭罷規(guī)嗚舊巋錟。構造IP頭和TCP頭這里, IP頭和TCP頭以及TCP偽部的構造請參考下面它們的數(shù)據結構。計算校驗和的子函數(shù)在填充數(shù)據包的過程中,需要調用計算校驗和的函數(shù)checksum兩次,分別用于校驗IP頭和TCP頭部(加上偽頭部),其實現(xiàn)代碼如下:溈氣嘮戇萇鑿鑿櫧諤應。 USHORT checksum(USHORT *buffer, int size)

42、unsigned long cksum=0; while(size >1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) cksum += *(UCHAR*)buffer; cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(cksum); 鋇嵐縣緱虜榮產濤團藺。程序流程圖:源程序代碼:#include <stdio.h> #include <winsock2.h> #i

43、nclude <ws2tcpip.h> #include <time.h>#include <windows.h>#include <string.h>#include <stdlib.h>#include <iostream.h>#pragma comment(lib,"ws2_32.lib")#define IPVER 4 /IP協(xié)議預定#define MAX_BUFF_LEN 65500 /發(fā)送緩沖區(qū)最大值typedef struct ip_hdr /定義IP首部 UCHAR h_verlen;

44、/4位首部長度,4位IP版本號 UCHAR tos; /8位服務類型TOS USHORT total_len; /16位總長度(字節(jié)) USHORT ident; /16位標識 USHORT frag_and_flags; /3位標志位 UCHAR ttl; /8位生存時間 TTL UCHAR proto; /8位協(xié)議 (TCP, UDP 或其他) USHORT checksum; /16位IP首部校驗和 ULONG sourceIP; /32位源IP地址 ULONG destIP; /32位目的IP地址 IP_HEADER; typedef struct tsd_hdr /定義TCP偽首部

45、ULONG saddr; /源地址ULONG daddr; /目的地址 UCHAR mbz; /沒用UCHAR ptcl; /協(xié)議類型 USHORT tcpl; /TCP長度 PSD_HEADER; typedef struct tcp_hdr /定義TCP首部 USHORT th_sport; /16位源端口 USHORT th_dport; /16位目的端口 ULONG th_seq; /32位序列號 ULONG th_ack; /32位確認號 UCHAR th_lenres; /4位首部長度/6位保留字 UCHAR th_flag; /6位標志位 USHORT th_win; /16位窗

46、口大小 USHORT th_sum; /16位校驗和 USHORT th_urp; /16位緊急數(shù)據偏移量 TCP_HEADER; /CheckSum:計算校驗和的子函數(shù) USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size >1) cksum+=*buffer+; size -=sizeof(USHORT); if(size) cksum += *(UCHAR*)buffer; cksum = (cksum >> 16) + (cksum & 0xffff); cksu

47、m += (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_BuffMAX_BUFF_LEN; /檢驗和緩沖區(qū) const char tcp_send_data="This is my

48、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 false;

49、 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_HDRINC

50、L error!n"); return false; nTimeOver=1000; 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=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsig

51、ned long); 納疇鰻吶鄖禎銣膩鰲錟。 ipHeader.tos=(UCHAR)0; ipHeader.total_len=htons(unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data); 風攆鮪貓鐵頻鈣薊糾廟。 ipHeader.ident=0; /16位標識 ipHeader.frag_and_flags=0; /3位標志位 ipHeader.ttl=128; /8位生存時間 ipHto=IPPROTO_UDP; /協(xié)議類型 ipHeader.checksum=0; /檢驗和

52、暫時為0 ipHeader.sourceIP=inet_addr(argv1); /32位源IP地址 ipHeader.destIP=inet_addr(argv3); /32位目的IP地址 /計算IP頭部檢驗和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER); ipHeader.checksum=checksum(check_Buff,sizeof(IP_HEADER);滅噯駭諗鋅獵輛覯餿藹。 /構造TCP偽首部 psdHeader.saddr=ipHeader.sour

53、ceIP; psdHeader.daddr=ipHeader.destIP; psdHeader.mbz=0; psdHeader.ptcl=ipHto; psdHeader.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data);鐒鸝餉飾鐔閌貲諢癱騮。 /填充TCP首部 tcpHeader.th_dport=htons(atoi(argv4); /16位目的端口號攙閿頻嶸陣澇諗譴隴瀘。 tcpHeader.th_sport=htons(atoi(argv2); /16位源端口號 tcpHeader.th_seq=0; /SYN序列號趕輾雛紈顆鋝討躍滿賺。 tcpHeader.th_ack=0; /ACK序列號置為0夾覡閭輇駁檔驀遷錟減。 /TCP長度和保留位 tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)<<4|0); 視絀鏝鴯鱭鐘腦鈞欖糲。 tcpHeader.th_flag=2; /修改這里來實現(xiàn)不同的標志位探測,2是SYN,1是/FIN,16是ACK探測 等等 偽澀錕攢鴛擋緬鐒鈞錠。 tcpHeader.th_win=htons(unsigned short)16384)

溫馨提示

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

評論

0/150

提交評論