C#高性能大容量SOCKET并发(八):通讯协议

简介: 原文:C#高性能大容量SOCKET并发(八):通讯协议 协议种类 开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能;一种是用Code加结构体,定义字节顺序,好处是性能高,缺点是兼容性和调试不方便。
原文: 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#如果出错,返回错误描述信息
}


DEMO下载地址:http://download.csdn.net/detail/sqldebug_fan/7467745
免责声明:此代码只是为了演示C#完成端口编程,仅用于学习和研究,切勿用于商业用途。水平有限,C#也属于初学,错误在所难免,欢迎指正和指导。邮箱地址:fansheng_hx@163.com。

目录
相关文章
|
1月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
8月前
|
缓存 安全 网络协议
socket是并发安全的吗 2
socket是并发安全的吗
190 0
|
4月前
|
JSON C# 图形学
【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
48 0
|
4月前
|
网络协议 Unix Linux
【Unity 3D】C#中Socket及TCP三次握手与四次挥手详解(超详细 图文解释)
【Unity 3D】C#中Socket及TCP三次握手与四次挥手详解(超详细 图文解释)
42 0
|
7月前
|
网络协议 安全 API
C# Socket网络编程精华篇
C# Socket网络编程精华篇
|
8月前
|
安全 网络协议 Linux
socket是并发安全的吗 1
socket是并发安全的吗
94 0
|
缓存 负载均衡 网络协议
【Socket】两种高效事件处理模式&并发模式
【Socket】两种高效事件处理模式&并发模式
|
11月前
|
存储 开发框架 安全
在 C# 中使用 Span<T> 和 Memory<T> 编写高性能代码
在 C# 中使用 Span 和 Memory 编写高性能代码 .NET 中支持的内存类型 .NET Core 2.1 中新增的类型 访问连续内存: Span 和 Memory Span 介绍 C# 中的 Span Span 和 Arrays Span 和 ReadOnlySpan Memory 入门 ReadOnlyMemory Span 和 Memory 的优势 连续和非连续内存缓冲区 不连续的缓冲区: ReadOnly 序列 实际场景 Benchmarking 基准测试 安装 NuGet 包 Benchmarking Span 执行基准测试 解读基准测试结果 Span 限制 结论
255 0
|
PHP
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
359 0
|
监控 网络协议 NoSQL
socket&io高性能
最近看到篇好文章《IO多路复用》,记得早期学习时,也去探索过select、poll、epoll的区别,但后来也是没有及时记录总结,也忘记了,学习似乎就是在记忆与忘记中徘徊,最后在心中留下的火种,是熄灭还是燎原就看记忆与忘记间的博弈 socket与io一对兄弟,有socket地方必然有io,io数据也大多来源于socket,回顾这两方面的知识点,大致梳理一下
150 0
socket&io高性能