当客户端连接到服务器时,会调用acceptTcpHandler处理函数,服务器会为每个链接创建一个client对象,并创建相应文件事件,监听此链接fd的可读事件,并指定事件处理函数
aeFileProc函数指针定义如下:
typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);
在c语言中,回调是通过函数指针实现的。 通过将回调函数地址 传递给 被调函数,从而实现回调。在这里,通过定义函数指针aeFileProc,由调用方实现具体的函数内容,在实际调用函数里,把aeFileProc实现函数的地址传进来。其实相当于定义一种接口,由调用方来实现该接口
anetTcpServer,建立网络套接字服务器,完成对socket(),bind(),listen()等操作的封装,返回socket的fd。
int flags;
/* 设置为非阻塞*/
if (fcntl(socket_descriptor, F_SETFL, flags | O_NONBLOCK) < 0)
{
/* Handle error */
}
/* 设置为阻塞 */
if ((flags = fcntl(sock_descriptor, F_GETFL, 0)) < 0)
{
/* Handle error */
}
serverCron是redis里主要的定时处理函数,在initServer中通过调用aeCreateTimeEvent,将serverCron做为callback注册到全局的eventLoop结构当中。
//文件可读写事件 typedef structaeFileEvent { int mask; //触发条件:读、写 aeFileProc*rfileProc; //当fd可读时执行的事件(accept,read) aeFileProc *wfileProc; //当fd可写时执行的事件(write) void*clientData; //caller 传入的数据指针 } aeFileEvent;