轻量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;
}