01 //epoll_wait范围之后应该是一个循环,遍利所有的事件:
02 for (n = 0; n < nfds; ++n)
03 {
04 if (events[n].data.fd == listener)
05 {//如果是主socket的事件的话,则表示有新连接进入了,进行新连接的处理。
06 client = accept (listener, (struct sockaddr *) &local, &addrlen);
07 if (client < 0)
08 {
09 perror ("accept");
10 continue;
11 }
12 setnonblocking (client); // 将新连接置于非阻塞模式
13 ev.events = EPOLLIN | EPOLLET; // 并且将新连接也加入EPOLL的监听队列。
14 //注意,这里的参数EPOLLIN | EPOLLET并没有设置对写socket的监听,
15 //如果有写操作的话,这个时候epoll是不会返回事件的,
16 //如果要对写操作也监听的话,应该是EPOLLIN | EPOLLOUT | EPOLLET
17 ev.data.fd = client;
18 if (epoll_ctl (kdpfd, EPOLL_CTL_ADD, client, &ev) < 0)
19 {
20 /*
21 设置好event之后,将这个新的event通过epoll_ctl加入到epoll的监听队列里面,
22 这里用EPOLL_CTL_ADD来加一个新的epoll事件,通过EPOLL_CTL_DEL来减少一个epoll事件,通
23 过EPOLL_CTL_MOD来改变一个事件的监听方式.
24 */
25 fprintf (stderr, "epoll set insertion error: fd=%d", client);
26 return -1;
27 }
28 }
29 else // 如果不是主socket的事件的话,则代表是一个用户socket的事件,
30 do_use_fd (events[n].data.fd); //则来处理这个用户socket的事情,比如说read(fd,xxx)之类的,或者一些其他的处理。
31 }
01 while (TRUE)
02 {
03 int nfds = epoll_wait (m_epoll_fd, m_events, MAX_EVENTS,EPOLL_TIME_OUT); //等待EPOLL时间的发生,相当于监听,
04 //至于相关的端口,需要在初始化EPOLL的时候绑定。
05 if (nfds <= 0)
06 continue;
07 m_bOnTimeChecking = FALSE;
08 G_CurTime = time (NULL);
09 for (int i = 0; i < nfds; i++)
10 {
11 try
12 {
13 if (m_events[i].data.fd == m_listen_http_fd) //如果新监测到一个HTTP用户连接到绑定的HTTP端口,
14 //建立新的连接。由于我们新采用了SOCKET连接,所以基本没用。
15 {
16 OnAcceptHttpEpoll ();
17 }
18 else if (m_events[i].data.fd == m_listen_sock_fd) //如果新监测到一个SOCKET用户连接到了绑定的SOCKET端口,
19 //建立新的连接。
20 {
21 OnAcceptSockEpoll ();
22 }
23 else if (m_events[i].events & EPOLLIN) //如果是已经连接的用户,并且收到数据,那么进行读入。
24 {
25 OnReadEpoll (i);
26 }
27
28 OnWriteEpoll (i); //查看当前的活动连接是否有需要写出的数据。
29 }
30 catch (int)
31 {
32 PRINTF ("CATCH捕获错误\n");
33 continue;
34 }
35 }
36 m_bOnTimeChecking = TRUE;
37 OnTimer (); //进行一些定时的操作,主要就是删除一些短线用户等。
38 }