看第一个解析API:

        private void ParseData(byte[] data)
{
var paramBytes = SplitBuffer(data);
RawParam = _encoding.GetString(paramBytes); ParseParamString(RawParam);
}

  再看如何分隔数据包:

        private byte[] SplitBuffer(byte[] data)
{
int paramIndex = MathUtils.IndexOf(data, EnterChar); //以“\r\n\r\n”为分隔符
byte[] paramBytes;
if (paramIndex >= ) //如果有双换行符
{
paramBytes = new byte[paramIndex];
Buffer.BlockCopy(data, , paramBytes, , paramBytes.Length);                  //将双换行符之前的数据复制出来
InputStream = new byte[data.Length - paramIndex - EnterChar.Length];
Buffer.BlockCopy(data, paramIndex + EnterChar.Length, InputStream, , InputStream.Length); //将剩下的数据复制到 InputStream
}
else
{
paramBytes = data;
}
return paramBytes;
}

  看 Scut 的官方文档,对此也说的很清楚:第一部分是字符串的格式流(命名为Get Params),第二部分是扩展数据流(可选),支持上传些文件流或图片流等,与第一部分之间需要以两个换行(\r\n\r\n)符分隔。

  重点则是对第一部分的格式分析:

        protected virtual void ParseParamString(string paramString)
{
string str = paramString;
int index = paramString.IndexOf(PrefixParamChar, StringComparison.OrdinalIgnoreCase); //找到协议前缀的位置
if (index != -)
{
if (paramString.StartsWith(PrefixRouteChar, StringComparison.OrdinalIgnoreCase))
{
//ex: "route:xxx?d="
RouteName = paramString.Substring(PrefixRouteChar.Length, index - PrefixRouteChar.Length);
}
str = paramString.Substring(index + PrefixParamChar.Length); //从协议前缀位置开始截断
str = HttpUtility.UrlDecode(str) ?? ""; }
if (!str.Contains("="))
{
TraceLog.ReleaseWriteDebug("Parse request error:{0}", paramString);
return;
} var nvc = HttpUtility.ParseQueryString(str); //根据 xx=xx&xx=xx 的规则取出数据
foreach (var key in nvc.AllKeys)
{
if (string.IsNullOrEmpty(key)) continue;
var val = nvc[key]; if (PrefixRouteChar.StartsWith(key, StringComparison.OrdinalIgnoreCase))
{
RouteName = val;
continue;
}
this[key] = val;
}
}
public string this[string name]
{
get { return _params[name]; }
set { _params[name] = value; }
} private Dictionary<string, string> _params = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);

总结:

1. SplitBuffer 主要是做第一部分与第二部分的分离;

2. 第一部分:可知的规则是 ?d=Key1=Value1&Key2=Value2... 并且要执行一次 Url 编码;

Scut:从PackageReader分析客户端协议规则的更多相关文章

  1. wireshark 抓包分析 TCPIP协议的握手

    wireshark 抓包分析 TCPIP协议的握手 原网址:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html 之前写过一篇 ...

  2. SMB协议利用之ms17-010-永恒之蓝漏洞抓包分析SMB协议

    SMB协议利用之ms17-010-永恒之蓝漏洞抓包分析SMB协议 实验环境: Kali msf以及wireshark Win7开启网络共享(SMB协议) 实验步骤: 1.查看本机数据库是否开启,发现数 ...

  3. Wireshark数据抓包分析——网络协议篇

                   Wireshark数据抓包分析--网络协议篇     watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF4dWViYQ==/ ...

  4. 第二次实验报告:使用Packet Tracer分析应用层协议

    个人信息:      •  姓名:李微微       •  班级:计算1811       •  学号:201821121001 一.摘要 本文描述使用Packet Tracer,正确配置网络参数,抓 ...

  5. 第二次作业:使用Packet Tracer分析应用层协议(DNS、FTP、DHCP、SMTP、POP3)

    0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 熟练使用Packet Tracer工具.分析抓到的应用层协议数据包,深入理解应用层协议,包括语法.语义.时序. 2 实验内容 ...

  6. 第二次实验报告:使用 Packet Tracer 分析应用层协议

    个人信息: 姓名:倪晓东 班级:计算1811 学号:201821121020 1 实验目的 熟练使用Packet Tracer工具.分析抓到的应用层协议数据包,深入理解应用层协议,包括语法.语义.时序 ...

  7. 使用wireshark分析MQTT协议

    网络上搜索到两种用wireshark工具分析MQTT协议的方法,都是使用wireshark插件,一种是Wireshark Generic Dissector:另一种是使用lua脚本插件(推荐使用这种方 ...

  8. Wireshark使用drcom_2011.lua插件协助分析drcom协议

    drcom_2011.lua是来源于Google code上的一个开源项目中的一个插件,感谢网络大神的分享 需要使用drcom_2011.lua分析drcom协议的话,需要把drcom_2011.lu ...

  9. 2.爬虫 urlib库讲解 异常处理、URL解析、分析Robots协议

    1.异常处理 URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过这个类来处理. from urllib ...

随机推荐

  1. PHP面试题(二)

    前言 从网上找了一套号称是百度的php面试题目,这里记录一下 PHP的gc机制 php的垃圾回收机制注意以下几点即可: 引用计数refcount和is_ref,也就是php不会随意的malloc内存空 ...

  2. dubbo服务+Spring事务+AOP动态数据源切换 出错

    1:问题描述,以及分析 项目用了spring数据源动态切换,服务用的是dubbo.在运行一段时间后程序异常,更新操作没有切换到主库上. 这个问题在先调用读操作后再调用写操作会出现. 经日志分析原因: ...

  3. PyCharm4注册码

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 name : newasp == ...

  4. OpenCV LDA(Linnear Discriminant analysis)类的使用---OpenCV LDA演示样例

    1.OpenCV中LDA类的声明 //contrib.hpp class CV_EXPORTS LDA { public: // Initializes a LDA with num_componen ...

  5. boost库在工作(15)绑定器与函数对象之三

    前面已经可以优美地解决两个参数的函数给算法for_each调用了,但是又会遇到这样的一种情况,当需要三个参数或者三个以上的参数给算法for_each调用呢?从STL里的绑定器bind1st,显然是不行 ...

  6. 第五篇:R语言数据可视化之散点图

    散点图简介 散点图通常是用来表述两个连续变量之间的关系,图中的每个点表示目标数据集中的每个样本. 同时散点图中常常还会拟合一些直线,以用来表示某些模型. 绘制基本散点图 本例选用如下测试数据集: 绘制 ...

  7. tomcat 8.0 安装

    tomcat 安装算是非常简单的, 因自己使用ubuntu,所以以下环境均为 ubuntu 操作系统下 tomcat 官方简介 tomcat 各版本下载 这里我使用二进制版本(binary distr ...

  8. PHPMailer中文说明

    PHPMailer中文说明 A开头: $AltBody --属性出自:PHPMailer ::$AltBody文件:class.phpmailer .php说明:该属性的设置是在邮件正文不支持HTML ...

  9. struts2学生信息管理系统篇章③

    package com.java1234.util; public class PageUtil { //传进来四个参数,tagetUtil是跳转链接的头部,totalNum是总个数,currentP ...

  10. Python的基本配置

    Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结 ...