- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
lighttpd1.4.18代码分析(六).doc
lighttpd1.4.18代码分析(六)
现在开始讲解lighttpd如何处理连接fd.
在第四节,已经讲解了如何处理服务器负责监听连接的fd,处理连接fd的流程在前半部分与监听fd大体相同:在通过监听fd接收一个新的连接之后,服务器将这个fd加入到事件处理器中, 设置它所感兴趣的IO事件类型, 当IO状态发生变化时, 事件处理器获取被触发的fd,回调函数,事件等,然后通过已经注册的回调函数进行处理.
这里的区别就在于回调函数的不同上.对于监听fd而言, 该回调函数是p; FDEVENT_IN) {
con-gt;is_readable = 1;
}
// 可写
if (revents FDEVENT_OUT) {
con-gt;is_p; ~(FDEVENT_IN | FDEVENT_OUT)) {
/* looks like an error */
/* FIXME: revents = 0x19 still means that the queue */
if (revents FDEVENT_HUP) {
if (con-gt;state == CON_STATE_CLOSE) {
con-gt;close_timeout_ts = 0;
} else {
/* sigio reports the p; FDEVENT_ERR) {
#ifndef USE_LINUX_SIGIO
log_error_p;
!chunk
1234下一页 ....,。queue_is_empty(con-gt;p;
con-gt;is_p;b)) {
log_error_eout_ts = 0;
}
}
return HANDLER_FINISHED;
}
在结构体connection,也就是保存连接相关数据的结构体中, 有一个叫state的成员, 顾名思义, 这个成员保存的是一个连接的状态,这里所说的状态与前面提到的IO状态是不同, IO状态是用于表示一个fd可读/可写/出错等, 而这个状态更多的是与协议相关的部分.它是一个枚举类型:
/* cessed
* read before {
CON_STATE_CONNECT, // 连接
CON_STATE_REQUEST_START, // 开始获取请求
CON_STATE_READ, // 处理读
CON_STATE_REQUEST_END, // 请求结束
CON_STATE_READ_POST, // 处理读,但是是POST过来的数据
CON_STATE_HANDLE_REQUEST, // 处理请求
CON_STATE_RESPONSE_START, // 开始回复
CON_STATE_WRITE, // 处理写
CON_STATE_RESPONSE_END, // 回复结束
CON_STATE_ERROR, // 出错
CON_STATE_CLOSE // 连接关闭
} connection_state_t;
为什么需要这些状态?因为ligtrac/wiki/Docs%3AInternalHTTPStates
现在回到本章的主题中, lighttpd如何处理连接fd.
前面给出的处理连接fd的回调函数,最开始地方有一段代码:
joblist_append(srv, con);
这个函数将一个连接connection结构体放入到joblist中, 后面的部分根据不同的情况设置connection中的state字段,调用的是connection_set_state函数.
现在回到server.c函数中, 第四节中已经结合处理监听fd的流程讲解了这段函数:
// 轮询FD
if ((n = fdevent_poll(sr
上一页1234下一页 ....,。v-gt;ev, 1000)) gt; 0) {
文档评论(0)