TCP数据包的发送和接收设计报告

合集下载

TCP数据包的发送和接收设计报告

TCP数据包的发送和接收设计报告

湖北工业大学课程设计报告设计题目:TCP数据包的发送和接收专业:计算机科学与技术班级:10计科2班学号:11姓名:吕红杰指导老师:涂军一.设计题目发送和接收TCP数据包二.设计要求1.正确理解题意;2.具有良好的编程规范和适当的注释;3.有详细的文档,文档中应包括设计题目涉及的基础知识、设计思路、程序流程图、程序清单、开发中遇到的问题及解决方法、设计中待解决的问题及改进方向。

三.需求分析TCP是一种面向连接的、可靠的传输层协议。

TCP协议工作在网络层IP 协议的基础上。

本课程设计的目的是设计一个发送和接收TCP数据包的程序,其功能是填充一个TCP数据包,发送给目的主机,并在目的主机接收此TCP数据包,将数据字段显示显示在标准输出上。

四.具体设计1.创建一个原始套接字,并设置IP头选项SOCKET sock;sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERL APPED);这里,设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。

为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。

在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP 头,设置IP头操作选项。

其中flag设置为ture,并设定 IP_HDRINCL 选项,表明自己来构造IP头。

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_SNDTIMEO表示使用发送超时设置,超时时间设置为1000ms。

tcp报文发送课程设计

tcp报文发送课程设计

tcp报文发送课程设计一、课程目标知识目标:1. 学生能理解TCP协议的基本原理,掌握TCP报文的结构和组成。

2. 学生能描述TCP报文的发送过程,包括建立连接、数据传输和关闭连接。

3. 学生能解释TCP报文中序列号、确认号的作用,了解数据可靠传输的机制。

技能目标:1. 学生能够运用所学知识,构建简单的TCP报文发送程序,实现数据的可靠传输。

2. 学生能够分析网络通信过程中可能出现的异常情况,并提出相应的解决方案。

情感态度价值观目标:1. 学生通过学习TCP报文发送过程,培养对网络通信的兴趣和热情,提高信息素养。

2. 学生能够认识到网络通信技术在日常生活和未来发展中的重要性,增强社会责任感和创新意识。

3. 学生在合作学习过程中,培养团队协作能力和沟通表达能力,尊重他人意见,共同解决问题。

课程性质:本课程为计算机网络基础课程,旨在帮助学生掌握TCP协议的基本原理和实际应用。

学生特点:学生处于高年级阶段,具有一定的网络知识基础,具备一定的编程能力。

教学要求:结合学生特点,注重理论与实践相结合,提高学生的实际操作能力和问题解决能力。

通过分组合作、实践操作等形式,激发学生的学习兴趣,培养其团队协作能力和创新精神。

在教学过程中,关注学生的学习进度,及时调整教学策略,确保课程目标的达成。

二、教学内容1. TCP协议基本原理:讲解TCP协议的特点、工作流程及可靠性保证机制。

- 教材章节:第三章“传输层协议”第二节“TCP协议”2. TCP报文结构:详细介绍TCP报文的组成,包括源端口、目的端口、序列号、确认号等字段。

- 教材章节:第三章“传输层协议”第二节“TCP协议”3. TCP连接建立与终止:讲解TCP三次握手和四次挥手的过程,分析其原理。

- 教材章节:第三章“传输层协议”第二节“TCP协议”4. 数据传输过程:阐述TCP报文在数据传输过程中的可靠性保证措施,如序列号、确认应答、流量控制等。

- 教材章节:第三章“传输层协议”第二节“TCP协议”5. 实践环节:组织学生分组进行TCP报文发送程序编写,实现简单数据传输。

UDP及TCP通信程序的设计与实现实验报告

UDP及TCP通信程序的设计与实现实验报告

实验报告课程计算机网络(双语)(课程设计)实验名称UDP及TCP通信程序的设计与实现专业班级姓名学号2013 年 5 月30 日目录实验目的和内容 (1)实验目的 (1)实验内容 (1)实验环境 (2)程序的逻辑框图 (2)UDP通信程序的逻辑框图: (2)TCP通信程序的逻辑框图: (3)程序源代码(数据结构的描述、核心算法) (4)1.TCP通信程序源代码 (4)2.TCP通信程序数据结构的描述 (7)3.TCP通信程序的核心算法 (7)4.UDP通信程序源代码 (8)5.UDP通信程序数据结构的描述 (11)6.UDP通信程序的核心算法 (12)实验数据、结果分析 (13)TCP通信程序实验结果分析 (13)UDP通信程序实验结果分析 (14)总结 (16)实验目的和内容实验目的掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。

实验内容1.实现控制台模式下,在单机上基于UDP的聊天程序;2.实现控制台模式下,在单机上基于TCP的聊天程序;3.上述两个程序,最简单的实现方式是:一方发送、另一方接收、交替进行;4.提交上述2个程序的源程序,程序代码有充分的注释,并填写实验报告,实验报告的主要内容为说明程序设计的思路,程序代码的流程。

实验环境在win7系统下,visual studio 2008环境下的win32平台下程序的逻辑框图UDP通信程序的逻辑框图:Server端:Client端:TCP通信程序的逻辑框图:Server端:程序源代码(数据结构的描述、核心算法)1.TCP通信程序源代码Client端:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<winsock.h>//初始化函数,初始化版本号int InitSock(BYTE minorVer = 2, BYTE majorVer = 2){WSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(WSAStartup(sockVersion, &wsaData) != 0)exit(0);return 1;}int main(){char rbuf[256];char szText[256];InitSock();//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//判断socket是否创建成功if(sListen == INVALID_SOCKET){printf("Failed socket() \n");return 0;}//用于存储IP地址和端口号的变量sockaddr_in sin;sin.sin_family = AF_INET; //IP协议sin.sin_port = htons(4567); //端口号sin.sin_addr.S_un.S_addr = INADDR_ANY; //接收任何IP的连接//绑定函数,将socket 与IP地址和端口绑定在一块if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("Failed bind() \n");return 0;}//开始监听,第二个参数表示最大连接数if(listen(sListen, 2) == SOCKET_ERROR){printf("Failed listen() \n");return 0;}//定义一个新的变量sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);//用于存储连接客户端的socketSOCKET sClient;//accept函数会阻塞,直到等到有socket连接服务器为止,才继续往后执行,并将客户端的IP 和端口号存在remoteAddr中sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);printf("接收到一个连接%s \r\n", inet_ntoa(remoteAddr.sin_addr));while(TRUE){if(sClient == INVALID_SOCKET){printf("Failed accept()");continue;}printf("send:");scanf("%s",szText);//发送函数,往sClient这个socket中发送szTextsend(sClient, szText, strlen(szText), 0);//recv为阻塞函数,等待sClient中传来数据int nRecv = recv(sClient, rbuf, 256, 0);if(nRecv>0){rbuf[nRecv] = '\0';printf("receive:%s\n", rbuf);}}closesocket(sClient);closesocket(sListen);WSACleanup();return 0;}Server端:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<winsock.h>//初始化函数,初始化版本号int InitSock(BYTE minorVer = 2, BYTE majorVer = 2){WSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(WSAStartup(sockVersion, &wsaData) != 0)exit(0);return 1;}int main(){InitSock();//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){printf(" Failed socket() \n");return 0;}//用于存储IP地址和端口号的变量sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_port = htons(4567); //要连接的端口号servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//要连接的IP地址//连接函数,是一个阻塞类型的函数,用s这个socket与服务器地址的某个端口连接,之后往s这个socket中写数据,服务器就能收到if(connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1){printf(" Failed connect() \n");return 0;}char buff[256];char szText[256];while(true){//接收函数,是一个阻塞类型的函数,等待s这个socket中传来数据,256表示接收的最大字符数int nRecv = recv(s, buff, 256, 0);if(nRecv > 0){buff[nRecv] = '\0';printf("receive:%s\n", buff);}printf("send:");scanf("%s",szText);//发送函数,往s这个socket中发送szText这个字符串send(s, szText, strlen(szText), 0);}closesocket(s);WSACleanup();return 0;}2.TCP通信程序数据结构的描述(1)客户端及服务器都含有存储IP地址及端口号的数据结构,sockaddr_in remoteAddr;和servAddr(2)用于存储连接客户端的socket:SOCKET sClient;和用于存储连接服务器的socket:SOCKET s3.TCP通信程序的核心算法服务器首先启动,通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,再listen( )使套接口做好侦听的准备,并规定它的请求队列的长度, 之后就调用accept( )来接收连接,并获得客户机的地址信息;客户在建立套接口后就可调用connect( ) 和服务器建立连接;连接一旦建立,客户机和服务器之间就可以通过调用:send( )和recv( ) (或read( )和write( ))来发送和接收数据;最后,待数据传送结束后,双方调用closesocket() 关闭套接口。

网络课程设计-tcp数据包的发送和接收

网络课程设计-tcp数据包的发送和接收

目录一、软件概要简介 (6)二、概要设计 (6)1 62类图 (6)3.数据结构的定义 (6)4.程序截图 (7)三、详细设计 (8)1关键性代码 (8)1.1内存映射文件读 (9)1.2内存映射文件写 (9)1.3文件的发送 (9)1.4文件的接收 (9)1.4.1客户端接收套接字 (9)1.4.2 客户端把接收到的文件写人自己的文件..10四、调试分析及测试结果 (15)一、软件概要简介我们做的是基于tcp数据包发送和接收的文件传输,采用的是客户/服务器模式,首先客户端连接到服务器,然后服务器端就可以选择需要传输的文件,开始传输。

二、概要设计11.1内存映射文件我们首先是用内存映射文件的方法把文件一块一块的从磁盘映射到内存,每映射一块,就传输一块,直到把整个文件都传输完毕为止。

内存映射文件内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对文件进行映射,就如同将整个文件从磁盘加载到内存。

由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

另外,实际工程中的系统往往需要在多个进程之间共享数据,如果数据量小,处理方法是灵活多变的,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。

实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。

内存映射文件并不是简单的文件I/O操作,实际用到了Windows的核心编程技术--内存管理。

所以,如果想对内存映射文件有更深刻的认识,必须对Windows操作系统的内存管理机制有清楚的认识,内存管理的相关知识非常复杂,超出了本文的讨论范畴,在此就不再赘述,感兴趣的读者可以参阅其他相关书籍。

tcp实验总结

tcp实验总结

tcp实验总结摘要:1.TCP协议简介2.TCP实验目的与过程3.TCP实验结果与分析4.TCP协议的优点与不足5.总结与建议正文:一、TCP协议简介TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠、基于字节流的传输层通信协议。

它与IP协议共同构成了TCP/IP协议族,是互联网中最常用的协议之一。

TCP协议通过三次握手建立连接,保证数据传输的可靠性,具有错误检测和纠正功能。

二、TCP实验目的与过程本次TCP实验旨在通过实际操作,了解TCP协议的工作原理,掌握TCP 连接的建立、数据传输和断开过程,以及分析TCP协议在实际应用中的性能表现。

实验过程如下:1.搭建TCP服务器和客户端2.实现TCP客户端与服务器的通信3.观察TCP连接的建立与断开4.分析TCP协议的传输性能三、TCP实验结果与分析实验结果显示,TCP协议能够实现可靠的数据传输。

通过对TCP连接的建立、数据传输和断开过程的观察,发现TCP协议具有以下特点:1.TCP连接建立:通过三次握手,客户端与服务器确认对方的存在,并为后续数据传输做好准备。

2.数据传输:TCP协议采用字节流的方式发送数据,保证了数据的顺序和完整性。

3.TCP断开:通过四次挥手,双方确认对方已接收完毕数据,并依次关闭连接。

四、TCP协议的优点与不足优点:1.面向连接,确保数据传输的可靠性2.错误检测和纠正功能,保证数据完整性3.流量控制与拥塞控制,提高网络资源利用率不足:1.相对复杂的实现,占用较多资源2.传输延迟较高,不适合实时应用3.依赖IP协议,不能单独使用五、总结与建议通过TCP实验,我们对TCP协议有了更深入的了解。

在实际应用中,应根据需求选择合适的协议,充分发挥TCP协议的优点,避免其不足。

tcp协议实验报告

tcp协议实验报告

竭诚为您提供优质文档/双击可除tcp协议实验报告篇一:Tcp实验报告Tcp实验报告一、实验目的1.深入理解Tcp原理,掌握连接状态控制、可靠传输等重要机制;2.为应用层提供网络编程接口,即socket接口。

二、实验要求1.理解Tcp的主要原理,针对客户端角色的、“停-等”模式的Tcp,设计接收和发送流程。

2.编程实现Tcp段的接收流程,重点是段接收的有限状态机3.编程实现Tcp段的发送流程,完成Tcp段的封装处理。

4.编程实现客户端socket接口函数三、编程实现1.停-等协议的实现停-等协议主要体现在stud_tcp_send()函数和stud_tcp_recv()和函数中。

实现的主要思路是:a)调用stud_tcp_send()发送一个数据包时,直到收到ack包并把ack交给stud_tcp_input()处理才退出b)调用stud_tcp_recv()接收一个数据包成功后,紧接着发送一个相应的ack包才退出上述两个设计保证了发送和接收窗口大小为12.接收流程的有限状态机首先检查校验和与序号是否正确,只有当这两者都无误之后才进入状态机部分。

状态机基于switch结构实现,根据当前Tcb的状态分情形讨论状态的变化。

处理流程如下3.发送时的封装和有限状态机a)查看当前的Tcb是否为空,为空则创建当前的Tcbb)封装数据i.ii.iii.iv.v.vi.拷贝数据设置源端口和目的端口设置包序列和ack 序号设置包头长度设置flag设置windowsize和urgentpointerc)改变状态d)变换字节序将字节序从本地序变成网络序4.各接口函数的实现a)stud_tcp_socket()b)stud_tcp_connect()c)stud_tcp_send()d)stud_tcp_recv()e)stud_tcp_close()5.校验和的计算与Ip包的校验类似,但是要求对伪首部进行校验伪首部由以下部分组成:a)32位Ip源地址b)32位Ip目的地址篇二:Tcp协议实验网络课第四次上机实验报告实验内容实验内容主要包括:?设计保存Tcp连接相关信息的数据结构(Tcb);?Tcp协议的接收处理和封装发送;?Tcp协议提供的socket函数接口。

基于TCP的文件传输实验报告

基于TCP的文件传输实验报告

综合课程设计报告基于TCP协议的文件传输系统学生姓名:指导教师:所在系:所学专业:年级:2011年6月目录摘要 (2)1、实验的相关知识 (3)1.1、通信的模式 (3)1.1.1、传输的可靠性 (3)1.2.1、TCP/IP的网络体系结构 (3)1.2.2、TCP/IP网络协议 (4)1.2.3、TCP——传输控制协议 (4)2、winsock控件 (5)2.1.1、winsock的重要属性、方法和事件 (5)2.1.2、winsock控件通信的工作原理 (7)3、程序设计与实现 (8)3.1、程序设计 (8)3.1.1、总体设计 (8)3.1.2、模块设计 (9)3.2、程序实现 (10)3.2.1、工作原理 (10)3.2.2、服务器端主程序 (11)3.2.3、客户端主程序 (14)4、实验总结 (17)参考文献...............................................................17. 成绩评定. (18)基于TCP协议的文件传输系统摘要随着网络的普及,网络编程显得尤其重要。

本实验使用Winsock控件实现两台计算机间的文件传输,描述了Winsock控件的使用方法及有关文件传输的算法。

随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以TCP/IP协议最为流行。

本文讨论的Winsock控件,提供了访问TCP/IP网络的捷径,使用它可以不必了解TCP/IP的细节和调用Winsock API,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信,进行文件传输了。

同时为了便于传输文件过程中的中断现象,在实验时应该充分考虑断点续传问题,即中断文件传输后已经传输的文件不丢失,等到再传时,能继续接着传送。

关键词:TCP/IP协议,Winsock控件,网络编程,文件传输,断点续传。

计算机网络实验原理实验六TCP 协议分析实验报告

计算机网络实验原理实验六TCP 协议分析实验报告

云南大学软件学院实验报告实验六、TCP 协议分析实验报告1.实验目的:理解TCP报文首部格式和字段的作用,TCP连接的建立和释放过程,TCP数据传输过程中编号与确认的过程。

2.实验环境:连网环境,可以是局域网,也可以是连入Internet的单机。

3.实验步骤:(1)启动Etherel协议分析软件,并开始抓包。

(2)启动某个基于TCP的应用程序,例如连接某个FTP站点,或通过浏览器访问某个网页。

(3)等出现浏览的网页后停止数据包的捕获。

(4)出现协议分析界面,将filter 一栏填入tcp,则只显示TCP协议信息,通过此信息,可以看到TCP连接的三次握手过程和协商的初始的序列号,数据传输过程以及拆除连接的相应信息。

4.实验分析,回答下列问题打开捕获文件tcp-ethereal-trace-1,通过捕获的数据包分析TCP建立连接的三次握手的过程,并将TCP建立连接过程中的三个报文填写下来。

字段名称第一条报文第二条报文第三条报文报文序号 1 2 3Sequence Number 0 0 1 Acknowedgement Numbber 无 1 1ACK 0 1 1SYN 1 1 0(1)TCP建立连接时的三个报文,其报文首部与其他TCP报文有什么不同?答:前3个报文表示TCP建立连接的三次握手.因此前三条报文的标识与其他tcp报文不同。

第一次握手:SYN=1,ACK=0第二次握手:SYN=1,ACK=1第三次握手:SYN=0,ACK=1(2)报文首部的OPTION字段的作用是什么?值为多少?答:OPTION可用来指定数据封包的大小。

值为8 bytes(3)分析TCP数据传输阶段的前8个报文,将报文信息填入到表中数据传送阶段第一个报文的序号字段值是否等于连接建立时第三个报文的序号? 答:不等。

应等于第三个报文的ACK 号。

ACK 号表示下一报文的顺序号。

(4)捕获一个拆除TCP 连接的数据包,附上捕获截图,主要要包含拆除连接的数据包部分,分析TCP 释放连接的过程,选择TCP 释放连接过程当中的四个报文,将报文信息填在下表。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

湖北工业大学课程设计报告设计题目:TCP数据包的发送和接收专业:计算机科学与技术班级:10计科2班学号:11******指导老师:***一.设计题目发送和接收TCP数据包二.设计要求1.正确理解题意;2.具有良好的编程规范和适当的注释;3.有详细的文档,文档中应包括设计题目涉及的基础知识、设计思路、程序流程图、程序清单、开发中遇到的问题及解决方法、设计中待解决的问题及改进方向。

三.需求分析TCP是一种面向连接的、可靠的传输层协议。

TCP协议工作在网络层IP协议的基础上。

本课程设计的目的是设计一个发送和接收TCP数据包的程序,其功能是填充一个TCP数据包,发送给目的主机,并在目的主机接收此TCP数据包,将数据字段显示显示在标准输出上。

四.具体设计1.创建一个原始套接字,并设置IP头选项SOCKET sock;sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPE D);这里,设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。

为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。

在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作选项。

其中flag设置为ture,并设定 IP_HDRINCL 选项,表明自己来构造IP头。

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_SNDTIMEO表示使用发送超时设置,超时时间设置为1000ms。

2.构造IP头和TCP头这里, IP头和TCP头以及TCP伪部的构造请参考下面它们的数据结构。

typedef struct _iphdr 算校验和的子函数在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部),其实现代码如下: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);cksum += (cksum >>16);return (USHORT)(~cksum);}4.流程图五.实验内容1.先用vc++编译运行程序代码2.用命令指示符运行Debug下的sendTCP3.输入源ip和端口及目的ip和端口4.输入发送内容5.发送完成六.附代码#include <>#include <>#include <>#include <>#include <>#include <>#include <>#include <>#pragma comment(lib,"")#define IPVER 4 //IP协议预定#define MAX_BUFF_LEN 65500 //发送缓冲区最大值typedef struct ip_hdr //定义IP首部{UCHAR h_verlen; //4位首部长度,4位IP版本号UCHAR tos; //8位服务类型TOSUSHORT total_len; //16位总长度(字节)USHORT ident; //16位标识USHORT frag_and_flags; //3位标志位UCHAR ttl; //8位生存时间 TTLUCHAR 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_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;//CheckSum:计算校验和的子函数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); cksum += (cksum >>16);return (USHORT)(~cksum);}int ReadData(char *str,int maxlen){int readlen=0;char ch=NULL;if(str==NULL||maxlen<=0){printf("ReadData Error\n");return 0;//failed}printf("Input Data(End By Ctrl+Z): \n");while(maxlen){ch=getchar();if(ch==EOF) break;str[readlen++]=ch;maxlen--;}str[readlen]=NULL;return readlen;}int main(int argc, char* argv[]){WSADATA WSAData;SOCKET sock;IP_HEADER ipHeader;TCP_HEADER tcpHeader;PSD_HEADER psdHeader;char Sendto_Buff[MAX_BUFF_LEN]; //发送缓冲区unsigned short check_Buff[MAX_BUFF_LEN]; //检验和缓冲区char tcp_send_data[1000];int read_data_len=0;BOOL flag;int rect,nTimeOver;if(argc!= 5){printf("Usage: SendTcp soruce_ip source_port dest_ip dest_port \n");return false;}read_data_len=ReadData(tcp_send_data,1000);if(read_data_len<=0) return 1;if(WSAStartup(MAKEWORD(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){printf("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首部=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long));=(UCHAR)0;=htons((unsignedshort)sizeof(ipHeader)+sizeof(tcpHeader)+read_data_len);=0; //16位标识=0; //3位标志位=128; //8位生存时间=IPPROTO_TCP; //协议类型=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));//构造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(unsigned long)<<4|0);=2; //修改这里来实现不同的标志位探测,2是SYN,1是//FIN,16是ACK探测等等=htons((unsigned short)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);//填充发送缓冲区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;//发送数据报的目的地址SOCKADDR_IN dest;memset(&dest,0,sizeof(dest));=AF_INET;=htons(atoi(argv[4]));rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest));if (rect==SOCKET_ERROR){printf("send error!:%d\n",WSAGetLastError());return false;}elseprintf("\nsend ok!\n");closesocket(sock);WSACleanup();return 1;}。

相关文档
最新文档