轻量web服务器开发日记08-connection_array结构体的实现

轻量web服务器开发日记中已经略有提及到connection结构体,现在我来详细介绍该结构体在antweb中所起的作用。
因为antweb是并发式处理所有用户的请求连接,所以必须使用请求连接集合来存放所有的连接,即connection_array结构体,而对于某个请求连接则对应着相应的connection结构体。antweb是使用单链表的方式把connection结构体连接起来组成connection_array。
(1)connection_array结构体主要由指向connection单链表指针和记录connection数目的字段组成:

typedef struct {
    connection *con;
    size_t connum;
}connection_array;

(2)服务器处理用户请求连接时,该连接的状态信息:

typedef enum {
    CON_STATE_WAIT,
    CON_STATE_READ_REQUEST,
    CON_STATE_HANDLE_REQUEST,
    CON_STATE_SENT_RESPONSE,
    CON_STATE_ERROR,
    CON_STATE_CLOSE
} connection_stat;

(3)connection结构体(代码中的注释说明该结构体的所记录的连接信息):

typedef struct con{
    int con_id;
    //请求信息
    request *rq;
    //响应信息
    response *rp;
    //已连接套接字
    int fd;
    //keepalive属性
    int keep_alive;
    //连接状态 
    connection_stat con_stat;
    //时间计算器
    int time_count;
    //指向下一个连接
    struct con *next;
}connection;

(4)当服务器处理完一个请求连接后,若该连接是一次服务特性的,便要释放该连接:

void connection_free(mempool *mpool,connection_array *cons,connection *con)
{
    connection *ctemp;
    request_free(mpool,con->rq);
    response_free(mpool,con->rp);
    ctemp = cons->con;
    if(ctemp->fd==con->fd)
    {
        cons->con = con->next;
    }
    else
    {
        for(;;)
        {
            if(ctemp->next->fd == con->fd)
            {
                ctemp->next = con->next;
                break;
            }
            ctemp = ctemp->next;
        }
    }
    cons->connum --;
    free(con);
}

(5)当服务器处理完一个请求连接后,若该连接是永久连接特性的,便要重设该连接:

void connection_reset(mempool *mpool,connection *con)
{
    request_free(mpool,con->rq);
    response_free(mpool,con->rp);
    con->con_stat = CON_STATE_WAIT;
    con->time_count = 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值