obsidian/笔记文件/2.笔记/开发IOCP高性能网络库_第一章.md
2025-03-26 00:02:56 +08:00

5.0 KiB
Raw Permalink Blame History

定义参考IOCPNet网络库开发 因为这俩项目是对应dll程序集服务器端和unity客户端都会使用到 需要先检查一下IOCP对应的Protocol协议类核心net逻辑对应的输出路径不是一个空路径 右键其一,另一同理;

!Pasted image 20240417164308.png

!Pasted image 20240417165004.png

!Pasted image 20240417164942.png

打开unity客户端之前已经生成所在位置

!Pasted image 20240417165053.png

可Serializable序列化IOCP通信协议抽象基类

!Pasted image 20240417165146.png

与之对应的继承协议类NetMsg只有一个string字符用作测试

!Pasted image 20240417165212.png

IOCP通信核心net逻辑中通用工具类PackLenInfo接口是打包网络消息包体的具体逻辑 其中IOCP还是通过tcp网络协议进行通信的所以头部长度的还是4即可完成消息包pkg的构建

!Pasted image 20240417165551.png

接受到消息后SplitLogicBytes函数接口是用来解析包体的消息包的头部长度4索引之后调用Buffer.BlockCopy完成,字节块的复制; 然后再对通过ref关键字传递进来的bytesLst数据容器进行RemoveRange对应索引的数据移除清理参考out和ref之间的区别

!Pasted image 20240417170012.png

序列化、解序列化对应的Serialize、DeSerialize函数接口

!Pasted image 20240417170500.png

枚举对应的是不同的log打印颜色

!Pasted image 20240417170603.png

对应打印颜色的ConsoleLog打印函数接口

!Pasted image 20240417170619.png

继续none的话调用原生Console.WriteLine即可

!Pasted image 20240417170647.png

几种log的Action回调普通Log颜色ColorLog

!Pasted image 20240417170724.png

警告Warn打印对应yellow黄色错误Error打印对应Red红色

!Pasted image 20240417170757.png

连接对话Token服务器和客户端有一个共同的基类先弄一个TokenState枚举标识连接的状态

!Pasted image 20240417171031.png

基类的具体逻辑声明一个int整型tokenID、还有俩SocketAsyncEventArgs异步连接rcvSAEA表示接受消息sndSAEA表示发送消息 skt变量表示一个基础的Socket网络连接可能是客户端也可能是服务器 readLst字节byte的List数据容器是用来存储接受读取数据 cacheQue缓存字节数组Queue队列容器是用来发送消息的有可能存着多条消息等待发送就需要先缓存 构造函数中完成收发消息的异步连接初始化它们的Complete完成回调加上都是IO_Completed这个函数接口然后设置一下rcvSAEA接收连接的数据容器大小是2048

!Pasted image 20240417171112.png

完成回调IO_Completed的具体逻辑是通过switch和case机制根据SocketAsyncOperation这个套接字的操作类型判断是调用ProcessRcv接收消息函数还是ProcessSend发送消息函数后续会解析这俩的具体逻辑

!Pasted image 20240418102830.png

对应的上层IOCPNet网络逻辑也包含一个IO_Completed函数接口 它是通过switch异步连接的LastOperation属性,调用不同的函数; 打断点可知开启服务器端后再开启客户端服务器的属性是Accept对应的逻辑客户端的属性是Connect逻辑

!Pasted image 20240417171855.png

!Pasted image 20240417172127.png

!Pasted image 20240417172159.png

!Pasted image 20240417172213.png

!Pasted image 20240417172230.png

关闭Token连接的是CloseToken函数接口修改TokenState枚举状态调用onTokenClose关闭函数回调清空各数据容器调用socket网络连接skt的内置Shutdown和Close函数即可

!Pasted image 20240417173533.png

Token中有三个抽象函数分别是连接、接受消息、断连

!Pasted image 20240417172607.png

客户端的Token重写这仨

!Pasted image 20240417172728.png

服务器的Token同理

!Pasted image 20240417172749.png

回到Token基类IOCPTokenProcessByteLst函数接口是用来接收、解码消息 调用的是工具类的SplitLogicBytes函数接口从读取信息容器readLst中拿到字节数组buff 再调用工具类的DeSerialize函数接口解序列化然后调用OnReceiveMsg打印接收到信息最后再递归调用自身

!Pasted image 20240417173036.png

它的上层调用是ProcessRcv函数接口通过SocketAsyncEventArgs.BytesTransferred 属性判断接收的字节是否大于0完成读取信息的数据容器readLst填充调用ProcessByteLst接收、解码消息 最后调用的StartAsyncRcv实际上是通过Socket.ReceiveAsync判断,负责接收消息的,SocketAsyncEventArgs异步连接rcvSAEA是否已完成功能 如果ReceiveAsync返回值为false就递归调用ProcessRcv函数自身继续接收消息

!Pasted image 20240417173326.png

!Pasted image 20240417173950.png