obsidian/笔记文件/2.笔记/开发IOCP高性能网络库_第二章.md

52 lines
3.5 KiB
Markdown
Raw Permalink Normal View History

2025-03-26 00:02:56 +08:00
连接体IOCPToken里还有俩SendMsg的函数
其中第一个把msg的网络包通过IOCPTool工具类的Serialize函数接口完成序列化和PackLenInfo函数接口打包tcp网络消息包变成字节数组bytes再传参到重载的第二个SendMsg函数接口中
第二个SendMsg函数接口是通过isWrite这个布尔判断是否要把发送的字节数组消息写入到cacheQue队列容器中
然后,使用[[Socket.SendAsync]]的异步发送接口,判断[[SocketAsyncEventArgs]]类的异步发送套接字sndSAEA状态如果为false就调用ProcessSend函数接口完成消息发送即可
![[Pasted image 20240418101825.png]]
ProcessSend函数接口是最终发送网络消息的逻辑体它会从cacheQue队列容器使用Dequeue内置出队接口拿到最新塞进队列的消息体调用SendMsg完成发送即可
![[Pasted image 20240418102538.png]]
回顾一下token连接的收发逻辑都是在IO_Completed中完成switch case的相关调用对应也是加到了[[SocketAsyncEventArgs]]异步套接字 rcvSAEA 和 sndSAEA 中
![[Pasted image 20240418103151.png]]
![[Pasted image 20240418103321.png]]
外部调用的InitToken函数接口就是token连接的初始化操作对应逻辑完成OnConnected的连接后调用StartAsyncRcv函数接口异步接送消息即可
![[Pasted image 20240418103504.png]]
IOCPToken的连接会使用一个Stack栈结构的IOCPTokenPool缓存池进行统一管理
后续会使用在服务器连接客户端token的时候统一管理连接的客户端不需要在运行时候多次创建而是从缓存池里提取token即可
IOCPTokenPool构造函数就是完成T泛型Stack栈的实例化其中传参capacity是实例化出来的栈对应的容量大小
Pop函数确保线程安全[[lock]]栈容器然后调用Stack内置的Pop函数提取栈顶的元素
Push函数也是确保线程安全[[lock]]再调用Stack内置的Push函数塞新数据入栈即可
![[Pasted image 20240418103714.png]]
IOCPNet是网络库的核心逻辑整合会调用之前解析的其他逻辑模块
声明一个Socket连接套接字skt、还有一个异步网络连接[[SocketAsyncEventArgs]]变量saea
在构造函数中完成saea的初始化和完成回调绑定
![[Pasted image 20240418104822.png]]
回顾一下完成回调IO_Completed的具体逻辑是根据[[LastOperation]]套接字类型,调用不同函数,其中,服务器会调用 ProcessAccept函数逻辑、客户端会调用 ProcessConnect函数逻辑后续会解析两者
![[Pasted image 20240418105120.png]]
IOCPNet网络库的逻辑结构体有俩region区分客户端Client和服务端Server
![[Pasted image 20240418105305.png]]
先解析Client客户端的具体逻辑
StartAsClient函数接口就是外部调用的开启一个tcp的客户端的逻辑传参包括ip地址和port端口完成socket网络套接字的初始化、构建然后调用StartConnect函数接口开始构建异步连接
使用的是[[Socket.ConnectAsync]]对远程主机异步连接请求返回值suspend为false的时候说明连接成功建立调用ProcessConnect函数接口开始初始化客户端的Token连接调用对应的InitToken函数接口即可
![[Pasted image 20240418105409.png]]
关闭客户端的ClosetClient函数接口也是调用token连接的CloseToken函数接口即可
![[Pasted image 20240418110002.png]]