精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>网络与通讯>>ISAPI之旅(一)

主题:ISAPI之旅(一)
发信人: deefish()
整理人: mrcloud(2000-08-24 02:27:49), 站内信件
让我来回忆一下新学:1 阅读了msdn上有关isapi的内容. 
                   2 实现了一个简单的isa. 
isapi是cgi的扩展.不同与cgi的独立执行(即每个客户请求服务器都为某开
一个进程),isapi采用多线程的方法,在同一进程内多线程出处理多用户(有
可能同步)的请求,所以只要dll装如运行长驻后,就能建设频繁为客户开
进程,分配资源的开销(开线程要比进程耗资少得多),从而提高服务器的
运行效率.isapi还提高了其他cgi替代如asp所不能提高的特性和性能,
比如通过return(HSE_STATUS_SUCCESS_AND_KEEP_CONN)保持serve与
elient的永久性连接.用mfc创建isapi extention dll vc先让你选择
是isa还是filter亦或以上两者同建于dll中,isa为你实现了
GetExtentionversion()、TerminateExtention()、CHttpExtentionProc()
中的前者并通过ON_PARSE_COMMAND宏将一个默认函数
Default()映射为默认处理(当请求参数为空ITS_EMPTY时调用此函数),
MFC将大部分实现都封装在一个CHttpServer,CHttpServerContext,
CHttpStream中,CHttpServer为每一个客户创建一个实例(类似于asp中
的—session)每个CHttpServerContext实例对应于一个session保存请
求的上下文即请求环境,包括server及client的请求信息。 
ClassWizard在def文件里导出了三个函数HttpExtensionProc()、
GetExtensionVersion()、TerminateExtension(),你可以在加入
HttpExtensionProc()的实现,我们必须用个函数来处理客户的请求,
大部分的工作也是在这个函数用完成的(客户的每一次请求都调用此函数)。
MFC把复杂的参数用一个ECB*(LPEXTENTION_CONTROL_BLOCK扩展控制块)
来遮屏(呵呵,mfc的伎俩),ECB在这里显得比较重要了,特别是那四个回调
函数指针。ECB的原型如下:
typedef struct _EXTENSION_CONTROL_BLOCK
 { DWORD cbSize; //IN DWORD
 dwVersion //IN HCONN ConnID; //IN 
 DWORD dwHttpStatusCode; //OUT
 CHAR lpszLogData[HSE_LOG_BUFFER_LEN]; //OUT 
 LPSTR lpszMethod; //IN 
 LPSTR lpszQueryString; //IN 
 LPSTR lpszPathInfo; //IN 
 LPSTR lpszPathTranslated; //IN 
 DWORD cbTotalBytes; //IN 
 DWORD cbAvailable; //IN 
 LPBYTE lpbData; //IN 
 LPSTR lpszContentType; //IN 
 BOOL ( WINAPI * GetServerVariable ) 
 ( HCONN hConn, LPSTR lpszVariableName, 
   LPVOID lpvBuffer, LPDWORD lpdwSize ); 
BOOL ( WINAPI * WriteClient ) 
 ( HCONN ConnID, LPVOID Buffer,
 LPDWORD lpdwBytes, DWORD dwReserved ); 
BOOL ( WINAPI * ReadClient )
 ( HCONN ConnID, LPVOID lpvBuffer, LPDWORD lpdwSize ); 
BOOL ( WINAPI * ServerSupportFunction ) 
( HCONN hConn, DWORD dwHSERRequest, LPVOID lpvBuffer, 
LPDWORD lpdwSize, LPDWORD lpdwDataType ); 
} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK; 
我吓了一跳,好长好长包括一长串的成员和主要的三个函数指针,我们就是用这
些东西干活的乐,ecb的详解还是请看msdn吧.ms提供的两个sample,一个是
counter,涉及请求处理,还有xbm图像显示,另一个是wwwquote,连接MS SQL 
SERVER,要在NT下运行(因为涉及所谓真正的Multiple thread和
thread_safe的东东),至于是不是能运行于desktop版我就不得而知了。
最学习的捷径是作个实例,可惜isa调试起来非常麻烦。
(未完待续)

====================================================
※※来源※※编程回忆录 http://www.coolbel.com/ithink
==================================================== 






--
我如果是一只菜鸟,也要用沙哑的声音歌唱!编程这活......

※ 修改:.deefish 于 Jun 17 13:54:37 修改本文.[FROM: 61.139.86.90]
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.139.86.90]

[关闭][返回]