网站大量收购独家精品文档,联系QQ:2885784924

lighttpd1.4.18代码分析(八).doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
lighttpd1.4.18代码分析(八).doc

  lighttpd1.4.18代码分析(八)   今天继续沿着状态转换序列图讲解状态机,这次到了CON_STATE_READ状态, 首先看看connection_state_machine函数部分的代码:         // 读                     case CON_STATE_READ_POST:         case CON_STATE_READ:             if (srv-gt;srvconf.log_state_handling) {                 log_error_p;toread)) {         log_error_mediately available for reading.         if (errno == EAGAIN)             return 0;         if (errno == EINTR) {             /* we have been interrupted before we could read */             con-gt;is_readable = 1;             return 0;         }         if (errno != ECONNRESET) {             /* expected for keep-alive */             log_error_write(srv, __FILE__, __LINE__, ssd, connection closed - read failed 12345下一页 ....,。: , strerror(errno), errno);         }         connection_set_state(srv, con, CON_STATE_ERROR);         return -1;     } else if (len == 0) {         // 当读入数据 = 0时 表示对端关闭了连接         con-gt;is_readable = 0;         /* the other end close the connection -gt; KEEP-ALIVE */         /* pipelining */         return -2;     } else if ((size_t)len lt; b-gt;size - 1) {         /* p_packet(b-gt;ptr, len); #endif     return 0; }   简单的说, 该函数首先调用ioctl获取fd对应的缓冲区中有多少可读的数据, 然后调用chunkqueue_get_append_buffer和buffer_prepare_copy函数准备好所需的缓冲区, 准备好缓冲区之后, 调用read函数读取缓冲区中的数据.对read函数的调用结果进行区分, 小于0表示出错, 返回-1;等于0表示关闭了连接, 返回-2;假如读取的数据长度比预期的小, 那么就等待下一次继续读数据, 最后将已经读入的数据缓冲区最后一个字节置#39;#39;,返回0.   继续回到函数connection_handle_read_state中, 看接下来的代码:     // 这一段循环代码用于更新read chunk队列,没有使用的chunk都归入未使用chunk链中     /* the last chunk might be empty */     for (c = cq-gt;first; c;) {         if (cq-gt;first == c c-gt;mem-gt;used == 0) {             // 如果第一个chunk是空的并且没有使用过             /* the first node is empty */             /*  and it is empty, move it to unused */             // 则chunk队列的第一个chunk为下一个chunk             cq-gt;first = c-gt;next;             // 第一个chunk为NULL, 那么最后一个chunk为NULL             if (cq-gt;first == NULL)                 cq-gt;last = NULL;             // 更新ch

文档评论(0)

ggkkppp + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档