免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5796 | 回复: 11
打印 上一主题 下一主题

[C] 大家看看我写的tinyhttp服务器架构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-09 13:03 |只看该作者 |倒序浏览
本帖最后由 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如果超时则关闭这个连接。

主线程核心代码:
  1. for(;;)
  2.         {
  3.                 //无限等待直到有描述符就绪
  4.                 nfds = tyhp_epoll_wait(epollfd, events, MAX_EVENTS, -1);
  5.                 //若tyhp_epoll_wait被中断则重新调用该函数
  6.                 if(nfds == -1 && errno == EINTR)
  7.                         continue;
  8.                        
  9.                 for(int n = 0; n != nfds; ++n)
  10.                 {
  11.                         //处理监听套接字触发的事件
  12.                         if(events[n].data.fd == listen_fd)
  13.                         {
  14.                                 conn_sock = tyhp_accept(listen_fd, (struct sockaddr*)&client_addr, &addrlen);
  15.                                 //设置新链接上的套接字为非阻塞模式
  16.                                 tyhp_set_nonblocking(conn_sock);
  17.                                 //设置读事件和ET模式
  18.                                 ev.events = EPOLLIN | EPOLLET;
  19.                                 ev.data.fd = conn_sock;
  20.                                 //将监听事件加入epoll中
  21.                                 tyhp_epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev);
  22.                         }
  23.                         else
  24.                         {
  25.                                 epollfd_connfd.epollfd = epollfd;
  26.                                 epollfd_connfd.connfd = events[n].data.fd;
  27.                                 ev.data.fd = conn_sock;
  28.                                 //epoll不再监听这个客户端套接字
  29.                                 tyhp_epoll_ctl(epollfd, EPOLL_CTL_DEL, conn_sock, &ev);
  30.                                 //处理链接,connfd由线程监听,epoll_wait默认设置4分钟超时
  31.                                 pthread_create(&tid, NULL, &tyhp_thread_func, (void*)&epollfd_connfd);
  32.                                 //tyhp_thread_func((void*)&epollfd_connfd);
  33.                                 //close(conn_sock);
  34.                         }
复制代码
请问大家我的这个设计怎么样,我想到的问题是每次new一个线程很消耗性能因此我打算替换成线程池,不过程序其他地方应该还有很大的改进空间,希望大家不吝赐教~~~

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2013-10-09 13:17 |只看该作者
做Web服务器, 主要是可配置性和分析字符串(要快, 尽可能快, 原因你懂的),及有效地内存利用,支持CGI比较麻烦。
其它和一般程序没区别。
用它练手也可以, 因为毕竟连客户端都不用写了。

论坛徽章:
0
3 [报告]
发表于 2013-10-09 13:24 |只看该作者
回复 2# folklore


嗯嗯 我主要是想练手epoll,练完后看一下那个C10K问题。 我都是用telnet测试我的tinyhttp的

论坛徽章:
0
4 [报告]
发表于 2013-10-09 15:29 |只看该作者
呜呜 都没人评价一下我的设计

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-10-09 19:55 |只看该作者
你每个线程只需要监控一两个fd的事件,那线程里直接用select就可以了,没必要用epoll了,epoll操作是很重的系统调用。
一般服务也不用每个请求都分配1个线程,你又没什么阻塞操作,在一个线程里搞就可以了。

论坛徽章:
0
6 [报告]
发表于 2013-10-09 20:39 |只看该作者
回复 5# csumck


    那我在主线程里为每一个就绪的connfd构造http响应包然后write回给客户端,如果就绪的connfd很多时主线程不就阻塞了一段时间了吗

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2013-10-10 09:52 |只看该作者
回复 6# 1210603696


    为什么connfd多了就会阻塞? 具体是哪个函数阻塞了?

论坛徽章:
0
8 [报告]
发表于 2013-10-10 11:41 |只看该作者
回复 7# csumck


    可能是我的意思表达错了,我是想说在主线程内为每一个connfd处理请求需要消耗一段时间,如果connfd较多时后面的connfd会有一定的时延,所以我为每一个connfd new一个线程来处理

论坛徽章:
0
9 [报告]
发表于 2013-10-10 11:42 |只看该作者
可以试着换成epoll + 进程池的模型。

论坛徽章:
0
10 [报告]
发表于 2013-10-10 12:21 |只看该作者
回复 9# shentar


    恩,我到时候想模仿Nginx的master进程与worker进程模式来写一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP