第一篇:如何升級TCP200控制器
如何升級TCP200控制器
系統(tǒng)升級包含:控制器軟件升級和電腦軟件升級
控制器軟件升級
第一步、通過網(wǎng)線將電腦與控制器連接(即有網(wǎng)絡(luò)連接)第二步、安裝LM FLASH用于更新控制板的軟件
找到壓縮包中的【工具】→【測試工具】→燒控制板工具→雙擊進(jìn)行安裝→完成。第三步、通過網(wǎng)絡(luò)命令獲取控制板IP地址以及MAC地址
點(diǎn)擊【開始】→【運(yùn)行】→在輸入框中輸入cmd→點(diǎn)擊【確定】。完成后將會(huì)打開cmd命令窗口如圖所示。
在窗口中輸入arp-a(注意空格)→點(diǎn)擊回車鍵。此時(shí),窗口中將會(huì)出現(xiàn)此局域網(wǎng)內(nèi)的其他網(wǎng)絡(luò)設(shè)備。其中,Internet Address 就是設(shè)備的IP地址,Physical Address 就是設(shè)備的MAC地址如圖所示
第四步、打開谷歌瀏覽器,在地址欄中輸入控制板IP地址:192.168.8.76(出廠默認(rèn)192.168.8.242或192.168.8.243或192.168.8.99,請嘗試以上IP地址,如果不知道是多少,可以:關(guān)電源→開電源,票箱顯示屏將顯示本控制器的IP地址)然后點(diǎn)擊回車鍵。此時(shí),瀏覽器就會(huì)打開控制板設(shè)置頁面。點(diǎn)擊【點(diǎn)擊這里升級程序】,頁面跳轉(zhuǎn)后,再點(diǎn)擊【更新控制板軟件】即可。第五步、打開
LM
Flash
軟
件
(TCP200-4.0.3-ZH-CN-10120719-E.ZIP
解
壓→TCP200-4.0.3-ZH-CN-10120719-E文件夾→工具文件夾→測試工具文件夾→燒機(jī)制板工具),參考如下圖進(jìn)行配置。配置完成后,在【Client IP Address】中輸入需要更新的控制板IP地址,在【Client MAC Address】中輸入需要更新的控制板的MAC地址如圖所示。(請參照第三步cmd命令窗口中的IP地址與MAC地址)
第六步、點(diǎn)擊LM FLASH軟件上方的【Program】選項(xiàng)卡→點(diǎn)擊【Browse】按鈕打開需要更新的BIN文件即用于更新的文件,如下圖所示,然后點(diǎn)擊下方的【Program】按鈕即可。等待【進(jìn)度條】滾動(dòng)到100%即完成控制板的更新。
控制器升級完成!
電腦軟件升級
第一步、將tomcat6、mysql停止后,把D盤上的DATA文件夾拷貝到其他盤(為防止在升級過程中以前的數(shù)據(jù)丟失)
第二步、解壓updatetool.zip(我公司專門用于升級的軟件)第三步、點(diǎn)擊“升級前先執(zhí)行我.bat” 第四步、安裝服務(wù)器軟件(新的軟件)第五步、安裝客戶端軟件(新的軟件)第六步、重新啟動(dòng)電腦
第七步、點(diǎn)擊update.jar按提示完成后重新啟動(dòng)電腦(升級包解壓出來的)第八步、打開googie瀏覽器,輸入服務(wù)器IP,進(jìn)入登錄頁面后,再瀏覽器頁面空白處點(diǎn)右鍵->重新載入 電腦軟件升級完成
第二篇:TCP 報(bào)頭格式
TCP協(xié)議頭最少20個(gè)字節(jié),包括以下的區(qū)域
TCP源端口(Source Port):16位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是 標(biāo)示報(bào)問的返回地址。
TCP目的端口(Destination port):16位的目的端口域定義傳輸?shù)哪康摹_@個(gè)端口指明報(bào)文接收計(jì)算 機(jī)上的應(yīng)用程序地址接口。
TCP序列號(hào)(序列碼,Sequence Number):32位
TCP應(yīng)答號(hào)(Acknowledgment Number):32位的序列號(hào)由接收端計(jì)算機(jī)使用,重組分段的報(bào)文成最初形式。,如果設(shè)置了ACK控制位,這個(gè)值表示一個(gè)準(zhǔn)備接收的包的序列碼。
數(shù)據(jù)偏移量(HLEN):4位包括TCP頭大小,指示何處數(shù)據(jù)開始。
保留(Reserved):6位值域,這些位必須是0。為了將來定義新的用途所保留。
標(biāo)志(Code Bits):6位標(biāo)志域。表示為:緊急標(biāo)志、有意義的應(yīng)答標(biāo)志、推、重置連接標(biāo)志、同步序列號(hào)標(biāo)志、完成發(fā)送數(shù)據(jù)標(biāo)志。按照順序排列是:URG、ACK、PSH、RST、SYN、FIN。
1.URG:緊急標(biāo)志
緊急(The urgent pointer)標(biāo)志有效。緊急標(biāo)志置位,2.ACK:確認(rèn)標(biāo)志
確認(rèn)編號(hào)(Acknowledgement Number)欄有效。大多數(shù)情況下該標(biāo)志位是置位的。TCP報(bào)頭內(nèi)的確認(rèn)編號(hào)欄內(nèi)包含的確認(rèn)編號(hào)(w+1,F(xiàn)igure:1)為下一個(gè)預(yù)期的序列編號(hào),同時(shí)提示遠(yuǎn)端系統(tǒng)已經(jīng)成功接收所有數(shù)據(jù)。3.PSH:推標(biāo)志
該標(biāo)志置位時(shí),接收端不將該數(shù)據(jù)進(jìn)行隊(duì)列處理,而是盡可能快將數(shù)據(jù)轉(zhuǎn)由應(yīng)用處理。在處理 telnet 或rlogin 等交互模式的連接時(shí),該標(biāo)志總是置位的。4.RST:復(fù)位標(biāo)志
復(fù)位標(biāo)志有效。用于復(fù)位相應(yīng)的TCP連接。5.SYN:同步標(biāo)志
同步序列編號(hào)(Synchronize Sequence Numbers)欄有效。該標(biāo)志僅在三次握手建立TCP連接時(shí)有效。它提示TCP連接的服務(wù)端檢查序列編號(hào),該序列編號(hào)為TCP連接初始端(一般是客戶端)的初始序列編號(hào)。在這里,可以把TCP序列編號(hào)看作是一個(gè)范圍從0到4,294,967,295的32位計(jì)數(shù)器。通過TCP連接交換的數(shù)據(jù)中每一個(gè)字節(jié)都經(jīng)過序列編號(hào)。在TCP報(bào)頭中的序列編號(hào)欄包括了TCP分段中第一個(gè)字節(jié)的序列編號(hào)。6.FIN:結(jié)束標(biāo)志
帶有該標(biāo)志置位的數(shù)據(jù)包用來結(jié)束一個(gè)TCP回話,但對應(yīng)端口仍處于開放狀態(tài),準(zhǔn)備接收后續(xù)數(shù)據(jù)。
窗口(Window):16位,用來表示想收到的每個(gè)TCP數(shù)據(jù)段的大小。
校驗(yàn)位(Checksum):16位TCP頭。源機(jī)器基于數(shù)據(jù)內(nèi)容計(jì)算一個(gè)數(shù)值,收信息機(jī)要與源機(jī)器數(shù)值 結(jié)果完全一樣,從而證明數(shù)據(jù)的有效性。
優(yōu)先指針(緊急,Urgent Pointer):16位,指向后面是優(yōu)先數(shù)據(jù)的字節(jié),在URG標(biāo)志設(shè)置了時(shí)才有效。如果URG標(biāo)志沒有被設(shè)置,緊急域作為填充。加快處理標(biāo)示為緊急的數(shù)據(jù)段。
選項(xiàng)(Option):長度不定,但長度必須以字節(jié)。如果 沒有 選項(xiàng)就表示這個(gè)一字節(jié)的域等于0。
數(shù)據(jù)(Date):應(yīng)用程序的數(shù)據(jù)。
第三篇:TCP IP網(wǎng)絡(luò)通信程序設(shè)計(jì)
TCP/IP網(wǎng)絡(luò)通信程序設(shè)計(jì)
本文介紹了TCP/IP網(wǎng)絡(luò)應(yīng)用程序的面向?qū)ο笤O(shè)計(jì)方法,并給出了用Visual C++4.2
中MFC在Windows 95環(huán)境下開發(fā)的程序?qū)嵗ockets與Winsock 95
Winsock 95是在Unix Sockets及Windows Sockets基礎(chǔ)上發(fā)展起來的。Sockets原
是BSD為了Unix支持互聯(lián)網(wǎng)通信而設(shè)計(jì)的4.3BSD Unix版本中的API,它采用客戶-服務(wù)器
模式的通信機(jī)制,使網(wǎng)絡(luò)客戶方和服務(wù)器方通過Sockets實(shí)現(xiàn)網(wǎng)絡(luò)之間的聯(lián)接和數(shù)據(jù)交
換;Win dows Sockets描述定義了一個(gè)Microsoft Windows的網(wǎng)絡(luò)編程界面,它為
Windows TCP/IP 提供了一個(gè)BSD型套接字,除與4.3BSD Unix Sockets完全兼容外,還
包括一個(gè)擴(kuò)充文件,通過一組附加的API實(shí)現(xiàn)Windows式(即事件驅(qū)動(dòng))的編程風(fēng)格;而
Winsock 95則是在Microsoft Windows 95中進(jìn)行網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)的接口。Windows 95
在Internet支配域中的TCP /IP協(xié)議定義了Winsock 95網(wǎng)絡(luò)編程規(guī)范,溶入了許多新特點(diǎn)。
MFC中提供了相應(yīng)的CSock et類來實(shí)現(xiàn)網(wǎng)絡(luò)通信。Sockets編程原理
Sockets同時(shí)支持?jǐn)?shù)據(jù)流Sockets和數(shù)據(jù)報(bào)Sockets。
下面是利用Socket進(jìn)行通信連接的過程框圖。其中圖1是面向連接的時(shí)序圖,圖2是
無連接的時(shí)序圖。
圖1
圖2
由圖可以看出,客戶與服務(wù)器的關(guān)系是不對稱的。對于TCP C/S,服務(wù)器首先啟動(dòng),然后在某一時(shí)刻啟動(dòng)客戶與服務(wù)器建立連接。服務(wù)器與客戶開始都必須調(diào)用socket()
建立一個(gè)套接字socket,然后服務(wù)器調(diào)用bind()將套接字與一個(gè)本地網(wǎng)絡(luò)地址捆扎在一
起,再調(diào)用listen()使套接字處于一種被動(dòng)的準(zhǔn)備接收狀態(tài),同時(shí)規(guī)定它的請求隊(duì)列長
度,之后服務(wù)器就可以調(diào)用accept()來接收客戶連接。客戶打開套接字之后,便可通過
調(diào)用connect()和服務(wù)器建立連接。連接建立之后,客戶和服務(wù)器之間就可以通過連接
發(fā)送和接收數(shù)據(jù)。最后,待數(shù)據(jù)傳送結(jié)束,雙方調(diào)用closesocket()關(guān)閉套接字。對于
UDP C/S,客戶并不與服務(wù)器建立一個(gè)連接,而僅僅給服務(wù)器發(fā)送一張包含服務(wù)器地址的數(shù)據(jù)報(bào)。相似地,服務(wù)器也不從客戶端接收一個(gè)連接,只是調(diào)用函數(shù)recvfrom,等待
從客戶端來的數(shù)據(jù)。依照recvfrom返回的協(xié)議地址以及數(shù)據(jù)報(bào),服務(wù)器就可以給客戶
送一個(gè)應(yīng)答。Winsock 95編程方法
用Visual C++4.2以MFC在Windows 95中實(shí)現(xiàn)網(wǎng)絡(luò)編程,主要就是利用CSocket類及
其如下相關(guān)成員函數(shù):
(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
該函數(shù)用來建立Socket。
(2)BOOL Bind(UINT nSocketPort,LPCTSTRlpszSocketAddess=NULL)該函數(shù)的作用是將Socket端口與網(wǎng)絡(luò)地址連接起來。
(3)BOOL Listen(intnConnectionBacklog=5)
該函數(shù)的作用是等待Socket請求。
(4)Virtual BOOL
Accept(CAsyncSocket&rConnectedSocket,Socket,SOCKADDR*
lpSockAddr=NULL,int * lpSockAddrLen=NULL)
該函數(shù)的作用是取得隊(duì)列上第一個(gè)連接請求并建立一個(gè)具有與Socket相同特性的套接字。
(5)BOOL Connect(LPCTSTR lpszHostAddress,UINTnHostPort)
該函數(shù)的作用是提出請求。其中,lpszHostAddress和nHostPort為接受請求進(jìn)
程的網(wǎng)絡(luò)地址和Socket端口號(hào)。
(6)virtual void Close()該函數(shù)的作用是關(guān)閉Socket。
使用以上類及成員函數(shù),按照以下步驟,就可以設(shè)計(jì)出合適的通信程序: Server:Construct→Creat→Bind→Listen→Accept→Send→Close;
Client:Constuct→Creat→Connect→Receive→Close。程序?qū)嵗?/p>
我們用Visual C++4.2中MFC在Windows 95環(huán)境下設(shè)計(jì)了一個(gè)daytime cliont程序,清單如下:
頭文件HEAD.H內(nèi)容:
#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();}
第四篇:控制器市場分析
控制器市場分析
控制器作為電動(dòng)車的主要的關(guān)鍵零部件,他們之間是完全互補(bǔ)品的關(guān)系,電動(dòng)車控制器的需求不僅僅來自于新增產(chǎn)能的零配件市場,同時(shí)也有來自與維修市場,根據(jù)慣例,電動(dòng)車控制器在維修市場的需求大概為存量的5%-10%。因此總的市場需求量考慮到電動(dòng)車的使用壽命,進(jìn)入維修市場的電動(dòng)車的存量應(yīng)該為前五年市場銷量之和5%-10%?;谝韵聨c(diǎn)我國的自動(dòng)控制器的裝配自行車年均增長10%。
1、根據(jù)我國2010年的產(chǎn)業(yè)政策規(guī)劃,本將出臺(tái)相關(guān)的行業(yè)政策和行業(yè)標(biāo)準(zhǔn),政策逐步明朗。
2、我國在2010年將電動(dòng)自行車列為了家電鄉(xiāng)下的補(bǔ)貼電器之一。因此此舉將大幅促進(jìn)我國電動(dòng)自行車在農(nóng)村市場的消費(fèi)。
3、國內(nèi)電動(dòng)車控制器呈兩極分化發(fā)展趨勢,以高標(biāo)科技為首的品牌化發(fā)展之路,面向中高端市場,推出高質(zhì)量、高科技、高水準(zhǔn)的產(chǎn)品,在市場經(jīng)濟(jì)中性價(jià)比極高;以一些雜牌為主,價(jià)格低廉,產(chǎn)品質(zhì)量沒有固定標(biāo)準(zhǔn),生產(chǎn)成本極低,以低價(jià)格的優(yōu)勢在市場上占據(jù)一定份額。
3、我國2010年上半年的數(shù)據(jù)顯示我國在上半年電動(dòng)自行車產(chǎn)量同比增長
8.9%。
4、今后三年內(nèi)電動(dòng)車由于產(chǎn)品升級也逐步進(jìn)入更新?lián)Q代期,同時(shí)產(chǎn)業(yè)升級主要關(guān)鍵部件的升級如控制器、動(dòng)力電源、電機(jī)的升級,解決產(chǎn)業(yè)困局,控制器等關(guān)鍵技術(shù)的升級至關(guān)重要。
第五篇:計(jì)算機(jī)網(wǎng)絡(luò) 課程設(shè)計(jì) 發(fā)送TCP數(shù)據(jù)包
課設(shè)名稱:發(fā)送TCP數(shù)據(jù)包
班級:
學(xué)號(hào):
姓名:
指導(dǎo)老師: 日期: 2012.6.15
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
目錄
一.設(shè)計(jì)題目與要求........................................................................................................2
1.設(shè)計(jì)題目................................................................................................................2
2.設(shè)計(jì)要求................................................................................................................2
二.需求分析...................................................................................................................2三.詳細(xì)設(shè)計(jì)...................................................................................................................2
1.創(chuàng)建一個(gè)原始套接字,并設(shè)置IP頭選項(xiàng).................................................................3
2.構(gòu)造IP頭和TCP頭...............................................................................................3
3.計(jì)算校驗(yàn)和的子函數(shù)..............................................................................................4
4.流程圖...................................................................................................................6
四.調(diào)試分析...................................................................................................................7
五.運(yùn)行結(jié)果...................................................................................................................7
六.總結(jié)..........................................................................................................................8
七.源程序......................................................................................................................9
發(fā)送TCP數(shù)據(jù)包
一.設(shè)計(jì)題目與要求
1.設(shè)計(jì)題目
發(fā)送TCP數(shù)據(jù)包 2.設(shè)計(jì)要求
本設(shè)計(jì)的功能是填充一個(gè)TCP數(shù)據(jù)包,并發(fā)送給目的主機(jī)。
1)以命令行形式運(yùn)行:TCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip為源端IP地址,source_port為源端口號(hào),dest_ip為目的地址,dest_port為目的端口號(hào)。
2)其他的TCP頭部參數(shù)請自行設(shè)定。3)數(shù)據(jù)字段為“hello”。
4)成功發(fā)送后在屏幕上輸出“send OK”。
二.需求分析
1.本程序需完成發(fā)送一個(gè)TCP數(shù)據(jù)包給目的主機(jī)
2.程序的輸入:TCP source_ip source_port dest_ip dest_port,然后根據(jù)提示輸入要發(fā)送的數(shù)據(jù),回車即可。
3.程序的輸出:Send OK!
4.測試數(shù)據(jù) TCP 192.168.1.100 200 192.168.1.101 200
三.詳細(xì)設(shè)計(jì)
本課程設(shè)計(jì)的目標(biāo)是發(fā)送一個(gè)TCP數(shù)據(jù)包,可以利用原始套接字來完成這個(gè)工作。整個(gè)程序由初始化原始套接字和發(fā)送TCP數(shù)據(jù)包兩個(gè)部分組成。
2發(fā)送TCP數(shù)據(jù)包
1.創(chuàng)建一個(gè)原始套接字,并設(shè)置IP頭選項(xiàng)
SOCKET sock;sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:
sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);這里,設(shè)置了SOCK_RAW標(biāo)志,表示我們聲明的是一個(gè)原始套接字類型。為使用發(fā)送接收超時(shí)設(shè)置,必須將標(biāo)志位置位置為WSA_FLAG_OVERLAPPED。在本課程設(shè)計(jì)中,發(fā)送TCP包時(shí)隱藏了自己的IP地址,因此我們要自己填充IP頭,設(shè)置IP頭操作選項(xiàng)。其中flag設(shè)置為ture,并設(shè)定 IP_HDRINCL 選項(xiàng),表明自己來構(gòu)造IP頭。
setsockopt(sock, IPPROTO_IP, IP_HDRINCL,(char *)&Flag, sizeof(Flag));int timeout=1000; setsockopt(sock, sizeof(timeout));在這里我們使用基本套接字SOL_SOCKET,設(shè)置SO_SNDTIMEO表示使用發(fā)送超時(shí)設(shè)置,超時(shí)時(shí)間設(shè)置為1000ms。2.構(gòu)造IP頭和TCP頭
這里,IP頭和TCP頭以及TCP偽部的構(gòu)造請參考下面它們的數(shù)據(jù)結(jié)構(gòu)。
typedef struct _iphdr //定義IP首部 { UCHAR h_lenver;//4位首部長度+4位IP版本號(hào) UCHAR tos;//8位服務(wù)類型TOS
USHORT total_len;//16位總長度(字節(jié))USHORT ident;//16位標(biāo)識(shí)
USHORT frag_and_flags;//3位標(biāo)志位 UCHAR ttl;//8位生存時(shí)間 TTL
UCHAR proto;//8位協(xié)議(TCP, UDP 或其他)
SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,3發(fā)送TCP數(shù)據(jù)包
USHORT checksum;//16位IP首部校驗(yàn)和 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;//協(xié)議類型 //TCP長度
}PSD_HEADER;typedef struct _tcphdr //定義TCP首部 { USHORT th_sport;//16位源端口 USHORT th_dport;//16位目的端口 ULONG th_seq;//32位序列號(hào) ULONG th_ack;//32位確認(rèn)號(hào)
UCHAR th_lenres;//4位首部長度/6位保留字 UCHAR th_flag;//6位標(biāo)志位 USHORT th_win;//16位窗口大小 USHORT th_sum;//16位校驗(yàn)和 USHORT th_urp;//16位緊急數(shù)據(jù)偏移量
}TCP_HEADER;
3.計(jì)算校驗(yàn)和的子函數(shù)
在填充數(shù)據(jù)包的過程中,需要調(diào)用計(jì)算校驗(yàn)和的函數(shù)checksum兩次,分別用于校驗(yàn)IP頭和TCP頭部(加上偽頭部),其實(shí)現(xiàn)代碼如下:
USHORT checksum(USHORT *buffer, int size)
4發(fā)送TCP數(shù)據(jù)包
{ 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發(fā)送TCP數(shù)據(jù)包
4.流程圖
開始構(gòu)造原始套接字并初始化填充IP首部計(jì)算IP首部校驗(yàn)和構(gòu)造TCP偽首部填充TCP首部計(jì)算TCP首部校驗(yàn)和填充發(fā)送緩沖區(qū)填入目的地址發(fā)送數(shù)據(jù)包結(jié)束
6發(fā)送TCP數(shù)據(jù)包
四.調(diào)試分析
本程序流程簡單,調(diào)試過程中沒有出現(xiàn)大的問題。
調(diào)試過程中沒有出現(xiàn)重大的語法錯(cuò)誤,主要是運(yùn)行的結(jié)果不理想,和預(yù)期的結(jié)果有差距。填充數(shù)據(jù)包的程序部分是不容易出錯(cuò)的。至于數(shù)據(jù)包的發(fā)送,由于是利用函數(shù)sendto()來實(shí)現(xiàn)的,而sendto()是面向UDP的,將協(xié)議類型修改為UDP(Header.proto=IPPROTO_UDP;)后,調(diào)試運(yùn)行成功,問題得到解決。
調(diào)試時(shí),要添加 #include
五.運(yùn)行結(jié)果
1.輸入:TCP 192.168.1.100 200 192.168.1.101 200
7發(fā)送TCP數(shù)據(jù)包
2.輸入要發(fā)送的字符串:“hello”按Ctrl+Z發(fā)送
六.總結(jié)
通過本次課程設(shè)計(jì),我對發(fā)送TCP數(shù)據(jù)包的原理有了一定的了解。理解了TCP數(shù)據(jù)報(bào)的報(bào)文格式、TCP連接時(shí)的三次握手和TCP連接結(jié)束時(shí)的四次握手的過程及它們的作用。此外,在設(shè)計(jì)過程中,通過查閱資料,也讓我對TCP的三大特點(diǎn)(流量控制、差錯(cuò)控制、擁塞控制)有了認(rèn)識(shí)。,在課程設(shè)計(jì)過程中,由于編程知識(shí)的欠缺,使我在課程設(shè)計(jì)過程中不是很順利,編程知識(shí)的欠缺是我的最大障礙,不過,這也給了我動(dòng)力,我會(huì)努力去學(xué)好編程的相關(guān)知識(shí),為以后的學(xué)習(xí)和工作打下基礎(chǔ)。最后,感謝老師安排了此次課程設(shè)計(jì)。
發(fā)送TCP數(shù)據(jù)包
七.源程序
#include
#define IPVER 4 //IP協(xié)議預(yù)定 #define MAX_BUFF_LEN 65500 //發(fā)送緩沖區(qū)最大值
typedef struct ip_hdr //定義IP首部 {
UCHAR h_verlen;//4位首部長度,4位IP版本號(hào) UCHAR tos;//8位服務(wù)類型TOS USHORT total_len;//16位總長度(字節(jié))USHORT ident;//16位標(biāo)識(shí) USHORT frag_and_flags;//3位標(biāo)志位 UCHAR ttl;//8位生存時(shí)間 TTL UCHAR proto;//8位協(xié)議(TCP, UDP 或其他)USHORT checksum;//16位IP首部校驗(yàn)和 ULONG sourceIP;//32位源IP地址 ULONG destIP;//32位目的IP地址
發(fā)送TCP數(shù)據(jù)包
}IP_HEADER;
typedef struct tsd_hdr //定義TCP偽首部 {
ULONG saddr;//源地址 ULONG daddr;//目的地址 UCHAR mbz;//沒用 UCHAR ptcl;//協(xié)議類型 USHORT tcpl;//TCP長度
}PSD_HEADER;
typedef struct tcp_hdr //定義TCP首部 {
USHORT th_sport;//16位源端口 USHORT th_dport;//16位目的端口 ULONG th_seq;//32位序列號(hào) ULONG th_ack;//32位確認(rèn)號(hào)
UCHAR th_lenres;//4位首部長度/6位保留字 UCHAR th_flag;//6位標(biāo)志位 USHORT th_win;//16位窗口大小 USHORT th_sum;//16位校驗(yàn)和
USHORT th_urp;//16位緊急數(shù)據(jù)偏移量
}TCP_HEADER;
//CheckSum:計(jì)算校驗(yàn)和的子函數(shù)
USHORT checksum(USHORT *buffer, int size){ unsigned long cksum=0;while(size >1)
發(fā)送TCP數(shù)據(jù)包
{ 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--;
發(fā)送TCP數(shù)據(jù)包
} } 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];//發(fā)送緩沖區(qū)
unsigned short check_Buff[MAX_BUFF_LEN];//檢驗(yàn)和緩沖區(qū) 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;
發(fā)送TCP數(shù)據(jù)包
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;}
發(fā)送TCP數(shù)據(jù)包
//填充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位標(biāo)識(shí) ipHeader.frag_and_flags=0;//3位標(biāo)志位 ipHeader.ttl=128;//8位生存時(shí)間 ipHeader.proto=IPPROTO_TCP;//協(xié)議類型 ipHeader.checksum=0;//檢驗(yàn)和暫時(shí)為0 ipHeader.sourceIP=inet_addr(argv[1]);//32位源IP地址 ipHeader.destIP=inet_addr(argv[3]);//32位目的IP地址
//計(jì)算IP頭部檢驗(yàn)和
memset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER));ipHeader.checksum=checksum(check_Buff,sizeof(IP_HEADER));
//構(gòu)造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位目的端口號(hào) tcpHeader.th_sport=htons(atoi(argv[2]));//16位源端口號(hào)
發(fā)送TCP數(shù)據(jù)包
tcpHeader.th_seq=0;//SYN序列號(hào) tcpHeader.th_ack=0;//ACK序列號(hào)置為0 //TCP長度和保留位
tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)<<4|0);tcpHeader.th_flag=2;//修改這里來實(shí)現(xiàn)不同的標(biāo)志位探測,2是SYN,1是//FIN,16是ACK探測 等等
tcpHeader.th_win=htons((unsigned short)16384);//窗口大小 tcpHeader.th_urp=0;//偏移大小 tcpHeader.th_sum=0;//檢驗(yàn)和暫時(shí)填為0
//計(jì)算TCP校驗(yàn)和
memset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&psdHeader,sizeof(psdHeader));
memcpy(check_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader));
//填充發(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(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);
發(fā)送TCP數(shù)據(jù)包
int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+read_data_len;//發(fā)送數(shù)據(jù)報(bào)的目的地址 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”);