zoukankan      html  css  js  c++  java
  • SuperSocket笔记--协议实现模板

    一、通信协议实现中 SuperSocket 提供了一些通用的协议解析工具:

    TerminatorReceiveFilter 

    CountSpliterReceiveFilter 

    FixedSizeReceiveFilter 

    BeginEndMarkReceiveFilter 

    FixedHeaderReceiveFilter 

    二、此处主要记录=>FixedHeaderReceiveFilter 

    头部格式固定并且包含内容长度的协议,将一个请求定义为两大部分, 第一部分定义了包含第二部分长度等等基础信息。

    (1)例1(文档中的例子):

    协议: 头部包含 6 个字节, 前 4 个字节用于存储请求的名字, 后两个字节用于代表请求体的长度,最后是传输包。

    request name

    (4byte)

    length

    (2byte)

    body

    实现这种协议代码:

    class MyReceiveFilter : FixedHeaderReceiveFilter<BinaryRequestInfo>
    {
        public MyReceiveFilter()
            : base(6)
        {
    
        }
    
        protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
        {
            return (int)header[offset + 4] * 256 + (int)header[offset + 5];
        }
    
        protected override BinaryRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
        {
            return new BinaryRequestInfo(Encoding.UTF8.GetString(header.Array, header.Offset, 4), bodyBuffer.CloneRange(offset, length));
        }
    }
    • 传入父类构造函数的 6 表示头部的长度;
    • 方法"GetBodyLengthFromHeader(...)" 应该根据接收到的头部返回请求体的长度;
    • 方法 ResolveRequestInfo(....)" 应该根据你接收到的请求头部和请求体返回你的请求类型的实例.

    (2)可以根据自己的需求定义相应的头部格式自定义

    头部定义并非固定,可以按照需求添加需要的字节存储一些信息表达如:包的一些属性、时间等。

  • 相关阅读:
    linux下c语言实现搜索根目录下所有文件(转-wangxiangshang)
    windows编程之GDI基础--获取设备内容属性(三)
    windows编程之GDI基础--设备内容(二)
    windows编程之GDI基础(一)
    windows编程之滚动条(新式滚动条函数)
    window编程之滚动条(老式滚动条)
    来博客园混了...
    实现一个4位加减法与或运算选择器(作业)
    黑客初级知识(四)
    黑客初级知识(三)
  • 原文地址:https://www.cnblogs.com/machenghu/p/6441839.html
Copyright © 2011-2022 走看看