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

117 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

定义参考[[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]]