mongoose源码分析系列之active_connections

本文详细分析了mongoose中的active_connections管理,包括结构体定义、变量初始化、链表添加与移除、轮询处理及close_conn函数在不同标记下的行为。深入探讨了accept连接、检查ACL、conn结构体的分配以及设置socket属性等关键步骤。
摘要由CSDN通过智能技术生成

1. 所在的结构体定义

struct mg_server {
  sock_t listening_sock;
  union socket_address lsa;   // Listening socket address
    struct ll active_connections;
  struct ll uri_handlers;
  char *config_options[NUM_OPTIONS];
  void *server_data;
  void *ssl_ctx;    // SSL context
  sock_t ctl[2];    // Control socketpair. Used to wake up from select() call
};
active_connections是一个双向循环链表:
struct ll { struct ll *prev, *next; };

2. 变量初始化

mg_create_server函数:
    LINKED_LIST_INIT(&server->active_connections);
#define LINKED_LIST_INIT(N)  ((N)->next = (N)->prev = (N))

3. 向链表中添加元素

accept_new_connection函数
该函数又是一个高级的if else if else的写法,作者的意图操作是:
  • if(执行一个语句并判断)
  • else if(再执行一个语句并判断) {异常处理}
  • else if(再执行一个语句并判断) {异常处理}
  • else {最终执行一些操作}
这里的厉害之处就在于:
每次if或者else if执行完语句后,故意让预期表达式为false,同而可以执行下一个分支,这样正常情况下,上面的三个if或else if判断中的表达式都会执行到,同时保证最终进入到else中完成所有的处理。

下面来分析函数的具体作用:
  • sock = accept(server->listening_sock, &sa.sa, &len)    accept一个连接
  • check_acl(server->config_options[ACCESS_CONTROL_LIST], ntohl(* (uint32_t *) &sa.sin.sin_addr)   检查连接不是acl ACCESS_CONTROL_LIST
  • conn = (struct connection *) calloc(1, sizeof(*conn))    calloc一个struct connection大小的空间,将指针赋给conn
  • set_close_on_exec(sock); and set_non_blockin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值