TCP協議調試工具TcpEngine V1.3.0使用教程

来源:https://www.cnblogs.com/tcp-engine/archive/2022/07/24/16512840.html
-Advertisement-
Play Games

簡介 這裡說的TCP協議調試定義是在開髮長連接TCP協議應用時,為了驗證代碼流程或查找bug,需要與對端交互數據過來,當需要時可以暫停發送;單條發送;跳過發送;正常發送;發送時修改數據等。 TcpEngine提供的解決方案是:我們前端應用和後端應用網路通信時,先經過TcpEngine轉發,在轉發過程 ...


簡介

  這裡說的TCP協議調試定義是在開髮長連接TCP協議應用時,為了驗證代碼流程或查找bug,需要與對端交互數據過來,當需要時可以暫停發送;單條發送;跳過發送;正常發送;發送時修改數據等。

  TcpEngine提供的解決方案是:我們前端應用和後端應用網路通信時,先經過TcpEngine轉發,在轉發過程中,可以對網路數據暫停轉發(暫停);單條轉發(單步);正常轉發(運行);轉發前編輯數據或轉發手工製造的數據(手工發送)等操作,解決我們在開發TCP協議應用時碰到的下列幾種情況。

  一、前端小組和後端小組協商後協議格式後,就分別開發新功能,在開發過程中需要對端小組發送網路數據過來觸發代碼執行,以驗證代碼流程是否正確。但是對端小組也正在開發,功能不完善也不能給你發數據,此時只能盲寫代碼。另一種情況是我們已經寫完代碼,需要對端小組發送數據過來,觸發代碼以驗證流程是否正確,但對端功能不完善也不能給你發數據,只能幹等待?此時可以使用TcpEngine模擬對端發送數據給自己,觸發代碼執行。

  二、新功能已經集成提交到測試階段,在測試過程中發生bug,此時需要對端發送數據過來定位錯誤,但由於對端也在解決bug沒時間或不能重現錯誤數據,此時無法通過網路數據觸代碼流程來查找bug。此時也可以使用TcpEngine摸擬對端給數據給自己。

  三、應用已經交付給客戶端,客戶使用過程中發生網路數據錯誤,需要保存現場數據,解析以重現錯誤現場。此時我們可以使用TcpEngine開啟代理伺服器,讓前端應用和後端應用的數據通信經過TcpEngine轉發,TcpEngine轉發數據同時解析和保存現場數據,再次使用TcpEngine打開解析,以重現網路的網路數據。

  新版本放棄了WFP內核獲取網路數據方式,改用代理伺服器獲取網路,帶來易用性很大的提升,新增了TCP協議調試運行模式,新增的功能有:暫停;單步;跳過;運行等新功能。

初識TcpEngine

TcpEngine架構圖

  TcpEngine使用代理伺服器方式截取網路數據,前端需要通過代理客戶端把數據發送給TcpEngine的代理伺服器模塊,TcpEngine收到數據進行解析並顯示,然後把解析後的數據再次封裝轉發給後端,數據流程圖如下圖所示。

  下麵我們以一個最簡單的應用來演示TcpEngine怎麼使用,這個應用非常簡單,前端發送一條數據給後端,後端就響應一條數據給前端。前端和後端都是用java1.8開發,後端已經部署到demo.tcpengine.cn 伺服器,運行前端需要已配置java環境,代碼已放到https://gitee.com/www.csdn.net/tcp-engine-test。

把前端應用加入到代理客戶端

  一、我們以ProxyCap來做為代理客戶端,安裝ProxyCap成功後會通知區域顯示ProxyCap圖標,如下圖所示。

  二、右鍵ProxyCap圖標彈出配置菜單,點擊Configuration按鈕,如下圖所示。

  四、點擊右邊導航樹的Proxies,再點擊New Proxy Server小圖標,新建一條指向代理伺服器的配置信息,如下圖所示。

  五、點擊導航樹的Rules,再點擊Quick Add Rule小圖標,把我們的前端應用exe文件加入到ProxyCap,如下圖所示。

查找前端應用exe文件的小技巧

  一、打開任務管理器。

  二、再啟動我們的前端應用,這時前端應用就新增到任務管理器應用列表,如下圖所示。

  三、滑鼠右鍵我們的應用,點擊“打開文件所在的位置(O)”,就可定位到我們應用exe文件的位置,如下圖所示。

  如下圖所示,到此我們成功的把前端應用加入到了ProxyCap代理客戶端,當我們再啟動前端應用時,前端應用的所有TCP網路數據都由ProxyCap轉發給代理伺服器,再由代理伺服器轉發數據給後端應用。

啟動TcpEngine代理伺服器

  啟動TcpEngine,初始的主界面如下圖所示。

  代理伺服器啟動成功如下圖所示,點擊“退出”僅隱藏視窗,對代理伺服器運行狀態沒有影響,只有TcpEngine退出後,代理伺服器才停止運行。

  如果我們啟動失敗,彈出下圖所示異常對話框,那麼是因為系統沒有安裝Visual C++ 14 Runtime Libraries (C++運行支持庫),到微軟體官網或這裡https://tcp-engine.oss-cn-shenzhen.aliyuncs.com/vc_redist.x64.exe下載並安裝就可以解決。

配置截取網路數據

  如下圖所示,點擊主視窗的新建按鈕。

  新建一個空的解析視窗,如下圖所示。

  點擊“開始”,彈出網路配置對話框,填入後端應用的網路地址和埠,點擊“接收不解析”按鈕,把網路配置加入代理伺服器的數據截取列表,如下圖所示。

  解析主界面開始監聽網路數據如下圖所示。

截取網路數據

  啟動TcpEngineClient,下載地址:http://www.tcpengine.cn/tcp_engine/down_list.html,下載TcpEngine1.3.0.zip到本地,如下圖所示。

  解壓後在TcpEngine1.3.0\demo\TcpEngineClient目標下有兩個文件startupClient.bat;TcpEngineClient.jar,雙擊startupClient.bat(註意,運行前本機必須配置好java運行環境,本示例是在java1.8下開發的),示例主界面如下圖所示。

  一、點擊“連接”;二、點擊“發送1000”,發送一條TCP協議到後端並從後端接收一條TCP,如下圖所示。

  再查看TcpEngine界面,顯示TcpEngine已截取到TcpEngine協議數據,如下圖所示。

解析網路數據

  本示例演示TCP協議格式如下圖所示,消息體長度就第二個int型消息體長度決定。

  對應的解析規則如下所示。

int32 id;

int32 len;

if(0 < len)

{

byte[len] body; // 消息體

}

  來自前端id=1000消息的消息體如下圖所示。

  

  對應的消息體的解析規則如下所示。

if(1000 == id) {

int32 loginId = split(body);

string[len - 4] = split(body);

}

  完整的解析規則如下所示。

set endian = big;

set encoding = utf-8;

int32 id;

int32 len;

if(0 < len)

{

byte[len] body; // 消息體

if(1000 == id)

 {

int32 loginId = split(body);

string[len - 4] = split(body);

}

}

  一、點擊“停止”;二、輸入解析規則到前端解析規則視窗;三、點擊刷新,四、點擊“刷新並解析”,把TCP協議解析成正常數據,如下圖所示。

解析規則教程

解析規則定義

  在長連接TCP協議開發中,每個應用都會根據自身的業務特點,定義不同的TCP協議格式,TCP協議具有千變萬化的特點。面對多變的TCP協議,TcpEngine借鑒編程的部分思路,定義了數據類型;if分支;for迴圈;算術表達式來組成解析規則。解析規則的執行過程是從上往下順序執行,當執行到結尾再迴圈從頭開始新一輪執行,比如下圖所示的解析規則。

  這個解析規則的流程圖如下所示。

設置網路數據環境

  網路數據環境指的是大小端和字元串編碼環境,在實際應用是,有基本數值數據類型,如int32;float32等,這類數據類型因為硬體平臺不同而有大小端的區別,設置大小端的指令是set endian = big; 。字元串數據類型會有編碼區別,設置網路字元串編碼指令是set encoding = utf-8;。數據環境指令寫在解析規則的開頭,如下圖所示。

數據類型

char 字元型,一個位元組,顯示ASCII 字元。

byte 位元組型,一個位元組,以十六進位顯示。

int8 有符號整型,一個位元組,以十進位顯示。

uint8 無符號整型,一個位元組,以十進位顯示。

int16 有符號整型,兩個位元組,以十進位顯示。

uint16 無符號整型,兩個位元組,以十進位顯示。

int32  有符號整型,四個位元組,以十進位顯示。

uint32  無符號整型,四個位元組,以十進位顯示。

int64 有符號整型,八個位元組,以十進位顯示。

uint64 無符號整型,八個位元組,以十進位顯示。

float32 浮點型,四個位元組,以十進位顯示。

float64 浮點型,八個位元組,以十進位顯示。

string 字元串型,可變長度,如果指定了長度,則按指定長度劃分位元組數,如果不指定長度,一直劃分到遇到零為止,如果沒有零,一直劃分到本行結束。

數組

  基本數據類型數組概念與編程中的數組概念類似,是把連續的網路數字流劃分到連續的記憶體中,定義格式是 基本數據類型[數組大小表達式] 數組的幾種定義方式如下。

  使用常量定義數組長度,如int16[3],定義了三個兩位元組整型數組,共占用6個位元組長度。

  使用變數定義數組長度,如byte[len],由變數動態指定數組長度。

  使用算術表達式定義數組長度,如int32[1+2*3]string[len-4]; 等。

  數組的長度計算方式是數據類型長度 * 數組元素數,比如int32[3]占用12個位元組,float64[4]占用32個位元組。字元串的數據類型長度是1個位元組,string[32]占用32個位元組,如下圖所示。

算術表達式

  跟程式中的算術表達式一樣,算術表式達的計算結果是數值,可用於數組長度計算,變數賦值。變數值來源有兩種,一種是來源於網路數據劃分,另一種是來源於算術表達式,值來源不同的變數執行表現有下列不同。

  一、來源於網路的變數在界面上有顯示,而來源於表達式變數不會被顯示。

  二、來源於網路的變數值不能被改變,而來源於表達式變數可以被改變,如執行++運算。

分支和迴圈

支持iffor,不支持while,跟程式的行為一樣,有一點區別是if的格式如下。

if()

{

執行分支段......

}

elseif()    // 註意這裡else 和 if 之間沒有空間

{

執行分支段......

}

else

{

執行分支段......

}

簡單的示例如下圖所示。

內置函數

  TcpEngine不支持自定義函數,本版本僅定義了兩個內置函數,分別是split和call。split是對數組再一次劃分到新變數,用法與效果前面已經說明和展示了,這裡不再介紹。call是支持調試模式執行,這個內置函數在調試解析再詳細說明。

調試TCP協議教程

  這個版本新增的最重要功能,也是最實用功能,由暫停;忽略;穿透暫停;運行;手工發送等子功能組成。觸發調式模式有兩種方式,一、在運行中,手工點擊工具欄的“暫停”按鈕;二、在解決規則上加入call(pause);。

  調試TCP協議的定義是:我們前端應用和後端應用網路通信時,先經過TcpEngine轉發,在轉發過程中,可以網路數據暫停轉發(暫停);單條轉發(單步);正常轉發(運行);轉發前修改數據或轉發手工製造的數據(手工發送)等操作,本節用開源的IM軟體flamingo演示,flamingo的源碼托管地址 https://gitee.com/balloonwj/flamingo。

調試前準備

  一、flamingo後端已放到demo.tcpengine.cn,伺服器埠是20000;20001;20002,flamingo前端網路設置如下圖所示。

  二、參考前面的教程把flamingo加入到ProxyCap,如下圖所示。

三、編寫解析規則,flamingo的TCP協議格式如下圖所示

  對應的解析規則如下圖所示。

解析flamingo網路數據演示

  新建空的解析視窗,編寫解析規則,點擊工具欄的“開始”按鈕,因為flamingo對網路數據進行了加密,我們需要設置加解庫(加解庫會在“對加解密的支持”章節講解),如下圖所示。

啟動監聽網路數據成功如下圖所示。

啟動flamingo,輸入用戶名:13888886666 密碼:123456 並點擊登陸(測試環境,數據可能會被清除),如下圖所示。

flamingo登陸成功,TcpEngine解析TCP協議結果如下圖所示。

調試內置函數call

  我把flamingo的指令分業務指令和支持指令,業務指令由用戶觸發,比如登陸;查找;聊天等指令;支持指令由應用自己發送,比如心跳指令。

  觸發調試模式有兩種方式,一、點擊工具欄的“暫停”按鈕;二、使用call內置函數支持,在解析規則中加入call(pause)

隱藏

  在實際應用中,我們不想顯示一些指令的解析結果,比如心跳指令有很多但對我們查找問題沒有幫助,這類指令的解析結果我們可以隱藏並且不影響指令轉發。那麼我們可以在解析規則中加入call(ignore)觸發這個功能,比如我們對心跳包的結果隱藏如下圖所示。

暫停

  有時候我們希望網路數據解析到某條指令就暫停轉發,阻塞住後面到達的數據,用於仔細分析網路現場數據或者修改數據後再發送。觸發這個功能有兩種方式,一、點擊工具欄暫停按鈕;二、在解析規則中加入call(pause),如下圖所示,當解析到指令id = 1004 時,TcpEngine暫停轉發數據。

穿透暫停

  當我們觸發“暫停”功能後,有一個問題需要解決,就是心跳指令也阻塞住了,如果我們的應用發現收不到心跳指令,可能會認識網路已經斷開了,從而主動斷開網路。那麼我們需要在阻塞網路數據的時候,某些指令還能繼續轉發,在解析規則中加入call(tunnel)可以實現本功能,如下圖所示,當阻塞在1004指令時,心跳指令還能繼續轉發。

工具欄調試按鈕

  在工具的按鈕有,暫停|運行;單步;跳過,功能說明如下。

  暫停|運行:當解析線程阻塞轉發時,顯示“運行”,點擊解析線程繼續解析並轉發;當解析線程正常解析並轉發數據時,顯示暫停,點擊會阻塞解析和轉發,暫停的行為跟call(pause)的為行一致。

  單步:當解析線程阻塞時,本按鈕可點擊,點擊會把當前阻塞的數據轉發到網路,並把下一條網路數據取出解析顯示並繼續阻塞。

  跳過:當解析線程阻塞時,本按鈕可點擊,點擊會把當前阻塞的數據丟棄,並把下一條網路數據取出解析顯示並繼續阻塞。

手工發送

  在開發TCP長連接應用時,常常會發生“簡介”章節列舉的這幾種情況,在對端無法向我們發送數據時,可以使用TcpEngine向我們發送模擬數據,實現這個功能就是手工發送,操作流程如下。

  在轉發模式下,讓解析線程運行到指定指令就暫停下來,本示例我們就讓解析線程運行到指令1004就暫停解析。

  滑鼠雙擊你要發送的數據,彈出二次解析視窗,如下圖所示。

  在二次解析視窗編輯網路數據,如下圖所示。

  滑鼠右鍵菜單,點擊“發送”,如下圖所示。

對加密數據的支持

在解析視窗設置加解密庫

  多數情況下,在網路上流通的數據都是經過加密的,每個應用的加解密演算法都是不同並保密的。面對這種情況TcpEngine提供的解決方案是由您根據自身的加解密演算法,按照我們的規則封閉成DLL,併在開始解析網路數據前配置到網路解析視窗,配置加解庫如下圖所示。

  解碼庫地址:加解密庫DLL在本地的地址,如果數據沒有加密,則設置為空。

  解碼初始化參數:當解析線程載入加密庫時,在加密或解密數據前,會對這裡輸入參數進行驗證,驗證通過再加解密數據,設計這個參數的目的是防止您的DLL流出,讓別有用心的人利用DLL解密您的數據並攻擊你的應用,如果設置了參數,別人不知道參數也不能使用您的DLL,相當於密碼的功能。

  選填/必填:選填,初始化參數可填可不填,如果已填,就對初始化參數驗證;必填,初始化參數必須填寫並驗證。

  保存:勾選這個,寫把初始化參數保存tcpd文件,再次打開tcpd文件參數裝自動填充。

加解密庫DLL開發

  加解密庫有兩類介面,一類是由TcpEngine調用,DLL實現的介面;另一類是由TcpEngine實現,DLL調用的介面,這類介面稱為回調函數。

  由TcpEngine調用DLL實現的介面如下圖所示。

  由TcpEngine實現DLL調用的介面如下圖所示。

  DLL庫開發的請參考基於flamingo的DLL源代碼,代理下載地址:https://gitee.com/www.csdn.net/TcpEngineDecode.git


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環境: vm 16.2 Windows 7 SP1 (來源i tell you) 在網上搜索了眾多帖子的解決辦法都無效後,我找到了官方的終極解決辦法 https://packages.vmware.com/tools/releases/index.html 訪問並下載,安裝 結束 如果是Linux ...
  • echo命令是Linux中最基礎和最常用的命令,特別是在Shell腳本經常用來列印輸出調試信息等,功能比較豐富,現來總結一下,方便後續查看。 1.基本語法 echo [參數] 字元串 主要參數解釋如下所示: | 參數 | 功能 | | | | | -e | 激活轉義字元 | | -n | 輸出不進行 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下將源碼製作成Lib庫方法及其與IAR,MDK差異。 程式函數庫是一個包含已經編譯好代碼和數據的函數集合,這個庫文件里的函數可以供其他程式調用。被放進庫文件里的代碼通常具有一定通用性,是經過高度抽象的,這樣可 ...
  • 寫在前面 本系列的文章是博主邊學邊記錄的,可能不是特別的準備,因為會加上博主自己的理解,僅供參考。 其次就是,博主是有一定的基礎了,大學開設過操作系統的課,建立在這個基礎上,寫出來的筆記可能不會太詳細。 博主所看書籍為 《操作系統導論》王海鵬譯 正文 除了介紹操作系統的一些歷史外,還總體概括了操作系 ...
  • 想要在Home Assistant中通過智能遙控發送紅外信號控制空調需有兩個步驟: 一、智能遙控接入Home Assistant; 二、Home Assistant將紅外信號數據發往智能遙控,智能遙控收到後發送對應紅外信號; 下麵將詳細介紹這兩個流程,為了減少字數以下Home Assistant會簡 ...
  • Final Cut Pro for Mac 是Mac系統平臺上一款由蘋果公司開發專業視頻非線性編輯器,Final Cut Pro 帶來創新功能,讓剪接師能夠製作精美的追蹤動態圖像,並可編輯iPhone 13 及iPhone 13 Pro 上以「電影效果」模式拍攝的影片。 詳情:Final Cut P ...
  • 1、Linux簡介 1.1、什麼是Linux Linux是一套免費使用和自由傳播的操作系統。 1.2、學習Linux的原因 1.2.1、企業用人要求 在現如今的時代中,越來越多的IT崗位都提到了要有Linux操作系統的經驗。 這是因為**Linux操作系統提供了很多穩定的發行版本,廣泛的應用在我們各 ...
  • 基礎知識 linux系統的組成 內核(kerner) 根文件系統(rootfs) 內核提供操作系統的功能,根文件系統包含常用的一些工具,這些工具。這些工具的運行離不開glibc庫文件。 程式:二進位程式文件 庫:庫是函數的集合,用來實現介面調用等功能。程式的運行依賴這些庫文件 Linux內核的功能: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...