第一篇:如何升级TCP200控制器
如何升级TCP200控制器
系统升级包含:控制器软件升级和电脑软件升级
控制器软件升级
第一步、通过网线将电脑与控制器连接(即有网络连接)第二步、安装LM FLASH用于更新控制板的软件
找到压缩包中的【工具】→【测试工具】→烧控制板工具→双击进行安装→完成。第三步、通过网络命令获取控制板IP地址以及MAC地址
点击【开始】→【运行】→在输入框中输入cmd→点击【确定】。完成后将会打开cmd命令窗口如图所示。
在窗口中输入arp-a(注意空格)→点击回车键。此时,窗口中将会出现此局域网内的其他网络设备。其中,Internet Address 就是设备的IP地址,Physical Address 就是设备的MAC地址如图所示
第四步、打开谷歌浏览器,在地址栏中输入控制板IP地址:192.168.8.76(出厂默认192.168.8.242或192.168.8.243或192.168.8.99,请尝试以上IP地址,如果不知道是多少,可以:关电源→开电源,票箱显示屏将显示本控制器的IP地址)然后点击回车键。此时,浏览器就会打开控制板设置页面。点击【点击这里升级程序】,页面跳转后,再点击【更新控制板软件】即可。第五步、打开
LM
Flash
软
件
(TCP200-4.0.3-ZH-CN-10120719-E.ZIP
解
压→TCP200-4.0.3-ZH-CN-10120719-E文件夹→工具文件夹→测试工具文件夹→烧机制板工具),参考如下图进行配置。配置完成后,在【Client IP Address】中输入需要更新的控制板IP地址,在【Client MAC Address】中输入需要更新的控制板的MAC地址如图所示。(请参照第三步cmd命令窗口中的IP地址与MAC地址)
第六步、点击LM FLASH软件上方的【Program】选项卡→点击【Browse】按钮打开需要更新的BIN文件即用于更新的文件,如下图所示,然后点击下方的【Program】按钮即可。等待【进度条】滚动到100%即完成控制板的更新。
控制器升级完成!
电脑软件升级
第一步、将tomcat6、mysql停止后,把D盘上的DATA文件夹拷贝到其他盘(为防止在升级过程中以前的数据丢失)
第二步、解压updatetool.zip(我公司专门用于升级的软件)第三步、点击“升级前先执行我.bat” 第四步、安装服务器软件(新的软件)第五步、安装客户端软件(新的软件)第六步、重新启动电脑
第七步、点击update.jar按提示完成后重新启动电脑(升级包解压出来的)第八步、打开googie浏览器,输入服务器IP,进入登录页面后,再浏览器页面空白处点右键->重新载入 电脑软件升级完成
第二篇:TCP 报头格式
TCP协议头最少20个字节,包括以下的区域
TCP源端口(Source Port):16位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是 标示报问的返回地址。
TCP目的端口(Destination port):16位的目的端口域定义传输的目的。这个端口指明报文接收计算 机上的应用程序地址接口。
TCP序列号(序列码,Sequence Number):32位
TCP应答号(Acknowledgment Number):32位的序列号由接收端计算机使用,重组分段的报文成最初形式。,如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。
数据偏移量(HLEN):4位包括TCP头大小,指示何处数据开始。
保留(Reserved):6位值域,这些位必须是0。为了将来定义新的用途所保留。
标志(Code Bits):6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。
1.URG:紧急标志
紧急(The urgent pointer)标志有效。紧急标志置位,2.ACK:确认标志
确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。3.PSH:推标志
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或rlogin 等交互模式的连接时,该标志总是置位的。4.RST:复位标志
复位标志有效。用于复位相应的TCP连接。5.SYN:同步标志
同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。6.FIN:结束标志
带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。
窗口(Window):16位,用来表示想收到的每个TCP数据段的大小。
校验位(Checksum):16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。
优先指针(紧急,Urgent Pointer):16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
选项(Option):长度不定,但长度必须以字节。如果 没有 选项就表示这个一字节的域等于0。
数据(Date):应用程序的数据。
第三篇:TCP IP网络通信程序设计
TCP/IP网络通信程序设计
本文介绍了TCP/IP网络应用程序的面向对象设计方法,并给出了用Visual C++4.2
中MFC在Windows 95环境下开发的程序实例。Sockets与Winsock 95
Winsock 95是在Unix Sockets及Windows Sockets基础上发展起来的。Sockets原
是BSD为了Unix支持互联网通信而设计的4.3BSD Unix版本中的API,它采用客户-服务器
模式的通信机制,使网络客户方和服务器方通过Sockets实现网络之间的联接和数据交
换;Win dows Sockets描述定义了一个Microsoft Windows的网络编程界面,它为
Windows TCP/IP 提供了一个BSD型套接字,除与4.3BSD Unix Sockets完全兼容外,还
包括一个扩充文件,通过一组附加的API实现Windows式(即事件驱动)的编程风格;而
Winsock 95则是在Microsoft Windows 95中进行网络应用程序设计的接口。Windows 95
在Internet支配域中的TCP /IP协议定义了Winsock 95网络编程规范,溶入了许多新特点。
MFC中提供了相应的CSock et类来实现网络通信。Sockets编程原理
Sockets同时支持数据流Sockets和数据报Sockets。
下面是利用Socket进行通信连接的过程框图。其中图1是面向连接的时序图,图2是
无连接的时序图。
图1
图2
由图可以看出,客户与服务器的关系是不对称的。对于TCP C/S,服务器首先启动,然后在某一时刻启动客户与服务器建立连接。服务器与客户开始都必须调用socket()
建立一个套接字socket,然后服务器调用bind()将套接字与一个本地网络地址捆扎在一
起,再调用listen()使套接字处于一种被动的准备接收状态,同时规定它的请求队列长
度,之后服务器就可以调用accept()来接收客户连接。客户打开套接字之后,便可通过
调用connect()和服务器建立连接。连接建立之后,客户和服务器之间就可以通过连接
发送和接收数据。最后,待数据传送结束,双方调用closesocket()关闭套接字。对于
UDP C/S,客户并不与服务器建立一个连接,而仅仅给服务器发送一张包含服务器地址的数据报。相似地,服务器也不从客户端接收一个连接,只是调用函数recvfrom,等待
从客户端来的数据。依照recvfrom返回的协议地址以及数据报,服务器就可以给客户
送一个应答。Winsock 95编程方法
用Visual C++4.2以MFC在Windows 95中实现网络编程,主要就是利用CSocket类及
其如下相关成员函数:
(1)BOOL Create(UINT nSocketPort=0,intnSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOD|FD_ACCEPT|FD_CONNECT|FD_CLOSE|,LPCTSTR|lpszSocket Address=NULL
该函数用来建立Socket。
(2)BOOL Bind(UINT nSocketPort,LPCTSTRlpszSocketAddess=NULL)该函数的作用是将Socket端口与网络地址连接起来。
(3)BOOL Listen(intnConnectionBacklog=5)
该函数的作用是等待Socket请求。
(4)Virtual BOOL
Accept(CAsyncSocket&rConnectedSocket,Socket,SOCKADDR*
lpSockAddr=NULL,int * lpSockAddrLen=NULL)
该函数的作用是取得队列上第一个连接请求并建立一个具有与Socket相同特性的套接字。
(5)BOOL Connect(LPCTSTR lpszHostAddress,UINTnHostPort)
该函数的作用是提出请求。其中,lpszHostAddress和nHostPort为接受请求进
程的网络地址和Socket端口号。
(6)virtual void Close()该函数的作用是关闭Socket。
使用以上类及成员函数,按照以下步骤,就可以设计出合适的通信程序: Server:Construct→Creat→Bind→Listen→Accept→Send→Close;
Client:Constuct→Creat→Connect→Receive→Close。程序实例
我们用Visual C++4.2中MFC在Windows 95环境下设计了一个daytime cliont程序,清单如下:
头文件HEAD.H内容:
#define IDM_STRAT 200
#define IDM_EDIT 200
classMainwnd:publicCFrameWnd
{public:Mainwnd();
afx_msgintOnCreat(LPCREATESTRUCT);
afx_msg void OnStart(void);
DECLARE_MESSAGE_MAP();
private:CstaticCSStatic;
CEditLineEdit;
CButtenStartButton;};
classPengApp:publicCWinApp
{public:BOOLInitInstance();}
源程序Client.CPP清单:
#include
#include
#include “head.h”
constintnPort=13;
PengApptheApp;
Main Wnd:MainWnd()
{if(!Create(NULL,“CommunicationProgram”,WS_OVERLAPPEDW INDOW,rectDefaul t))AfxAbort();}
intMainwnd:OnCreate(LPCREATESTRUCT)
{Rectrect;SetRect(& rect,80,50,160,70);
Create(“Host Name:”,WS_CHILD|WS_VISIBLE|SS_LEFT,rect,thi s);
SetRect(& rect,60,80,180,100);
LineEdit.Create(WS_CHILD|WS_VISIBLE|WS_DLGFRAME|ES_LEFT, rect,this,IDM_ED IT);
SetRect(&rect,100,120,140,140);
StartButton,Create(“start”,WS_CHILD|VS_VISIBLE|BS_PUSHBU TTON,rect,this,I DM_START);
return 0;}
BEGIN_MESSAGE_MAP(Main Wnd,CFrameWnd)
ON_WM_CREATE()
ON_BN_CLICKED(IDM_START,OnStart)
END_MESSAGE_MAP()
BOOL ControlApp:InitInstance()
{m_pMainWnd=new Main Wnd();
m_pMainWnd→ShowWindow(m_nCmdShow);
m_pMainWnd→UpdateWindow();
return;}
Void Main Wnd:Onstart(void)
{CSocketTimeClient;
if(!AfxSocketInit())MessageBox(“WindowsSocket initialfailed!”,“Receive”,MB_ICONSTOP);
if(!TimeClient.Create())MessageBox(“ReceiveSocketcrea te failed”,“Receive”,MB_I(ON)STOP);
elseTimeClient.connect(strAddr,nPort);
TimeClient.ReceiveFrom(csReceiveText,csCounts,LineEdit.G etWinText,nPort)
MessageBox(TimeClient.csReceiveText);
TimeClient.Close();}
第四篇:控制器市场分析
控制器市场分析
控制器作为电动车的主要的关键零部件,他们之间是完全互补品的关系,电动车控制器的需求不仅仅来自于新增产能的零配件市场,同时也有来自与维修市场,根据惯例,电动车控制器在维修市场的需求大概为存量的5%-10%。因此总的市场需求量考虑到电动车的使用寿命,进入维修市场的电动车的存量应该为前五年市场销量之和5%-10%。基于以下几点我国的自动控制器的装配自行车年均增长10%。
1、根据我国2010年的产业政策规划,本将出台相关的行业政策和行业标准,政策逐步明朗。
2、我国在2010年将电动自行车列为了家电乡下的补贴电器之一。因此此举将大幅促进我国电动自行车在农村市场的消费。
3、国内电动车控制器呈两极分化发展趋势,以高标科技为首的品牌化发展之路,面向中高端市场,推出高质量、高科技、高水准的产品,在市场经济中性价比极高;以一些杂牌为主,价格低廉,产品质量没有固定标准,生产成本极低,以低价格的优势在市场上占据一定份额。
3、我国2010年上半年的数据显示我国在上半年电动自行车产量同比增长
8.9%。
4、今后三年内电动车由于产品升级也逐步进入更新换代期,同时产业升级主要关键部件的升级如控制器、动力电源、电机的升级,解决产业困局,控制器等关键技术的升级至关重要。
第五篇:计算机网络 课程设计 发送TCP数据包
课设名称:发送TCP数据包
班级:
学号:
姓名:
指导老师: 日期: 2012.6.15
计算机网络课程设计报告
目录
一.设计题目与要求........................................................................................................2
1.设计题目................................................................................................................2
2.设计要求................................................................................................................2
二.需求分析...................................................................................................................2三.详细设计...................................................................................................................2
1.创建一个原始套接字,并设置IP头选项.................................................................3
2.构造IP头和TCP头...............................................................................................3
3.计算校验和的子函数..............................................................................................4
4.流程图...................................................................................................................6
四.调试分析...................................................................................................................7
五.运行结果...................................................................................................................7
六.总结..........................................................................................................................8
七.源程序......................................................................................................................9
发送TCP数据包
一.设计题目与要求
1.设计题目
发送TCP数据包 2.设计要求
本设计的功能是填充一个TCP数据包,并发送给目的主机。
1)以命令行形式运行:TCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号,dest_ip为目的地址,dest_port为目的端口号。
2)其他的TCP头部参数请自行设定。3)数据字段为“hello”。
4)成功发送后在屏幕上输出“send OK”。
二.需求分析
1.本程序需完成发送一个TCP数据包给目的主机
2.程序的输入:TCP source_ip source_port dest_ip dest_port,然后根据提示输入要发送的数据,回车即可。
3.程序的输出:Send OK!
4.测试数据 TCP 192.168.1.100 200 192.168.1.101 200
三.详细设计
本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送TCP数据包两个部分组成。
2发送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_OVERLAPPED);这里,设置了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, sizeof(timeout));在这里我们使用基本套接字SOL_SOCKET,设置SO_SNDTIMEO表示使用发送超时设置,超时时间设置为1000ms。2.构造IP头和TCP头
这里,IP头和TCP头以及TCP伪部的构造请参考下面它们的数据结构。
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 ttl;//8位生存时间 TTL
UCHAR proto;//8位协议(TCP, UDP 或其他)
SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,3发送TCP数据包
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 //定义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;
3.计算校验和的子函数
在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部),其实现代码如下:
USHORT checksum(USHORT *buffer, int size)
4发送TCP数据包
{ 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);}
5发送TCP数据包
4.流程图
开始构造原始套接字并初始化填充IP首部计算IP首部校验和构造TCP伪首部填充TCP首部计算TCP首部校验和填充发送缓冲区填入目的地址发送数据包结束
6发送TCP数据包
四.调试分析
本程序流程简单,调试过程中没有出现大的问题。
调试过程中没有出现重大的语法错误,主要是运行的结果不理想,和预期的结果有差距。填充数据包的程序部分是不容易出错的。至于数据包的发送,由于是利用函数sendto()来实现的,而sendto()是面向UDP的,将协议类型修改为UDP(Header.proto=IPPROTO_UDP;)后,调试运行成功,问题得到解决。
调试时,要添加 #include
五.运行结果
1.输入:TCP 192.168.1.100 200 192.168.1.101 200
7发送TCP数据包
2.输入要发送的字符串:“hello”按Ctrl+Z发送
六.总结
通过本次课程设计,我对发送TCP数据包的原理有了一定的了解。理解了TCP数据报的报文格式、TCP连接时的三次握手和TCP连接结束时的四次握手的过程及它们的作用。此外,在设计过程中,通过查阅资料,也让我对TCP的三大特点(流量控制、差错控制、拥塞控制)有了认识。,在课程设计过程中,由于编程知识的欠缺,使我在课程设计过程中不是很顺利,编程知识的欠缺是我的最大障碍,不过,这也给了我动力,我会努力去学好编程的相关知识,为以后的学习和工作打下基础。最后,感谢老师安排了此次课程设计。
发送TCP数据包
七.源程序
#include
#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 UCHAR proto;//8位协议(TCP, UDP 或其他)USHORT checksum;//16位IP首部校验和 ULONG sourceIP;//32位源IP地址 ULONG destIP;//32位目的IP地址
发送TCP数据包
}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)
发送TCP数据包
{ 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--;
发送TCP数据包
} } 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];
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);int read_data_len=0;
发送TCP数据包
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;}
发送TCP数据包
//填充IP首部
ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long));ipHeader.tos=(UCHAR)0;ipHeader.total_len=htons((unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+read_data_len);ipHeader.ident=0;//16位标识 ipHeader.frag_and_flags=0;//3位标志位 ipHeader.ttl=128;//8位生存时间 ipHeader.proto=IPPROTO_TCP;//协议类型 ipHeader.checksum=0;//检验和暂时为0 ipHeader.sourceIP=inet_addr(argv[1]);//32位源IP地址 ipHeader.destIP=inet_addr(argv[3]);//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=ipHeader.proto;psdHeader.tcpl=htons(sizeof(TCP_HEADER)+read_data_len);
//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[4]));//16位目的端口号 tcpHeader.th_sport=htons(atoi(argv[2]));//16位源端口号
发送TCP数据包
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;//修改这里来实现不同的标志位探测,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_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader));
//填充发送缓冲区
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(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER), tcp_send_data,read_data_len);tcpHeader.th_sum=checksum(check_Buff,sizeof(PSD_HEADER)+ sizeof(TCP_HEADER)+read_data_len);memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER), tcp_send_data,read_data_len);
发送TCP数据包
int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+read_data_len;//发送数据报的目的地址 SOCKADDR_IN dest;memset(&dest,0,sizeof(dest));dest.sin_family=AF_INET;dest.sin_addr.s_addr=inet_addr(argv[3]);dest.sin_port=htons(atoi(argv[4]));
rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest));if(rect==SOCKET_ERROR){ printf(“send error!:%dn”,WSAGetLastError());return false;} else
closesocket(sock);WSACleanup();return 1;} printf(“nsend ok!n”);