首页 > 代码库 > lighttpd为什么要accept多次呢
lighttpd为什么要accept多次呢
在lighttpd网络模型里面我们可以看到以下代码
1 /* accept()s at most 100 connections directly 2 * 3 * we jump out after 100 to give the waiting connections a chance */ 4 for (loops = 0; loops < 100 && NULL != (con = connection_accept(srv, srv_socket)); loops++) { 5 handler_t r; 6 7 connection_state_machine(srv, con); 8 9 switch(r = plugins_call_handle_joblist(srv, con)) {10 case HANDLER_FINISHED:11 case HANDLER_GO_ON:12 break;13 default:14 log_error_write(srv, __FILE__, __LINE__, "d", r);15 break;16 }17 }18 return HANDLER_GO_ON;
顾名思义,当有连接来的时候,从select多路复用,但是我们处理连接的时候,我们不知道事件的来源和次数,所以要循环好、判断,我的猜测是这样的
下面来证明 这段代码是来自unix网络编程的sleect模型的服务端
1 for ( ; ; ) { 2 rset = allset; /* structure assignment */ 3 nready = Select(maxfd+1, &rset, NULL, NULL, NULL); 4 5 if (FD_ISSET(listenfd, &rset)) { /* new client connection */ 6 clilen = sizeof(cliaddr); 7 connfd = Accept(listenfd, (SA *) &cliaddr, &clilen); 8 9 10 printf("new client:1, fd %d\n",connfd);11 sleep(10);12 connfd1 = Accept(listenfd, (SA *) &cliaddr, &clilen);13 printf("new client:2, fd %d\n",connfd1);14 15 sleep(10); 16 return 0;
我们故意在中间停顿了10秒,好让更多的连接进来,
启动服务端
[root@fire-16-168 tcpcliserv]# ./tcpservselect01
同时在另外两个个shell下面输入
./tcpcli01 127.0.0.1
这时候我们可以看多服务端输出
new client:1, fd 4
new client:2, fd 5
呵呵,证明我们的猜想是对的
如果我们不accept多次,那么要等下一次select才能处理,一次一个请求,so,效率很低罗,如果多个用户进来的时候
lighttpd为什么要accept多次呢
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。