免费注册 查看新帖 |

Chinaunix

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

[Web] 高并发高性能的静态Web服务器 + 完成端口部分源码 (修正) [复制链接]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-01 03:39 |只看该作者 |倒序浏览
附件已经修正

1.基于完称端口的静态Web服务器.
2.适合用于高并发高负荷的静态页面场合,特别适用于图片服务器.
3.为了满足高性能的要求以及保持灵活性,动态内容采用预留接口实现.
4.配置说明
  1)配置文件为当前目录下的config.ini
  2)ListenPort:指定绑定端口
  3)WWWRoot:静态页面内容所在目录
  4)AcceptExNum:可承受的突然并发连接(建议采用默认值)
  5)MaxWorkThread:工作线程数目(0代表根据CPU数目指定最佳值)
  6)ServiceName:安装后服务的名称

较1.0.0.1有多处改进,在17000个并发持续连接的情况下仍有良好的性能,改天放Linux下基于epoll模型的



  1. //完成端口的部分代码

  2. //主线程

  3. //创建原始完成端口句柄
  4. hIOCP=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
  5. if(NULL==hIOCP)
  6. {
  7.     //错误处理
  8. }

  9. //创建监听套节字 ListenPort()封装了bind listen等函数
  10. SocketListen=ListenPort();

  11. //绑定原始完成端口句柄到监听套节字SocketListen
  12. if(NULL==CreateIoCompletionPort((HANDLE)SocketListen,hIOCP,0,0))
  13. {
  14.     //错误处理
  15. }

  16. //投递AcceptEx
  17. {
  18.     unsigned long Num;
  19.     unsigned long AcceptExNum;

  20.     //GetConfigInt封装了读取配置文件
  21.     AcceptExNum=GetConfigInt("Httpd","AcceptExNum",2000);

  22.     //投递多个AccpetEx,PostAccpetEx封装了AccpetEx
  23.     for(Num=0;Num<AcceptExNum;Num++)
  24.     {
  25.         PostAccpetEx(NULL);
  26.     }
  27. }

  28. {    //启动工作线程
  29.    
  30.     unsigned long    MaxWorkThread;
  31.     unsigned long    threadcount;
  32.     DWORD            dwThreadId;
  33.     HANDLE*            hThread;

  34.     //读取配置文件中开启线程的数目
  35.     MaxWorkThread=GetConfigInt("Httpd","MaxWorkThread",2);
  36.    
  37.     //0代表根据CPU数目设置线程数目 CPU数目*2+2
  38.     if(MaxWorkThread<1)
  39.     {
  40.         SYSTEM_INFO systemInfo;
  41.         GetSystemInfo(&systemInfo);
  42.         MaxWorkThread=systemInfo.dwNumberOfProcessors*2+2;
  43.     }

  44.     hThread=HeapAlloc(GetProcessHeap(),0,sizeof(HANDLE)*MaxWorkThread);

  45.     for(threadcount=0;threadcount<MaxWorkThread;threadcount++)
  46.     {
  47.         hThread[threadcount]=CreateThread(NULL,0,WorkerThread,hIOCP,0,&dwThreadId);
  48.     }

  49.     //等待工作线程退出,主线程进入阻塞状态
  50.     WaitForMultipleObjects(MaxWorkThread,hThread,TRUE,INFINITE);
  51.    
  52.     for(threadcount=0;threadcount<MaxWorkThread;threadcount++)
  53.     {
  54.         CloseHandle(hThread);
  55.     }
  56.    
  57.     HeapFree(GetProcessHeap(),0,hThread);

  58. }



  59. //工作线程

  60. //LOOP循环条件,根据情况设定相应的条件
  61. while(LOOP)
  62. {
  63.     BOOL            Succes;
  64.     P_IOCPDATA        IOCPData;//自己定义的数据结构
  65.     unsigned long    TransByte;
  66.     LPWSAOVERLAPPED    lpWsaOverlapped;

  67.     //获取完成通知
  68.     //完成端口的精华就在这里
  69.     //通过调用GetQueuedCompletionStatus,线程可以获得原子性的时间段,避免了线程切换的开销
  70.     Succes=
  71.     GetQueuedCompletionStatus(
  72.     hIOCP,
  73.     &TransByte,
  74.     (unsigned long*)&IOCPData,
  75.     &lpWsaOverlapped,
  76.     INFINITE
  77.     );

  78.     if(Succes&&NULL!=lpWsaOverlapped&&TransByte)//完全正常
  79.     {
  80.         IOCPData=(P_IOCPDATA)lpWsaOverlapped;

  81.         //根据不同的I/O类型进行不同的处理
  82.         switch(IOCPData->IOType)
  83.         {
  84.             //AcceptEx具有连接和接受的功能
  85.             case AcptDone:
  86.             {
  87.                 //有一个AccpetEx完成,再投递一个AccpetEx
  88.                 PostAccpetEx(NULL);
  89.                 {
  90.                     //此段代码可以不调用,未发生错误,不知道为什么,
  91.                     //如果不调用的话,句柄不会很多,不会超出限制
  92.                     /*
  93.                     //更行AccpetEx返回的套节字状态
  94.                     int    ErrorCode;
  95.                     ErrorCode=
  96.                     setsockopt(
  97.                     IOCPData->Socket,
  98.                     SOL_SOCKET,
  99.                     SO_UPDATE_ACCEPT_CONTEXT,
  100.                     (char*)&SocketListen,
  101.                     sizeof(SocketListen)
  102.                     );
  103.                     if(SOCKET_ERROR==ErrorCode)
  104.                     {
  105.                         Test();
  106.                         FreeIOCPData(IOCPData);
  107.                         continue;
  108.                     }
  109.                     */
  110.                 }
  111.                 //绑定AccpetEx返回的套节字到hIOCP
  112.                 if(hIOCP!=CreateIoCompletionPort((HANDLE)IOCPData->Socket,hIOCP,(unsigned long)IOCPData,0))
  113.                 {
  114.                     Test();
  115.                     FreeIOCPData(IOCPData);
  116.                     continue;
  117.                 }
  118.                 //我写的是一个Web服务器,下面的是Http消息头的分析处理
  119.                 if(HttpParseHead(IOCPData))
  120.                 {
  121.                     Respons(IOCPData);
  122.                 }
  123.                 break;

  124.             }
  125.             //...... 其他处理情况
  126.         }
  127.     }
  128.     //.... 出现错误情况下的处理
  129. }

  130. //做人要厚道
  131. //转载请保留连接http://hi.baidu.com/xinglp
  132. //xlp1119@163.com,漫步黄昏

复制代码

[ 本帖最后由 xinglp 于 2007-4-6 18:49 编辑 ]

SmartHttpd.rar

10.88 KB, 下载次数: 586

论坛徽章:
0
2 [报告]
发表于 2007-04-02 09:05 |只看该作者
期待LINUX版本的

论坛徽章:
0
3 [报告]
发表于 2007-04-03 13:32 |只看该作者
这个要顶~,,那天出来linux 的测试一把

论坛徽章:
0
4 [报告]
发表于 2007-04-30 15:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2007-07-24 00:48 |只看该作者
期待,希望尽快放出。谢谢

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
6 [报告]
发表于 2007-07-24 10:22 |只看该作者
>回复楼上,epoll模型到是完成了,但是根据****条例,这属于公司机密(分明是我完成的),话说回来也没什么技术含量,无非就是用I/O事件通知机制实现多路复用,用线程池提高SMP系统上的处理器利用率,至于稳定性和安全性那就是编码设计的问题了,在加上良好的缓存算法,吞吐量饱和千兆网卡不成问题,也就是目前瓶颈不在程序了。很可惜为了我的饭碗,我只能说这些了,如果你的linux服务器撑不住,可以变相的试试2003的IIS,仅供参考。

论坛徽章:
0
7 [报告]
发表于 2007-07-24 15:11 |只看该作者
哈哈。理解。不过说的就简单,像我这样的级别,领悟不到那份简单。我只能支持您的现成品。昨天测试一下,确实不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP