TCP协议调试工具TcpEngine V1.3.0使用教程

简介

这里说的TCP协议调试定义是在开发长连接TCP协议应用时,为了验证代码流程或查找bug,需要与对端交互数据过来,当需要时可以暂停发送;单条发送;跳过发送;正常发送;发送时修改数据等。

TcpEngine提供的解决方案是:我们前端应用和后端应用网络通信时,先经过TcpEngine转发,在转发过程中,可以对网络数据暂停转发(暂停);单条转发(单步);正常转发(运行);转发前编辑数据或转发手工制造的数据(手工发送)等操作,解决我们在开发TCP协议应用时碰到的下列几种情况。

一、前端小组和后端小组协商后协议格式后,就分别开发新功能,在开发过程中需要对端小组发送网络数据过来触发代码执行,以验证代码流程是否正确。但是对端小组也正在开发,功能不完善也不能给你发数据,此时只能盲写代码。另一种情况是我们已经写完代码,需要对端小组发送数据过来,触发代码以验证流程是否正确,但对端功能不完善也不能给你发数据,只能干等待?此时可以使用TcpEngine模拟对端发送数据给自己,触发代码执行。

二、新功能已经集成提交到测试阶段,在测试过程中发生bug,此时需要对端发送数据过来定位错误,但由于对端也在解决bug没时间或不能重现错误数据,此时无法通过网络数据触代码流程来查找bug。此时也可以使用TcpEngine摸拟对端给数据给自己。

三、应用已经交付给客户端,客户使用过程中发生网络数据错误,需要保存现场数据,解析以重现错误现场。此时我们可以使用TcpEngine开启代理服务器,让前端应用和后端应用的数据通信经过TcpEngine转发,TcpEngine转发数据同时解析和保存现场数据,再次使用TcpEngine打开解析,以重现网络的网络数据。

新版本放弃了WFP内核获取网络数据方式,改用代理服务器获取网络,带来易用性很大的提升,新增了TCP协议调试运行模式,新增的功能有:暂停;单步;跳过;运行等新功能。

初识TcpEngine

TcpEngine架构图

TcpEngine使用代理服务器方式截取网络数据,前端需要通过代理客户端把数据发送给TcpEngine的代理服务器模块,TcpEngine收到数据进行解析并显示,然后把解析后的数据再次封装转发给后端,数据流程图如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

下面我们以一个最简单的应用来演示TcpEngine怎么使用,这个应用非常简单,前端发送一条数据给后端,后端就响应一条数据给前端。前端和后端都是用java1.8开发,后端已经部署到demo.tcpengine.cn 服务器,运行前端需要已配置java环境,代码已放到https://gitee.com/www.csdn.net/tcp-engine-test。

把前端应用加入到代理客户端

一、我们以ProxyCap来做为代理客户端,安装ProxyCap成功后会通知区域显示ProxyCap图标,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

二、右键ProxyCap图标弹出配置菜单,点击Configuration按钮,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

三、点击右边导航树的Proxies,再点击New Proxy Server小图标,新建一条指向代理服务器的配置信息,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

四、点击导航树的Rules,再点击Quick Add Rule小图标,把我们的前端应用exe文件加入到ProxyCap,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

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

一、打开任务管理器。

二、再启动我们的前端应用,这时前端应用就新增到任务管理器应用列表,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

三、鼠标右键我们的应用,点击”打开文件所在的位置(O)”,就可定位到我们应用exe文件的位置,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

如下图所示,到此我们成功的把前端应用加入到了ProxyCap代理客户端,当我们再启动前端应用时,前端应用的所有TCP网络数据都由ProxyCap转发给代理服务器,再由代理服务器转发数据给后端应用。

TCP协议调试工具TcpEngine V1.3.0使用教程

启动TcpEngine代理服务器

启动TcpEngine,初始的主界面如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

代理服务器启动成功如下图所示,点击”退出”仅隐藏窗口,对代理服务器运行状态没有影响,只有TcpEngine退出后,代理服务器才停止运行。

TCP协议调试工具TcpEngine V1.3.0使用教程

如果我们启动失败,弹出下图所示异常对话框,那么是因为系统没有安装Visual C++ 14 Runtime Libraries (C++运行支持库),到微软件官网或这里https://tcp-engine.oss-cn-shenzhen.aliyuncs.com/vc_redist.x64.exe下载并安装就可以解决。

TCP协议调试工具TcpEngine V1.3.0使用教程

配置截取网络数据

如下图所示,点击主窗口的新建按钮。

TCP协议调试工具TcpEngine V1.3.0使用教程

新建一个空的解析窗口,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

点击”开始”,弹出网络配置对话框,填入后端应用的网络地址和端口,点击”接收不解析”按钮,把网络配置加入代理服务器的数据截取列表,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

解析主界面开始监听网络数据如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

截取网络数据

启动TcpEngineClient,下载地址:http://www.tcpengine.cn/tcp_engine/down_list.html,下载TcpEngine1.3.0.zip到本地,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

解压后在TcpEngine1.3.0\demo\TcpEngineClient目标下有两个文件startupClient.bat;TcpEngineClient.jar,双击startupClient.bat(注意,运行前本机必须配置好java运行环境,本示例是在java1.8下开发的),示例主界面如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

一、点击”连接”;二、点击”发送1000″,发送一条TCP协议到后端并从后端接收一条TCP,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

再查看TcpEngine界面,显示TcpEngine已截取到TcpEngine协议数据,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

解析网络数据

本示例演示TCP协议格式如下图所示,消息体长度就第二个int型消息体长度决定。

TCP协议调试工具TcpEngine V1.3.0使用教程

对应的解析规则如下所示。

int32 id;

int32len;

if (0 < len)

{

byte [len] body; // 消息体

}

来自前端id=1000消息的消息体如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

对应的消息体的解析规则如下所示。

if (1000 == id) {

int32loginId = split(body);

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

}

完整的解析规则如下所示。

setendian = big;

setencoding = utf-8;

int32id;

int32len;

if (0 < len)

{

byte [len]body; // 消息体

if (1000 == id)

{

int32loginId = split(body);

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

}

}

一、点击”停止”;二、输入解析规则到前端解析规则窗口;三、点击刷新,四、点击”刷新并解析”,把TCP协议解析成正常数据,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

解析规则教程

解析规则定义

在长连接TCP协议开发中,每个应用都会根据自身的业务特点,定义不同的TCP协议格式,TCP协议具有千变万化的特点。面对多变的TCP协议,TcpEngine借鉴编程的部分思路,定义了数据类型;if分支;for循环;算术表达式来组成解析规则。解析规则的执行过程是从上往下顺序执行,当执行到结尾再循环从头开始新一轮执行,比如下图所示的解析规则。

TCP协议调试工具TcpEngine V1.3.0使用教程

这个解析规则的流程图如下所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

设置网络数据环境

网络数据环境指的是大小端和字符串编码环境,在实际应用是,有基本数值数据类型,如int32;float32等,这类数据类型因为硬件平台不同而有大小端的区别,设置大小端的指令是setendian = big; 。字符串数据类型会有编码区别,设置网络字符串编码指令是setencoding = utf-8;。数据环境指令写在解析规则的开头,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

数据类型

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个字节,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

算术表达式

跟程序中的算术表达式一样,算术表式达的计算结果是数值,可用于数组长度计算,变量赋值。变量值来源有两种,一种是来源于网络数据划分,另一种是来源于算术表达式,值来源不同的变量执行表现有下列不同。

一、来源于网络的变量在界面上有显示,而来源于表达式变量不会被显示。

二、来源于网络的变量值不能被改变,而来源于表达式变量可以被改变,如执行++运算。

TCP协议调试工具TcpEngine V1.3.0使用教程

分支和循环

支持if;for,不支持while,跟程序的行为一样,有一点区别是if的格式如下。

if()

{

执行分支段……

}

elseif() // 注意这里else 和 if 之间没有空间

{

执行分支段……

}

else

{

执行分支段……

}

简单的示例如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

内置函数

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前端网络设置如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

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

TCP协议调试工具TcpEngine V1.3.0使用教程

三、编写解析规则,flamingo的TCP协议格式如下图所示

TCP协议调试工具TcpEngine V1.3.0使用教程

对应的解析规则如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

解析flamingo网络数据演示

新建空的解析窗口,编写解析规则,点击工具栏的”开始”按钮,因为flamingo对网络数据进行了加密,我们需要设置加解库(加解库会在”对加解密的支持”章节讲解),如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

启动监听网络数据成功如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

启动flamingo,输入用户名:13888886666 密码:123456 并点击登陆(测试环境,数据可能会被清除),如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

flamingo登陆成功,TcpEngine解析TCP协议结果如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

调试内置函数call

我把flamingo的指令分业务指令和支持指令,业务指令由用户触发,比如登陆;查找;聊天等指令;支持指令由应用自己发送,比如心跳指令。

触发调试模式有两种方式,一、点击工具栏的”暂停”按钮;二、使用call内置函数支持,在解析规则中加入call (pause)。

隐藏

在实际应用中,我们不想显示一些指令的解析结果,比如心跳指令有很多但对我们查找问题没有帮助,这类指令的解析结果我们可以隐藏并且不影响指令转发。那么我们可以在解析规则中加入call(ignore)触发这个功能,比如我们对心跳包的结果隐藏如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

暂停

有时候我们希望网络数据解析到某条指令就暂停转发,阻塞住后面到达的数据,用于仔细分析网络现场数据或者修改数据后再发送。触发这个功能有两种方式,一、点击工具栏暂停按钮;二、在解析规则中加入call (pause),如下图所示,当解析到指令id = 1004 时,TcpEngine暂停转发数据。

TCP协议调试工具TcpEngine V1.3.0使用教程

穿透暂停

当我们触发”暂停”功能后,有一个问题需要解决,就是心跳指令也阻塞住了,如果我们的应用发现收不到心跳指令,可能会认识网络已经断开了,从而主动断开网络。那么我们需要在阻塞网络数据的时候,某些指令还能继续转发,在解析规则中加入call (tunnel)可以实现本功能,如下图所示,当阻塞在1004指令时,心跳指令还能继续转发。

TCP协议调试工具TcpEngine V1.3.0使用教程

工具栏调试按钮

在工具的按钮有,暂停|运行;单步;跳过,功能说明如下。

暂停|运行:当解析线程阻塞转发时,显示”运行”,点击解析线程继续解析并转发;当解析线程正常解析并转发数据时,显示暂停,点击会阻塞解析和转发,暂停的行为跟call(pause)的为行一致。

单步:当解析线程阻塞时,本按钮可点击,点击会把当前阻塞的数据转发到网络,并把下一条网络数据取出解析显示并继续阻塞。

跳过:当解析线程阻塞时,本按钮可点击,点击会把当前阻塞的数据丢弃,并把下一条网络数据取出解析显示并继续阻塞。

手工发送

在开发TCP长连接应用时,常常会发生”简介”章节列举的这几种情况,在对端无法向我们发送数据时,可以使用TcpEngine向我们发送模拟数据,实现这个功能就是手工发送,操作流程如下。

在转发模式下,让解析线程运行到指定指令就暂停下来,本示例我们就让解析线程运行到指令1004就暂停解析。

鼠标双击你要发送的数据,弹出二次解析窗口,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

在二次解析窗口编辑网络数据,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

鼠标右键菜单,点击”发送”,如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

对加密数据的支持

在解析窗口设置加解密库

多数情况下,在网络上流通的数据都是经过加密的,每个应用的加解密算法都是不同并保密的。面对这种情况TcpEngine提供的解决方案是由您根据自身的加解密算法,按照我们的规则封闭成DLL,并在开始解析网络数据前配置到网络解析窗口,配置加解库如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

解码库地址:加解密库DLL在本地的地址,如果数据没有加密,则设置为空。

解码初始化参数:当解析线程加载加密库时,在加密或解密数据前,会对这里输入参数进行验证,验证通过再加解密数据,设计这个参数的目的是防止您的DLL流出,让别有用心的人利用DLL解密您的数据并攻击你的应用,如果设置了参数,别人不知道参数也不能使用您的DLL,相当于密码的功能。

选填/必填:选填,初始化参数可填可不填,如果已填,就对初始化参数验证;必填,初始化参数必须填写并验证。

保存:勾选这个,写把初始化参数保存tcpd文件,再次打开tcpd文件参数装自动填充。

加解密库DLL开发

加解密库有两类接口,一类是由TcpEngine调用,DLL实现的接口;另一类是由TcpEngine实现,DLL调用的接口,这类接口称为回调函数。

由TcpEngine调用DLL实现的接口如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

TCP协议调试工具TcpEngine V1.3.0使用教程

由TcpEngine实现DLL调用的接口如下图所示。

TCP协议调试工具TcpEngine V1.3.0使用教程

DLL库开发的请参考基于flamingo的DLL源代码,代理下载地址:https://gitee.com/www.csdn.net/TcpEngineDecode.git

Original: https://www.cnblogs.com/tcp-engine/p/16512840.html
Author: 工分一百
Title: TCP协议调试工具TcpEngine V1.3.0使用教程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570423/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Day9

    package array;public class ArrayDemo1 { //变量类型 变量的名字 = 变量的值 //数组类型 public static void main…

    Java 2023年6月5日
    063
  • 如何搭建一个WEB服务器项目(六)—— 上传图片至服务器

    上传图片(用户头像)至服务器 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟。欢迎各位大佬来评论区提出问题或者是指出错误,…

    Java 2023年6月8日
    097
  • 嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种?

    前言 Spring Boot 自带的多环境配置 创建不同环境的配置文件 指定运行的环境 Maven 的多环境配置 创建多环境配置文件 定义激活的变量 pom 文件中定义 profi…

    Java 2023年6月14日
    079
  • 数据库命名/设计/访问规范

    1.1.1 基本命名原则 【规则1】命名使用具有意义的英文词汇(或简写),词汇之间使用下划线连接。 说明:普遍认为数据表及其字段等内容使用英文名称更加规范,这样可以为后续的查询及编…

    Java 2023年6月8日
    0101
  • Java JDK和IntelliJ IDEA 配置及安装

    序言 初学java,idea走一波先。安装完成,配置配置项. idea 软件 官方下载地址:https://www.jetbrains.com/idea/download/#sec…

    Java 2023年5月29日
    084
  • 优化排查-线程阻塞:CompletableFuture 和 DiscardPolicy

    优化排查-线程阻塞:CompletableFuture 和 DiscardPolicy 问题发现 1 前天大佬通过prometheus发现 tomcat http busy状态的线…

    Java 2023年6月5日
    0106
  • Spring IoC 的实现机制

    Spring 中的 IoC 的实现原理就是工厂模式加反射机制。 <span>interface<span> <span>Fruit<spa…

    Java 2023年5月30日
    074
  • 架构设计初识

    由于各种原因,好久没有写文章了。最近学习了一下架构设计方面的知识,拿来和大家分享一下。 架构是什么,大家能都说出一二,每个人对架构的理解又不尽相同。但对于架构,我们有几个模糊相似的…

    Java 2023年6月15日
    077
  • JavaWeb_(视频网站)_七、推荐模块1

    package com.Gary.betobe.recommend; import java.util.Set; import org.springframework.beans….

    Java 2023年5月29日
    091
  • Spring系列8:bean的作用域

    本文内容 bean定义信息的意义 介绍6种bean的作用域 bean定义信息的意义 Spring中区分下类、类定义信息,类实例对象的概念?不容易理解,以餐馆中点炒饭为例。 类: 相…

    Java 2023年6月5日
    087
  • 5、静态代理模式

    5、静态代理模式 /** * 1、真实对象和代理对象实现同一个接口; * 2、代理对象,代理真实角色; */public class StaticProxy { public st…

    Java 2023年6月8日
    099
  • 13.数组string关于length

    数组没有length()这个方法,有length属性 string有length()这个方法。 length不是方法,是属性,数组的属性;length()是字符串String的一个…

    Java 2023年6月9日
    096
  • 深入详解Mybatis的架构原理与6大核心流程

    MyBatis 是 Java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。 如果你想要进入一线大厂,能够熟练使用 My…

    Java 2023年6月15日
    091
  • ELK多租户方案

    一、前言 日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的;ELK提供了一整套解决方案,并且都是开源软…

    Java 2023年6月6日
    0188
  • Effective Java 第三版—— 85. 其他替代方式优于Java本身序列化

    Tips书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code注意,书中的有些代码里方法是基于Java 9…

    Java 2023年5月29日
    0100
  • JDK1.8 API 中文文档

    文档下载 链接: https://pan.baidu.com/s/1p1QUCxHyG_e71jfrT07l8g?pwd=ng8r提取码: ng8r 在线下载地址 https://…

    Java 2023年6月9日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球