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#如果出错,返回错误描述信息 }
C#高性能大容量SOCKET并发(八):通讯协议的更多相关文章
- C#高性能大容量SOCKET并发(七):协议字符集
原文:C#高性能大容量SOCKET并发(七):协议字符集 UTF-8 UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 362 ...
- C#高性能大容量SOCKET并发(转)
C#高性能大容量SOCKET并发(零):代码结构说明 C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍 C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs ...
- C#高性能大容量SOCKET并发(零):代码结构说明
原文:C#高性能大容量SOCKET并发(零):代码结构说明 C#版完成端口具有以下特点: 连接在线管理(提供在线连接维护,连接会话管理,数据接收,连接断开等相关事件跟踪): 发送数据智能合并(组件会根 ...
- C#高性能大容量SOCKET并发(九):断点续传
原文:C#高性能大容量SOCKET并发(九):断点续传 上传断点续传 断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1:下载开始的时候 ...
- C#高性能大容量SOCKET并发(五):粘包、分包、解包
原文:C#高性能大容量SOCKET并发(五):粘包.分包.解包 粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一 ...
- C#高性能大容量SOCKET并发(十一):编写上传客户端
原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...
- C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...
- C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包
原文:C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包 守护线程 在服务端版Socket编程需要处理长时间没有发送数据的Socket,需要在超时多长时间后断开连接,我们 ...
- C#高性能大容量SOCKET并发(三):接收、发送
原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...
- C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装
原文:C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装 1.SocketAsyncEventArgs介绍 SocketAsyncEventArgs是微软提供的高性能 ...
随机推荐
- CentOS7 添加端口
首先要知道CentOS 7 采用了 firewalld 防火墙,而在linux中其他版本大多是通过编辑iptables的配置文件来修改. 1.添加9000端口 # firewall-cmd --add ...
- udev实现热插拔
一.UDEV是什么? Udev是一个针对Linux内核2.6的可提供自动创建的设备节点和命名的解决方法的一个文件系统:其实与/etc/目录下的fstab文件类似 二.Udev如何获取内核这些模块的变化 ...
- 了解adb的基本原理
ADB就是Android调试桥的意思,很形象.但不知道是windows本身的原因还是windows乱七八糟软件太多,用USB调试手机时,经常连不上ADB,或者就出现offline,导致费时费力,焦头烂 ...
- 认识Java中的字符串
Java 中 String 类的常用方法 Ⅰ String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等,下面我们就来领略它的强大之 ...
- BZOJ 2823: [AHOI2012]信号塔
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2823 随机增量法.不断加点维护圆,主要是三点共圆那里打得烦(其实也就是个两中垂线求交点+联立方 ...
- BZOJ3916: [Baltic2014]friends
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3916 复习一下hash(然后被傻叉错误卡了半天TAT... 取出一个字串:h[r]-h[l-1 ...
- Centos7环境搭建lnmp环境
[原创]编译安装lnmp环境 准备软件:nginx1.10.3+php-5.5.12+mariadb10.0.8(数据库在此使用的yum安装) 如果需要编译安装的可以给我留言,我后续再发布出来! 依赖 ...
- C语言函数的作用域规则
“语言的作用域规则”是一组确定一部分代码是否“可见”或可访问另一部分代码和数据的规则. “同一函数中,不同的结构体成员名能相同,当变量处于不同的作用域时,名称可以相同. 注:作用域,其对象是变量, ...
- 搭建ruby环境
- [国嵌笔记][021-022][ARM处理器工作模式]
[ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Superviso ...