zoukankan      html  css  js  c++  java
  • C#高性能大容量SOCKET并发(八):通讯协议

    协议种类

    开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能;一种是用Code加结构体,定义字节顺序,好处是性能高,缺点是兼容性和调试不方便。这个可以根据应用场景灵活选择,如果您的应用相对稳定,需求变化少,性能要求高,则可以使用Code加结构体的方式。如果您的应用需要不停的扩充功能,但是对性能要求不苛刻,则可以使用文本解析的方式。这两种协议有两个比较典型的应用场景,Code加结构体更多应用在中间件上,因为协议的封装都是透明的,不需要联调,而且性能要求较高;文本解析则更多应用在外部交互上,如和设备、手机通讯,需要联调,但是性能要求没那么高。

    我们Demo是采用文本解析的方式,具体可以根据应用灵活选择。

    定义协议有以下注意点(方便不同平台接入)。

    字节顺序

    不同硬件平台或操作系统下,字节顺序是不一致的,有的是高位在前,低位在后,有的则是低位在前。Windows是低位在前,高位在后,每个平台下都有函数实现字节转换。TCP/IP定义的字节顺序是高位在前、低位在后,可以使用IPAddress类的

            //
            // 摘要:
            //     将整数值由网络字节顺序转换为主机字节顺序。
            //
            // 参数:
            //   network:
            //     以网络字节顺序表示的要转换的数字。
            //
            // 返回结果:
            //     以主机字节顺序表示的整数值。
            [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
            public static int NetworkToHostOrder(int network);
            //
            // 摘要:
            //     将长值由网络字节顺序转换为主机字节顺序。
            //
            // 参数:
            //   network:
            //     以网络字节顺序表示的要转换的数字。
            //
            // 返回结果:
            //     以主机字节顺序表示的长值。
            [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
            public static long NetworkToHostOrder(long network);
            //
            // 摘要:
            //     将短值由网络字节顺序转换为主机字节顺序。
            //
            // 参数:
            //   network:
            //     以网络字节顺序表示的要转换的数字。
            //
            // 返回结果:
            //     以主机字节顺序表示的短值。
            [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
            public static short NetworkToHostOrder(short network);

    来实现网络字节顺序转为本地字节顺序,反之可以调用

            //
            // 摘要:
            //     将整数值由主机字节顺序转换为网络字节顺序。
            //
            // 参数:
            //   host:
            //     以主机字节顺序表示的要转换的数字。
            //
            // 返回结果:
            //     以网络字节顺序表示的整数值。
            public static int HostToNetworkOrder(int host);
            //
            // 摘要:
            //     将长值由主机字节顺序转换为网络字节顺序。
            //
            // 参数:
            //   host:
            //     以主机字节顺序表示的要转换的数字。
            //
            // 返回结果:
            //     以网络字节顺序表示的长值。
            public static long HostToNetworkOrder(long host);
            //
            // 摘要:
            //     将短值由主机字节顺序转换为网络字节顺序。
            //
            // 参数:
            //   host:
            //     以主机字节顺序表示的要转换的数字。
            //
            // 返回结果:
            //     以网络字节顺序表示的短值。
            public static short HostToNetworkOrder(short host);
    来实现本地字节顺序转为网络字节顺序。

    更流行的做法是使用网络字节顺序,这样规范统一。我们这里使用Windows字节顺序,即低位在前、高位在后,和网络字节顺序刚好相反。

    字符集

    字符集最合适的就是使用UTF-8,这个编码是免费的,对于某些不支持中文的嵌入式系统,全英文可以不需要转换就是UTF-8格式,对于跨平台具有优势。

    数据包格式

    Code加结构体、文本解析两种协议风格都是统一使用相同的数据包格式,即先发一个4字节的长度,后面跟着是内容,下一个也是先发一个4字节长度,接着是内容。结构体可以定义为文件流结构体,采用字节对齐。

    协议样本

    Active:检测连接(心跳包)

    客户端->服务器 { [Request] Command=Active } 服务器->客户端 { [Response] Command= Active Code= Error Code#错误码 Message=Message#如果出错,返回错误描述信息 }

  • 相关阅读:
    ASP.NET 使用 X509Certificate2 系统找不到指定的文件
    SQL2000中TOP后不能使用变量
    补丁生成与应用工具 V1.5.4
    检测到通信错误。正在使用的通信协议:"TCP/IP"。正在使用的通信API:"SOCKETS"。检测到错误的位置:""。检测到错误的通信函数:"gethostbyname"。协议特定的错误代码:"*"、"11004"、"*"。 SQLST
    CLR 无法从 COM 上下文 0x1a2740 转换为 COM 上下文 0x1a28b0,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作
    Chart 控件 for vs2008的安装
    SqlServer孤立用户解决——"因为该用户存在对象,所以不能删除该用户。"
    函数 replace 的参数 1 的数据类型 text 无效。
    安装SqlServer2000出现"有挂起的操作"提示的解决
    DB2、ORACLE SQL写法的主要区别
  • 原文地址:https://www.cnblogs.com/lvlaozf/p/7290873.html
Copyright © 2011-2022 走看看