




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
湖北工業(yè)大學(xué)課程設(shè)計報告設(shè)計題目: TCP數(shù)據(jù)包的發(fā)送和接收專 業(yè):計算機(jī)科學(xué)與技術(shù)班 級: 10計科2班學(xué) 號: 11姓 名:呂紅杰指導(dǎo)老師:涂軍一.設(shè)計題目發(fā)送和接收 TCP數(shù)據(jù)包二.設(shè)計要求1.正確理解題意;2.具有良好的編程規(guī)范和適當(dāng)?shù)淖⑨專?.有詳細(xì)的文檔,文檔中應(yīng)包括設(shè)計題目涉及的基礎(chǔ)知識、設(shè)計思路、程序流程圖、程序清單、 開發(fā)中遇到的問題及解決方法、 設(shè)計中待解決的問題及改進(jìn)方向。三.需求分析TCP是一種面向連接的、可靠的傳輸層協(xié)議。 TCP協(xié)議工作在網(wǎng)絡(luò)層 IP協(xié)議的基礎(chǔ)上。 本課程設(shè)計的目的是設(shè)計一個發(fā)送和接收 TCP數(shù)據(jù)包的程序, 其功能是填充一個 TCP數(shù)據(jù)包, 發(fā)送給目的主機(jī), 并在目的主機(jī)接收此 TCP數(shù)據(jù)包, 將數(shù)據(jù)字段顯示顯示在標(biāo)準(zhǔn)輸出上。四.具體設(shè)計創(chuàng)建一個原始套接字,并設(shè)置 IP頭選項SOCKETsock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);這里,設(shè)置了 SOCK_RA標(biāo)志,表示我們聲明的是一個原始套接字類型。W為使用發(fā)送接收超時設(shè)置 ,必須將標(biāo)志位置位置為 WSA_FLAG_OVERLAP。在本PED課程設(shè)計中,發(fā)送 TCP包時隱藏了自己的 IP地址,因此我們要自己填充 IP頭,設(shè)置IP頭操作選項。其中 flag設(shè)置為ture,并設(shè)定 IP_HDRINCL選項,表明自己來構(gòu)造 IP頭。setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&Flag,sizeof(Flag));inttimeout=1000;setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));在這里我們使用基本套接字 SOL_SOCK,設(shè)置ET SO_SNDTIME表示使用發(fā)送超時O設(shè)置,超時時間設(shè)置為 1000ms。構(gòu)造IP頭和 TCP頭這里,IP頭和 TCP頭以及 TCP偽部的構(gòu)造請參考下面它們的數(shù)據(jù)結(jié)構(gòu)。typedefstruct_iphdr 算校驗和的子函數(shù)在填充數(shù)據(jù)包的過程中,需要調(diào)用計算校驗和的函數(shù) checksum兩次,分別用于校驗IP頭和 TCP頭部(加上偽頭部) ,其實現(xiàn)代碼如下:USHORTchecksum(USHORT*buffer,intsize){unsignedlongcksum=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);4.流程圖開始構(gòu)造原始套接字并初始化填充IP首部計算IP首部校驗和構(gòu)造 TCP偽首部填充 TCP首部計算 TCP首部校驗和填充發(fā)送緩沖區(qū)填入目的地址發(fā)送數(shù)據(jù)包結(jié)束五.實驗內(nèi)容先用 vc++編譯運行程序代碼用命令指示符運行 Debug下的 sendTCP輸入源ip和端口及目的 ip和端口輸入發(fā)送內(nèi)容5.發(fā)送完成5.發(fā)送完成六.附代碼#include<>#include<>#include<>
#include<>#include<>#include<>#include<>#include<>#pragmacomment(lib,"")#defineIPVER4//IP 協(xié)議預(yù)定#defineMAX_BUFF_LEN65500//發(fā)送緩沖區(qū)最大值typedefstructip_hdr//定義IP首部位首部長度 ,4位首部長度 ,4位IP版本號位服務(wù)類型 TOS位總長度(字節(jié))位標(biāo)識位標(biāo)志位位生存時間 TTL位協(xié)議(TCP,UDP或其他)位IP首部校驗和位源IP地址位目的IP地址定義 TCP偽首部TOC\o"1-5"\h\zUCHARh_verlen; //4UCHARtos; //8USHORTtotal_len; //16USHORTident;//16USHORTfrag_and_flags;//3UCHARttl; //8UCHARproto;//8USHORTchecksum; //16ULONGsourceIP; //32ULONGdestIP;//32}IP_HEADER;typedefstructtsd_hdr//{ULONGsaddr;//源地址ULONGdaddr;//目的地址UCHARmbz;//沒用UCHARptcl;//協(xié)議類型USHORTtcpl;//TCP長度}PSD_HEADER;typedefstructtcp_hdr//定義 TCP首部{USHORTth_sport;//16位源端口USHORTth_dport;//16位目的端口ULONGth_seq;//32位序列號ULONGth_ack;//32位確認(rèn)號UCHARth_lenres;//4位首部長度 /6位保留字UCHARth_flag;//6位標(biāo)志位USHORTth_win;//16位窗口大小USHORTth_sum;//16位校驗和USHORTth_urp;//16位緊急數(shù)據(jù)偏移量}TCP_HEADER;//CheckSum:計算校驗和的子函數(shù)USHORTchecksum(USHORT*buffer,intsize){unsignedlongcksum=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);}intReadData(char*str,intmaxlen){intreadlen=0;charch=NULL;if(str==NULL||maxlen<=0){printf("ReadDataError!!!\n");return0;//failed}printf("InputData(EndByCtrl+Z):\n");while(maxlen){ch=getchar();if(ch==EOF)break;str[readlen++]=ch;maxlen--;}str[readlen]=NULL;returnreadlen;}intmain(intargc,char*argv[]){WSADATAWSAData;SOCKETsock;IP_HEADERipHeader;TCP_HEADERtcpHeader;PSD_HEADERpsdHeader;charSendto_Buff[MAX_BUFF_LEN];//發(fā)送緩沖區(qū)unsignedshortcheck_Buff[MAX_BUFF_LEN];//檢驗和緩沖區(qū)chartcp_send_data[1000];intread_data_len=0;BOOLflag;intrect,nTimeOver;if(argc!=5){printf("Usage: SendTcpsoruce_ipsource_portdest_ipdest_port\n");returnfalse;}read_data_len=ReadData(tcp_send_data,1000);if(read_data_len<=0)return1;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){printf("WSAStartupError!\n");returnfalse;}if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET){printf("SocketSetupError!\n");returnfalse;}flag=true;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR){printf("setsockoptIP_HDRINCLerror!\n");returnfalse;}nTimeOver=1000;if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOver,sizeof(nTimeOver))==SOCKET_ERROR){printf("setsockoptSO_SNDTIMEOerror!\n");returnfalse;}
//填充IP首部=(IPVER<<4|sizeof(ipHeader)/sizeof(unsignedlong));=(UCHAR)0;=htons((unsignedshort)sizeof(ipHeader)+sizeof(tcpHeader)+read_data_len);=0; //16位標(biāo)識=0;//3位標(biāo)志位=128;//8位生存時間=IPPROTO_TCP;//協(xié)議類型=0;//檢驗和暫時為 0=inet_addr(argv[1]);//32 位源IP地址=inet_addr(argv[3]);//32 位目的IP地址//計算IP頭部檢驗和memset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER));=checksum(check_Buff,sizeof(IP_HEADER));//構(gòu)造 TCP偽首部=;=;=0;=;=htons(sizeof(TCP_HEADER)+read_data_len);位目的端口號
位源端口號//填充 TCP首部=htons(atoi(argv[4]));//16位目的端口號
位源端口號=htons(atoi(argv[2]));//16=0; //SYN 序列號=0; //ACK 序列號置為 0//TCP長度和保留位=(sizeof(tcpHeader)/sizeof(unsignedlong)<<4|0);=2;//修改這里來實現(xiàn)不同的標(biāo)志位探測, 2是 SYN,1是//FIN,16是ACK探測 等等=htons((unsignedshort)16384); // 窗口大小=0; // 偏移大小=0; // 檢驗和暫時填為 0//計算 TCP校驗和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,read_data_len);=checksum(check_Buff,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+read_data_len);//填充發(fā)送緩沖區(qū)memset(Sendto_Buff,0,MAX_BUFF_LEN);memcpy(Sendto_Buff,&ipHeader,sizeof(IP_HEADER));memcpy(Sendto_Buff+sizeof(IP_HEADER),&tcpHeader,sizeof(TCP_HEADER));memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER),tcp_send_data,read_data_len);intdatasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+read_data_len;//發(fā)送數(shù)據(jù)報的目的地址SOCKADDR_INdest;memset
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- JJF 2199-2025數(shù)字式時鐘校準(zhǔn)規(guī)范
- 前期策劃合同范本
- 養(yǎng)牛設(shè)備出售合同范本
- 保障性住房購房合同范本
- 加油卡租車合同范本
- 協(xié)議單位優(yōu)惠合同范例
- 醫(yī)藥物流合同范本
- 修叉車合同范本
- 勞務(wù)分包協(xié)議合同范本
- 勞務(wù)合同范本已填
- 脫硫自動化控制-洞察分析
- 醫(yī)務(wù)人員醫(yī)德醫(yī)風(fēng)培訓(xùn)
- 人教版初中歷史八上-第2課 第二次鴉片戰(zhàn)爭
- 2024湖北省金口電排站管理處招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 油井供水合同范例
- 2025年人教部編版語文五年級下冊教學(xué)計劃(含進(jìn)度表)
- 全國計算機(jī)等級考試一級試題及答案(5套)
- 銀河證券-科創(chuàng)板認(rèn)知測評題目及答案
- 產(chǎn)品方案設(shè)計模板
- 部隊通訊員培訓(xùn)
- 物業(yè)公司水浸、水管爆裂事故應(yīng)急處置預(yù)案
評論
0/150
提交評論