ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

hiredis window之RFDMap

hiredis window之RFDMap

简介

RFDMap用于将socket分配映射成连续的文件描述符,同时管理回收的文件描述符,因为ae构架中管理fd与对应事件处理器使用的是数据,fd作为数组下标

结构

RFDMap
- map<SOCKET, RFD> SocketToRFDMap
- map<int, RFD> CrtFDToRFDMap
- map<RFD, SocketInfo> RFDToSocketInfoMap
- map<RFD, int> RFDToCrtFDMap
- queue<RFD> RFDRecyclePool
+RFD addSocket(SOCKET socket)
+void removeSocketToRFD(SOCKET socket)
+void removeRFDToSocketInfo(RFD rfd)
+RFD addCrtFD(int crt_fd)
+void removeCrtFD(int crt_fd)
+SOCKET lookupSocket(RFD rfd)
+SocketInfo* lookupSocketInfo(RFD rfd)
+int lookupCrtFD(RFD rfd)
SocketInfo
+ SOCKET socket
+ void* state
+ int flags
+ SOCKADDR_STORAGE socketAddrStorage
iocpSockState
+ int masks
+ int fd
+ aacceptreq *reqs
+ int wreqs
+ OVERLAPPED ov_read
+ list wreqlist
+ int unknownComplete

其中state为iocpSockState
ov_read:iocp中处理连接 的

接口转换

与原生socket相关的接口转成与rfd操作的。其是通过Win32_FDSockMap来转换的

class Win32_FDSockMap {
public:static Win32_FDSockMap& getInstance() {static Win32_FDSockMap instance; // Instantiated on first use. Guaranteed to be destroyed.return instance;}private:Win32_FDSockMap() {InitWinsock();accept = FDAPI_accept;access = FDAPI_access;bind = FDAPI_bind;connect = FDAPI_connect;fcntl = FDAPI_fcntl;freeaddrinfo = FDAPI_freeaddrinfo;fsync = FDAPI_fsync;ftruncate = FDAPI_ftruncate;getaddrinfo = FDAPI_getaddrinfo;getsockopt = FDAPI_getsockopt;getpeername = FDAPI_getpeername;getsockname = FDAPI_getsockname;htonl = FDAPI_htonl;htons = FDAPI_htons;inet_ntop = FDAPI_inet_ntop;inet_pton = FDAPI_inet_pton;isatty = FDAPI_isatty;listen = FDAPI_listen;lseek64 = FDAPI_lseek64;ntohl = FDAPI_ntohl;ntohs = FDAPI_ntohs;open = FDAPI_open;pipe = FDAPI_pipe;poll = FDAPI_poll;read = FDAPI_read;select = FDAPI_select;setsockopt = FDAPI_setsockopt;socket = FDAPI_socket;write = FDAPI_write;}~Win32_FDSockMap() {CleanupWinsock();}Win32_FDSockMap(Win32_FDSockMap const&);    // Don't implement to guarantee singleton semanticsvoid operator=(Win32_FDSockMap const&);     // Don't implement to guarantee singleton semantics
};

通过全局单例完成 Win32_FDSockMap 的初始化

static class Win32_FDSockMap& init = Win32_FDSockMap::getInstance();
返回列表