- 论坛徽章:
- 0
|
本帖最后由 1210603696 于 2013-10-09 13:03 编辑
最近学习了linux 的epoll,想利用epoll写一个web服务器作为练习。
我的tinyhttp的总体架构是:主线程利用epoll监听listenfd和connfd,当有客户连接到达时将这个connfd加入到epoll的监听队列中。当connfd可读时new一个线程来处理这个connfd同时在主线程中将这个connfd从epoll监听队列中删去,在new出的线程中read客户请求,同时为了支持HTTP1.1持续连接我打算在new出来的线程中新建另一个epoll专门来监听这个connfd如果超时则关闭这个连接。
主线程核心代码:- for(;;)
- {
- //无限等待直到有描述符就绪
- nfds = tyhp_epoll_wait(epollfd, events, MAX_EVENTS, -1);
- //若tyhp_epoll_wait被中断则重新调用该函数
- if(nfds == -1 && errno == EINTR)
- continue;
-
- for(int n = 0; n != nfds; ++n)
- {
- //处理监听套接字触发的事件
- if(events[n].data.fd == listen_fd)
- {
- conn_sock = tyhp_accept(listen_fd, (struct sockaddr*)&client_addr, &addrlen);
- //设置新链接上的套接字为非阻塞模式
- tyhp_set_nonblocking(conn_sock);
- //设置读事件和ET模式
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = conn_sock;
- //将监听事件加入epoll中
- tyhp_epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev);
- }
- else
- {
- epollfd_connfd.epollfd = epollfd;
- epollfd_connfd.connfd = events[n].data.fd;
- ev.data.fd = conn_sock;
- //epoll不再监听这个客户端套接字
- tyhp_epoll_ctl(epollfd, EPOLL_CTL_DEL, conn_sock, &ev);
- //处理链接,connfd由线程监听,epoll_wait默认设置4分钟超时
- pthread_create(&tid, NULL, &tyhp_thread_func, (void*)&epollfd_connfd);
- //tyhp_thread_func((void*)&epollfd_connfd);
- //close(conn_sock);
- }
复制代码 请问大家我的这个设计怎么样,我想到的问题是每次new一个线程很消耗性能因此我打算替换成线程池,不过程序其他地方应该还有很大的改进空间,希望大家不吝赐教~~~ |
|