Lighttpd1.4.20源码分析 笔记 fdevent系统-事件处理

本文从server.c的main函数出发,深入解析Lighttpd1.4.20的fdevent系统。文章详细介绍了如何在初始化后将监听fd注册到fdevent系统,通过network_register_fdevents函数,以及如何处理监听和连接fd的IO事件。fdevent_register与fdevent_event_add函数在epoll机制下协同工作,当有连接请求时,监听fd仅监听FDEVENT_IN事件。在事件发生后,调用相应的handle_fdevent函数进行处理,如network_server_handle_fdevent和connection_handle_fdevent。整个过程展示了Lighttpd如何高效地处理连接请求并管理事件循环。
摘要由CSDN通过智能技术生成

我们仍然从server.c的main函数开始。

当完成fdevent的初始化之后,第一个需要fdevent处理的事情就是将在初始化网络的过程中得到的监听fd(socket函数的返回值)注册到fdevent系统中。

该动作调用的是network_register_fdevents()函数,定义在network.c文件中:

/**
 * 在fd events系统中注册监听socket。
 * 这个函数在子进程中被调用。
 */
 int network_register_fdevents(server * srv)
{
    size_t i;
    if (-1 == fdevent_reset(srv->ev)){
  return -1;}
    /*
     * register fdevents after reset
     */
    /* 遍历所有的监听fd并将其注册到fdevent系统中 */
    for (i = 0; i < srv->srv_sockets.used; i++)
    {
        server_socket *srv_socket = srv->srv_sockets.ptr[i];
        fdevent_register(srv->ev, srv_socket->fd, network_server_handle_fdevent, srv_socket);
        fdevent_event_add(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd, FDEVENT_IN);
    }
    return 0;
}

在初始化网络的过程中,调用socket函数之后,将其返回值(监听fd)保存在server结构体的srv_sockets成员中,这个成员是一个server_socket_array结构体,而server_socket_array结构体是server_socket结构体的指针数组。

server_socket结构体定义如下:

typedef struct
{
        sock_addr addr;           //socket fd对应的的地址。
         int fd;                     //socket()函数返回的监听fd
         int fde_ndx;                 //和fd相同。
         buffer *ssl_pemfile;
        buffer *ssl_ca_file;
        buffer *ssl_cipher_list;
        unsigned short ssl_use_sslv2;
        unsigned short use_ipv6;    //标记是否使用ipv6
         unsigned short is_ssl;
        buffer *srv_token;
#ifdef USE_OPENSSL
        SSL_CTX *ssl_ctx;
 #endif
        unsigned short is_proxy_ssl;
} server_socket;

fdevent_register()函数:

int fdevent_register(fdevents * ev, int fd, fdevent_handler handler, void *ctx)
{
    /* 创建一个fdnode的实例,然后对其成员赋值 */
    fdnode *fdn;
    fdn = fdnode_init();
    fdn->handler = handler;
    fdn
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lighttpd是一个轻量级的HTTP服务器,它的源码经过分析可以帮助我们更好地理解其工作原理和性能优化策略。 lighttpd源码分析可以从以下几个方面展开: 1. 架构设计:lighttpd源码分析可以帮助我们理解其整体架构设计。lighttpd采用多进程模型,其中一个主进程负责管理工作进程,并监听网络请求。工作进程负责处理具体的客户端请求。通过分析源码,我们可以了解到lighttpd是如何设计和组织这些进程的,以及它们之间的交互方式。 2. 模块系统lighttpd的模块系统是其核心特性之一,它提供了丰富的功能扩展能力。通过分析源码,我们可以深入了解模块系统的实现原理,包括模块的加载和初始化过程,以及模块之间的通信方式。这对于开发者来说,可以帮助我们更好地编写自己的lighttpd模块。 3. 请求处理:lighttpd源码分析可以帮助我们了解请求的处理过程。它包括针对不同类型请求的解析和处理,如静态文件请求、动态脚本请求等。通过分析源码,我们可以了解到lighttpd是如何解析和处理这些请求的,以及如何提供高性能的请求处理能力。 4. 性能优化策略:lighttpd作为一个高性能的HTTP服务器,其源码中蕴含了一些优化策略。通过分析源码,我们可以学习这些策略,并从中借鉴一些优化技巧。这对于我们开发其他高性能服务器或优化现有服务器的性能都有一定的参考价值。 综上所述,lighttpd源码分析可以帮助我们更好地理解其工作原理和性能优化策略,从而提高我们的开发能力和工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值