




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、湖北工業大學計算機網絡課程設計 設計題目:發送和接收TCP數據包班 級:XXX姓 名:xxx學 號:XXX指導老師:XXX發送和接受TCP數據包1.設計題目與要求1.1設計題目發送和接收TCP數據包1.2技術要求本設計的功能是填充一個TCP數據包,并發送給目的主機。1)以命令行形式運行:SendTCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip為源端IP地址,source_port為源端口號,dest_ip為目的地址,dest_port為目的端口號。2)其他的TCP頭部參數請自行設定。3)數據字段為“This
2、is my homework of network,I am happy!”。4)成功發送后在屏幕上輸出“send OK”。2.總的設計思想及系統平臺、語言、工具等2.1工作環境 軟件:Microsoft Visual C+ 6.0;硬件:PC機一臺。2.2設計思想 本課程設計的目標是發送一個TCP數據包,可以利用原始套接字來完成這個工作。整個程序由初始化原始套接字和發送TCP數據包兩個部分組成。2.2.1創建一個原始套接字,并設置IP頭選項 SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket
3、(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); 這里,我們設置了SOCK_RAW標志,表示我們聲明的是一個原始套接字類型。為使用發送接收超時設置,必須將標志位置位置為WSA_FLAG_OVERLAPPED。在本課程設計中,發送TCP包時隱藏了自己的IP地址,因此我們要自己填充IP頭,設置IP頭操作選項。其中flag設置為ture,并設定 IP_HDRINCL 選項,表明自己來構造IP頭。注意,如果設置IP_HDRINCL 選項,那么必須具有 administrator權限,要不就必須修改注冊表: HKEY_LOCAL_MACH
4、INESystemCurrentControlSetServicesAfdParameter 修改鍵:DisableRawSecurity(類型為DWORD),把值修改為 1。如果沒有,就添加。 BOOL Flag=TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&Flag, sizeof(Flag);int timeout=1000;setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout);在這里我們使用基本套接字SOL_SOCKET,設置SO
5、_SNDTIMEO表示使用發送超時設置,超時時間設置為1000ms。2.2.2構造IP頭和TCP頭這里, IP頭和TCP頭以及TCP偽部的構造請參考下面它們的數據結構。2.2.3計算校驗和的子函數在填充數據包的過程中,需要調用計算校驗和的函數checksum兩次,分別用于校驗IP頭和TCP頭部(加上偽頭部),其實現代碼如下: USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) cksum +
6、= *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (USHORT)(cksum); 3.數據結構與模塊說明(功能與流程圖)3.1數據結構typedef struct _iphdr /定義IP首部 UCHAR h_lenver; /4位首部長度+4位IP版本號 UCHAR tos; /8位服務類型TOS USHORT total_len; /16位總長度(字節) USHORT ident; /16位標識 USHORT frag_and_flags; /3位標志位 UCHAR
7、ttl; /8位生存時間 TTL UCHAR proto; /8位協議 (TCP, UDP 或其他) USHORT checksum; /16位IP首部校驗和 ULONG sourceIP; /32位源IP地址 ULONG destIP; /32位目的IP地址 IP_HEADER; typedef struct psd_hdr /定義TCP偽首部 ULONG saddr; /源地址 ULONG daddr; /目的地址 UCHAR mbz; /沒用UCHAR ptcl; /協議類型 USHORT tcpl; /TCP長度 PSD_HEADER; typedef struct _tcphdr /
8、定義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位窗口大小 USHORT th_sum; /16位校驗和 USHORT th_urp; /16位緊急數據偏移量 TCP_HEADER; 4.源程序#include #include #include #include #include #include
9、 #include #include #pragma comment(lib,ws2_32.lib)#define IPVER 4 /IP協議預定#define MAX_BUFF_LEN 65500 /發送緩沖區最大值typedef struct ip_hdr /定義IP首部 UCHAR h_verlen; /4位首部長度,4位IP版本號 UCHAR tos; /8位服務類型TOS USHORT total_len; /16位總長度(字節) USHORT ident; /16位標識 USHORT frag_and_flags; /3位標志位 UCHAR ttl; /8位生存時間 TTL UCH
10、AR proto; /8位協議 (TCP, UDP 或其他) USHORT checksum; /16位IP首部校驗和 ULONG sourceIP; /32位源IP地址 ULONG destIP; /32位目的IP地址 IP_HEADER; typedef struct tsd_hdr /定義TCP偽首部 ULONG saddr; /源地址ULONG daddr; /目的地址 UCHAR mbz; /沒用UCHAR ptcl; /協議類型 USHORT tcpl; /TCP長度 PSD_HEADER; typedef struct tcp_hdr /定義TCP首部 USHORT th_spo
11、rt; /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位窗口大小 USHORT th_sum; /16位校驗和 USHORT th_urp; /16位緊急數據偏移量 TCP_HEADER; /CheckSum:計算校驗和的子函數 USHORT checksum(USHORT *buffer, int size) unsigned long cks
12、um=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); int main(int argc, char* argv) WSADATA WSAData; SOCKET sock; IP_HEADER ipHeader; TCP_HEADER tcpHeader; PSD_HEADER psdHead
13、er; char Sendto_BuffMAX_BUFF_LEN; /發送緩沖區 unsigned short check_BuffMAX_BUFF_LEN; /檢驗和緩沖區 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(MA
14、KEWORD(2,2), &WSAData)!=0) printf(WSAStartup Error!n); return 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)=SOCKET_ERROR) prin
15、tf(setsockopt IP_HDRINCL 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=(IPVER4 | sizeof(ipHeader)/sizeof(unsigned long); ipHeader
16、.tos=(UCHAR)0; ipHeader.total_len=htons(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; /協議類型 ipHeader.checksum=0; /檢驗和暫時為0 ipHeader.sourceIP=inet_addr(argv1); /32位源IP地址 ipHeade
17、r.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.sourceIP; psdHeader.daddr=ipHeader.destIP; psdHeader.mbz=0; psdHeader.ptcl=ip
18、Hto; 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(uns
19、igned long)4|0); tcpHeader.th_flag=2; /修改這里來實現不同的標志位探測,2是SYN,1是/FIN,16是ACK探測 等等 tcpHeader.th_win=htons(unsigned short)16384); /窗口大小 tcpHeader.th_urp=0; /偏移大小 tcpHeader.th_sum=0; /檢驗和暫時填為0 /計算TCP校驗和 /memset(check_Buff,0,MAX_BUFF_LEN); /*memcpy(check_Buff,&psdHeader,sizeof(psdHeader); memcpy(check_Buf
20、f+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_data); /填充發送緩沖區 /*memset(Sendto_Buff,0,MAX_BUFF_LEN); memcpy(Se
21、ndto_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,sizeof(tcp_send_data);*/ int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+sizeof(tcp_send_data); /發送數據報的目的地址 SOCKADDR_IN d
22、est; memset(&dest,0,sizeof(dest); dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(argv3); dest.sin_port=htons(atoi(argv4);rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest); if (rect=SOCKET_ERROR) printf(send error!:%dn,WSAGetLastError(); return false; else printf
23、(send ok!n); closesocket(sock); WSACleanup(); return 1; 5.運行結果與運行情況在Microsoft Visual C+ 6.0下編寫源程序,然后調試成功后運行,生成可執行文件123.exe。因為該程序是帶參數的,所以進入dos,并進入到該可執行文件的目錄下后在命令提示行下輸入:sendtcp 000,運行結果如下:6.調試報告6.1調試記錄第一、二天,主要是查閱資料,學習算法。該期間重點了解了IP首部、TCP首部的結構,以及如何將它們和數據字段一起封裝成數據包。同時也掌握了計算校驗和的算法,從而通過該算法分別計算出IP首部和TCP首部的校驗和。接著就是對網絡編程接口socket套接字的學習,除了掌握它的初始化外,還對一些經常使用的高級套接字函數進行運用,例如WSAStartup()、WSASocket()、socket()、bind()、listen()、accept()、connect()、sendto()、send()等。當然根據課程設計的要求,有很多函數并不需要用到。第三、四天,主要是編程實現,調試源程序,不斷發現問題并修改。調試過程中沒有出現重大的語法錯誤,主要是運行的結果不理想,和預期的結果有差距。經分析,影響運行結果的主要因素是實現數據
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設備預知維修管理制度
- 設計研發中心管理制度
- 評估外聘專家管理制度
- 診所藥品供貨管理制度
- 2025年中國滑動窗行業市場全景分析及前景機遇研判報告
- 調度系統設備管理制度
- 財務風險預警管理制度
- 貨代公司人員管理制度
- 貨架物品擺放管理制度
- 貨車油路直供管理制度
- 抗衰保養知識培訓課件
- 青海省重點名校2025屆中考生物最后一模試卷含解析
- 嬰幼兒喂養照護人工喂養的回應性照護課件
- 《傳奇歌后鄧紫棋》課件
- 畜牧課件豬生產學
- 礦山承包合同
- 房產公司檔案管理
- 安徽省合肥市肥西縣2024-2025學年上學期七年級數學期末測試卷
- 《無人機操控培訓材料》課件
- 2024年07月臨商銀行2024年校園招考46名工作人員筆試歷年參考題庫附帶答案詳解
- 第 12課《干點家務活》(說課稿)統編版道德與法治一年級下冊
評論
0/150
提交評論