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