协议解析器

using UnityEngine;
using System.Collections;
using System.Text;
/*
 * 1. higher is First
 * 2. string add length
 **/
/// <summary>发送包</summary>
public class SendPackage
{
    private ArrayList send = new ArrayList();
    public int Length;
    public static int AccountID;
    public short protocolID;
    public SendPackage(short protocolNumber){
        protocolID = protocolNumber;
        addShort((short)0);
        addShort(protocolNumber);
        addInt(AccountID);
    }
    
    public void addByte(byte s) {
        send.Add(s);
    }
    
    public void addShort(short s) {
        send.Add((byte)((s & 0xff00) >> 8));
        send.Add((byte)(s & 0xff));
    }
    
    public void addInt(int s) {
         send.Add((byte) ((0xff000000 & s) >> 24));
        send.Add((byte) ((0xff0000 & s) >> 16));
        send.Add((byte) ((0xff00 & s) >> 8));
        send.Add((byte) (0xff & s));
    }
public void addString(string s){ byte[] str = Encoding.UTF8.GetBytes(s); short sl= (short)str.Length; addShort(sl); for(int i = 0; i < sl; i++){ send.Add(str[i]); } } /// <summary>发送 是否触发发送事件</summary> public void Send(bool sm = true){ Length = (short)(send.Count - 8); send[0] = (byte)((Length & 0xff00) >> 8); send[1] = (byte)(Length & 0xff); NetWorkManager.instance.SendSocket((byte[])send.ToArray (typeof(byte)), sm); } }

 

using UnityEngine;
using System.Collections;
using System.Text;

public class ReceiveParse 
{    
    public int point = 0;
    public int length;
    public short protocolID;
    public int userId;
    public byte[] receiveSave;

    public ReceiveParse(byte[] receive)
    {
        receiveSave = receive;
        length = getShort();
        protocolID = getShort();
        userId = getInt();
        length += 8;
    }

    public byte getByte() 
    {
        byte r = receiveSave[point];
        point += 1;
        return r;
    }
    
    public short getShort() 
    {
        byte[] buf = new byte[2] {receiveSave[point + 1] , receiveSave[point + 0]};
        if (buf == null) 
        {
           Debug.Log("getShort is Null!!");
        }
        if (buf.Length > 2) 
        {
          Debug.Log("getShort is OverRide!!");
        }
        short r = 0;
        for (int i = buf.Length - 1; i >= 0; i--) 
        {
            r <<= 8;
            r |= (short)(buf[i] & 0xff);
        }
        point += 2;
        return r;
      }
    
    public int getInt() 
    {
        byte[] buf = new byte[4] { receiveSave[point + 3], receiveSave[point + 2], receiveSave[point + 1], receiveSave[point] };
        if (buf == null) 
        {
           Debug.Log("getInt is Null!!");
        }
        if (buf.Length > 4) 
        {
          Debug.Log("getInt is OverRide!!");
        }
        int r = 0;
           for (int i = buf.Length - 1; i >= 0; i--) 
        {
            r <<= 8;
            r |= (buf[i] & 0xff);
         }
        point += 4;
        return r; 
      }

    public long getLong()
    {
        byte[] buf = new byte[8] {receiveSave[point + 7], receiveSave[point + 6], receiveSave[point + 5] , receiveSave[point + 4],receiveSave[point + 3], receiveSave[point + 2], receiveSave[point + 1] , receiveSave[point]};
        if (buf == null) 
        {
            Debug.Log("getInt is Null!!");
        }
        if (buf.Length > 8) 
        {
            Debug.Log("getInt is OverRide!!");
        }
        long r = 0;
        for (int i = buf.Length - 1; i >= 0; i--) 
        {
            r <<= 8;
            r |= (long)((long)buf[i] & 0xff);
        }
        point += 8;
        return r;
    }
    
    public string getString()
    {
        short lengh = getShort();
        byte[] buf = new byte[lengh];
        for(int i = 0; i < lengh; i++)
        {
            buf[i] = receiveSave[point + i];
        }
        point += lengh;
        return Encoding.UTF8.GetString(buf);
    }
    

}

ReceiveParse rd = new ReceiveParse(recvBytes); 

包解析

ReceiveParse rp = NetWorkManager.instance.GetReceive();
int id = rp.getShort();
int code = rp.getShort();

发包

SendPackage sp = new SendPackage(14000);
sp.addShort(1);
sp.addShort(5);
sp.Send();

 

转载于:https://www.cnblogs.com/jiangjieqim/p/4586505.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包括源程序和详细的使用说明个,同时内付相关的软件 编程环境: 操作系统:Windows XP SP2 开发语言:C++ / MFC 编译环境:MS Visual C++6.0 第3方函数库:Winpcap3.1 使用说明: 1. 启动: 程序启动后首先出现网卡选择对话框,如图1所示,在设备列表中选择需要进行捕获的网卡。 2. 界面: 选择网卡后出现程序主界面,界面设计主要参照了一款比较优秀的网络协议分析工具Iris的图形化界面,采用切分窗口风格,整个程序界面分为三部分:左侧为树形视图,右侧上半部分为列表视图,右侧下半部分为编辑视图 3. 功能: 1) 如果不做任何设置,程序默认为混杂模式,点击按钮① 后,程序开始捕获网络上传输的所有数据包,并将它们显示在列表视图中。点击按钮② 停止捕获。 2) 点击列表视图中的某一行后,对应于该数据包的详细字段分析和原始数据将分别显示在左侧树形视图和右下的编辑视图中,如图2所示。 3) 列表视图中显示的最大数据包数量为2000条,超过后列表视图将清空并重新开始。另外程序还提供了在任意时刻清空当前列表视图中所有数据包的命令(提供该命令的原因是经常会有这样的情况:即列表视图中已经有了很多消息了,但目前只需要关注从即刻起之后到来的消息,这时以前的消息就不再有用并且会影响我们对所要消息的选择)。要使用该命令请在列表视图中任意位置单击鼠标右键,在弹出的菜单中选择“全部清空”

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值