LinuxSir.Org  
| 网站首页 | 注册账号 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
 
主题工具
旧 07-04-01, 04:32 第 1 帖
xinglp
 
 
 
注册会员  
  注册日期: May 2006
  帖子: 87
  精华: 0
 

标题: 高并发高性能的静态Web服务器+完成端口部分代码


SmartHttpd 1.0.0.2

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模型的

代码:
//完成端口的部分代码 //主线程 //创建原始完成端口句柄 hIOCP=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0); if(NULL==hIOCP) { //错误处理 } //创建监听套节字 ListenPort()封装了bind listen等函数 SocketListen=ListenPort(); //绑定原始完成端口句柄到监听套节字SocketListen if(NULL==CreateIoCompletionPort((HANDLE)SocketListen,hIOCP,0,0)) { //错误处理 } //投递AcceptEx { unsigned long Num; unsigned long AcceptExNum; //GetConfigInt封装了读取配置文件 AcceptExNum=GetConfigInt("Httpd","AcceptExNum",2000); //投递多个AccpetEx,PostAccpetEx封装了AccpetEx for(Num=0;Num<AcceptExNum;Num++) { PostAccpetEx(NULL); } } { //启动工作线程 unsigned long MaxWorkThread; unsigned long threadcount; DWORD dwThreadId; HANDLE* hThread; //读取配置文件中开启线程的数目 MaxWorkThread=GetConfigInt("Httpd","MaxWorkThread",2); //0代表根据CPU数目设置线程数目 CPU数目*2+2 if(MaxWorkThread<1) { SYSTEM_INFO systemInfo; GetSystemInfo(&systemInfo); MaxWorkThread=systemInfo.dwNumberOfProcessors*2+2; } hThread=HeapAlloc(GetProcessHeap(),0,sizeof(HANDLE)*MaxWorkThread); for(threadcount=0;threadcount<MaxWorkThread;threadcount++) { hThread[threadcount]=CreateThread(NULL,0,WorkerThread,hIOCP,0,&dwThreadId); } //等待工作线程退出,主线程进入阻塞状态 WaitForMultipleObjects(MaxWorkThread,hThread,TRUE,INFINITE); for(threadcount=0;threadcount<MaxWorkThread;threadcount++) { CloseHandle(hThread); } HeapFree(GetProcessHeap(),0,hThread); } //工作线程 //LOOP循环条件,根据情况设定相应的条件 while(LOOP) { BOOL Succes; P_IOCPDATA IOCPData;//自己定义的数据结构 unsigned long TransByte; LPWSAOVERLAPPED lpWsaOverlapped; //获取完成通知 //完成端口的精华就在这里 //通过调用GetQueuedCompletionStatus,线程可以获得原子性的时间段,避免了线程切换的开销 Succes= GetQueuedCompletionStatus( hIOCP, &TransByte, (unsigned long*)&IOCPData, &lpWsaOverlapped, INFINITE); if(Succes&&NULL!=lpWsaOverlapped&&TransByte)//完全正常 { IOCPData=(P_IOCPDATA)lpWsaOverlapped; //根据不同的I/O类型进行不同的处理 switch(IOCPData->IOType) { //AcceptEx具有连接和接受的功能 case AcptDone: { //有一个AccpetEx完成,再投递一个AccpetEx PostAccpetEx(NULL); { //此段代码可以不调用,未发生错误,不知道为什么, //如果不调用的话,句柄不会很多,不会超出限制 /* //更行AccpetEx返回的套节字状态 int ErrorCode; ErrorCode= setsockopt( IOCPData->Socket, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char*)&SocketListen, sizeof(SocketListen) ); if(SOCKET_ERROR==ErrorCode) { Test(); FreeIOCPData(IOCPData); continue; } */ } //绑定AccpetEx返回的套节字到hIOCP if(hIOCP!=CreateIoCompletionPort((HANDLE)IOCPData->Socket,hIOCP,(unsigned long)IOCPData,0)) { Test(); FreeIOCPData(IOCPData); continue; } //我写的是一个Web服务器,下面的是Http消息头的分析处理 if(HttpParseHead(IOCPData)) { Respons(IOCPData); } break; } //...... 其他处理情况 } } //.... 出现错误情况下的处理 } //做人要厚道 //转载请保留连接http://hi.baidu.com/xinglp //xlp1119@163.com,漫步黄昏
上传的附件
文件类型: rar SmartHttpd.rar (10.9 KB, 73 次查看)

此帖于 07-04-03 15:48 被 xinglp 编辑.
  xinglp 当前离线   回复时引用此帖
旧 07-04-01, 05:38 第 2 帖
晨想 帅哥
 
晨想 的头像
 
 
资深版主  
  注册日期: Feb 2003
  我的住址: P.R.China
  帖子: 9,637
  精华: 9
 

什么叫做 基于完称端口?新名词我想学习。







__________________
我的wiki: http://wiki.linuxgnu.org

马甲Show:终极幻想 黯然销魂 DawnFantasy FinalFantasy ArmageddonMa
  晨想 当前离线   回复时引用此帖
旧 07-04-01, 09:53 第 3 帖
xinglp
 
 
 
注册会员  
  注册日期: May 2006
  帖子: 87
  精华: 0
 

就是一种I/O模型,比较高效的,和Linux得epoll差不多
  xinglp 当前离线   回复时引用此帖
旧 07-04-06, 16:30 第 4 帖
guiguiaiwawa 帅哥
 
guiguiaiwawa 的头像
 
 
注册会员  
  注册日期: Dec 2006
  我的住址: 上海
  帖子: 65
  精华: 0
 

好高深呀!看不懂,需要好好学习一下!!!







__________________
little_gui
  guiguiaiwawa 当前离线   回复时引用此帖
旧 07-04-06, 22:24 第 5 帖
drivel
 
drivel 的头像
 
 
注册会员  
  注册日期: Jul 2006
  帖子: 291
  精华: 0
 

为什么带的是个W32文件?
  drivel 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 13:33


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2010, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2009, LinuxSir.Org