第一篇:如何升級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”);