lighttpd为什么要accept多次呢

时间:2023-12-25 16:52:31

在lighttpd网络模型里面我们可以看到以下代码

 /* accept()s at most 100 connections directly
*
* we jump out after 100 to give the waiting connections a chance */
for (loops = ; loops < && NULL != (con = connection_accept(srv, srv_socket)); loops++) {
handler_t r; connection_state_machine(srv, con); switch(r = plugins_call_handle_joblist(srv, con)) {
case HANDLER_FINISHED:
case HANDLER_GO_ON:
break;
default:
log_error_write(srv, __FILE__, __LINE__, "d", r);
break;
}
}
return HANDLER_GO_ON;

顾名思义,当有连接来的时候,从select多路复用,但是我们处理连接的时候,我们不知道事件的来源和次数,所以要循环好、判断,我的猜测是这样的

下面来证明  这段代码是来自unix网络编程的sleect模型的服务端

  for ( ; ; ) {
rset = allset; /* structure assignment */
nready = Select(maxfd+, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)) { /* new client connection */
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen); printf("new client:1, fd %d\n",connfd);
sleep();
connfd1 = Accept(listenfd, (SA *) &cliaddr, &clilen);
printf("new client:2, fd %d\n",connfd1); sleep();
return ;

我们故意在中间停顿了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,效率很低罗,如果多个用户进来的时候