http服务器二次开发SDK

36 篇文章 0 订阅
27 篇文章 0 订阅

http服务器二次开发SDK

1. 概述

http协议能够将可见协议与二进制协议有效融合,并且其结构良好,分头域与实体两部分,而且头域的结构一致,并能够随意扩展。我们可以基于头域结构的形式,模拟MFC消息结构,设计一个高效,易扩展的解析架构。

本程序的设计初衷就是模拟MFC的消息机制来实现http头域的解析,并使得能够基于该结构实现私有协议的解析,实现http协议的基本框架,使得二次开发时能够基于该框架快速实现开发。使用C++开发网站,完全实现界面与数据分开,使得C++的程序员们也能够快速开发基于网页的程序。

如果需要基于本架构实现http协议的二次开发,首先需要花时间区了解下http协议的基本结构。


    该系列的文章会持续发布,敬请关注。

2. 运行环境

目前提供的库运行在windows平台下,使用vs2008环境编译。后续会实现linux库。

3. 如何启动主程序

3.1. 一个简单的程序:

#include "../httpServer/ServerMain.h"

 

int _tmain(int argc_TCHARargv[])

{

StartHttpServer(8082,NULL,1);

return 0;

}

该程序在8082端口上启动了一个http服务,这样在相应的工作目录上放入index.html或者其他文件就可以直接访问了。

在浏览器中输入:http://127.0.0.1:8082/就会出现index.html中显示的界面。

或者输入http://127.0.0.1:8082/指定文件名.

3.2. 实现自己的http

如果需要实现根据用户的请求参数返回不同的信息,就需要增加自己的逻辑处理。

我们的逻辑处理都放在一个对象中实现,以便多次请求能够保存同样的处理现场。所以我们首先需要实现创建处理对象。

#include "../httpServer/ServerMain.h"

#include "./client/MfhHttpClientTest.h"

 

int _tmain(int argc_TCHARargv[])

{

StartHttpServer(8082,CreateMfhHttpClientTest,1);

return 0;

}

这段代码增加了回调函数CreateMfhHttpClientTest,用于创建与客户连接的client类。在该回调函数中创建对象,主要是为接管创建其他对象做准备。

 

代码如下:

MfhHttpClient*  CreateMfhHttpClientTest(SOCKET clientSocket,struct sockaddr_in *lpclientAddr)

{

MfhHttpClientTestclient = new MfhHttpClientTest(clientSocket,lpclientAddr);

return client;

}

 

MfhHttpClientTest类主要工作就是根据用户的请求路径和扩展名创建不同的处理对象,(通过该类可以实现自己的头域解析,可以完全忽略http,具体请参考后续的文章)。主要实现的函数如下:

/**

 *创建http对象,该函数可在派生类中实现过滤

 *@path请求的路径

 *@ext请求路径的扩展名

 *@version请求的版本号

 *@return成功返回基于CHttpBase类派生的对象

 */

virtual CHttpBaseCreateHttpObj(charpath,charext,charversion);

 

virtual void FreeHttpObj(CHttpBase*);

 

一个简单的创建函数如下:

CHttpBaseMfhHttpClientTest::CreateHttpObj(charpath,charext,charversion)

{

if (ext && strcmp(ext,"mfh") == 0)

{

return (new MyHttp());

}

return MfhHttpClient::CreateHttpObj(path,ext,version);

}

这样在网页上输入http://127.0.0.1:8082/wjh_2010.mfh就会进入MyHttp处理中。

MyHttp中需要处理3个虚函数:

//头域解析完成调用该函数,在函数中需要根据用户提交的参数做特别处理

virtual int OnRequest();

//处理完成之后告诉底层如何组织头域返回给客户端

virtual int OnResponseHeader(charresopnse,int maxLen);

//最后将自己的数据发送给客户端

virtual int Read(chardata,int maxlen);

 

例如:

OnRequest中根据客户端请求准备数据

OnResponseHeader告诉客户端准备的数据大小,编码格式是什么等信息;

最后在Read将数据填充到data中,返回给客户端。

 

基于CHttpBase类,当然可以实现私有头域的解析,在OnResponseHeader中增加私有的头域(具体操作方式见后续章节)

 

myHttp的实现如下:

/**

 *响应客户端

 *@return成功返回HTTP_RESPIONE_OK

 *失败返回其他代码

 *@note

 */

int MyHttp::OnRequest()

{

//这里增加自己的处理逻辑

 

return HTTP_RESPIONE_OK;

}

 

const charg_myTest = "<html><head><title>wjh hello</title></head><body>who am i?</body></html>";

/**

 *返回客户端

 *@return返回需要写入客户度端的内容长度

 */

int MyHttp::OnResponseHeader(charresopnse,int maxLen)

{

//处理完成后需要设置基本变量

m_contentLen = strlen(g_myTest);

 

int len = CHttpBase::OnResponseHeader(resopnse,maxLen);

 

//继续增加私有的头域

 

return len;

}

/**

 *读取客户端向服务器端返回的数据

 */

int MyHttp::Read(chardata,int maxlen)

{

strncpy(data,g_myTest,maxlen);

 

return strlen(g_myTest);

}


本次介绍了该架构的基本使用,后续会介绍其session如何引入。

代码完全原创,可以在任何C++编译器上编译。真诚与各位技术大牛门讨论,如有需要请发邮件到wjh_2010@163.com。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值