将Mongoose webserver嵌入到你的应用

43 篇文章 0 订阅
17 篇文章 0 订阅

http://zhiwei.li/text/2009/11/%E5%B0%86mongoose-webserver%E5%B5%8C%E5%85%A5%E5%88%B0%E4%BD%A0%E7%9A%84%E5%BA%94%E7%94%A8/


下载下面3个文件到某个目录
_mongoose.dll

http://mongoose.googlecode.com/svn/trunk/bindings/csharp/mongoose.cs

http://mongoose.googlecode.com/svn/trunk/bindings/csharp/example.cs

在MS Visual Studio编译C#范例, 或者使用命令行编译器
csc example.cs mongoose.cs

然后运行example.exe, 用浏览器打开 http://127.0.0.1:8080/foo

当Mongoose被嵌入到应用时, 运行时有两个明显的步骤
1. 开始和配置web服务器. 所有函数 都使用 struct mg_context *作为一个参数,除了mg_start()函数,它启动web服务器,返回一个 struct mg_context *, 所以,必须先调用它.

2. 为客户的请求服务. 在配置阶段, 可以注册URI hanlder: 在客户请求某种URL时,被调用. 这些函数是异步调用的. 只有那些注册了handler的URI才可以访问.
在每个用户回调中,HTTP请求信息被传递,在URI处理器内, 用户可以调用函数来回复,取得HTTP头部等
所有函数都需要struct mg_connection *作为一个参数.

数据结构

struct mg_context Mongoose 环境, 也称实例句柄
struct mg_connection HTTP连接句柄
struct mg_request_info HTTP请求信息. 这个结构被传递给URI处理函数.

开始,配置,停止Mongoose实例

struct mg_contect *mg_start(void)
在一个单独的线程里开始Mongoose服务器实例. 返回实例句柄(Mongoose上下文). 这个上下文
在后面同服务器的交互中需要,比如设置选项,停止服务等等

void mg_stop(struct mg_context *)
在关闭服务的最后 调用,释放所有相关资源. 这个将会阻塞,直到所有的Mongoose线程停止.

const char *mg_get_option(struct mg_context *context, const char *option_name)
返回特定选项的当前值

int mg_set_option(struct mg_context *context, const char *option_name, const char *option_value)
设置一个特定的选项. 选项值被复制. 选项的值 必须是一个有效的 以nul字节结束的ASCII或者UTF-8字符串. 可以在任意时候改变选项值. 如果选项是未知的,返回-1. 0表示设置失败哦, 1表示成功.

void mg_set_uri_callback(struct mg_context *context, const char *uri_regx, mg_callback_t func, void *user_data)
注册一个URI处理函数. 在uri_regx使用”*”(星号,匹配0到多个字符), 可以处理多个URI
user_data 指针 被作为第 3个参数 传递给 处理函数 .如果为NULL, 那么就删除这个handler

void mg_set_error_callback(struct mg_context *context, int error_code, mg_callback_t func, void *user_data)
注册一个错误处理函数. 比如 “404 Not Found”错误处理. 传递0作为 错误代码,将绑定到所有错误. 错误代码值 在 请求信息作为状态代码 被传递

void mg_set_log_callback(struct mg_context *context, mg_callback_t func)
指定一个函数来接收 所有的服务器的日志信息

void mg_set_ssl_password_callback(struct mg_context *ctx, mg_spcb_t func)
只在SSL许可请求密码时才需要.

void mg_modify_passwords_file(struct mg_context *ctx, const char *file_name, const char *user_name, const char *password)
添加,编辑或者删除 密码文件中的条目. 如果密码不为NULL, 条目将添加(已经存在就是修改)
如果password是NULL, 条目将删除. 返回1表示成功, 0表示错误

处理用户请求
int mg_write(struct mg_connection *, const void *buf, int len)
发送数据给客户. 返回值为 发送的字节个数. 如果发送的字节数< 请求的,或者为-1,表明发生了网络错误, 通常是 远程的客户端关闭了链接.

int mg_printf(struct mg_connection *, const char *fmt, …)
发送数据给客户端, 用printf()的semantics. 注意mg_printf 使用内部的缓冲区大小为
MAX_REQUEST_SIZE(16kb默认), 所以不要往里面打印大于 这个数目的数据. 否则,多出的数据会被截断. 函数的返回值是 发送的字节个数. Error sematics同mg_write()函数

const char *mg_get_header(const struct mg_connection *, const char *header_name)
给出特定的HTTP头部的值

char *mg_get_var(const struct mg_connection *, const char*var_name)
得到特定的表单变量的值. 注意: 这个函数(不像其他函数)会申请内存. 返回的值,必须自己主动用mg_free()释放. 如果这个变量既不再URI查询串,也不在POST数据中出现, 就返回NULL

char *mg_free(void *ptr)
释放 由 mg_get_var()申请的内存

void mg_authorize(struct mg_connection *)
设置authorize标志. 应该只在用mg_protect_uri()注册的回调函数中调用

通用辅助函数
const char *mg_version(void)
返回当前Mongoose version的版本

void mg_show_usage_string(FILE *)
显示 Mongoose 使用方法
命令行版本的使用

启动
mongoose option config_file
例如
mongoose -A htpasswd_file domain_name user_name password

不附接到任何终端, 使用当前的工作目录作为web的root目录,除非指定了-root选项
可以监听多个端口,比如80和443. 如果使用https, 则必须指定证书

如果使用-port选项指定SSL监听端口,那么必须在前面使用-ssl_cert选项指定证书

CGI脚本不需要放到一个特殊的目录, 可以放到任何目录. 通过文件扩展名来识别 CGI文件

SSI文件也可以识别.

mongoose也可以使用配置文件. 默认文件是 同目录下的”mongoose.conf”

配置文件,也可在命令行中的最后一个选项中指定

-A htpasswd_file domain_name user_name password
在密码文件中, 添加或者修改 用户密码
可以使用文本编辑器删除用户.

-access_log file
访问日志文件. 默认:如果不设置,没有日志文件

-acl (+|-)x.x.x.x/x,…
指定访问控制列表(access control list)

-admin_uri uri
设置管理页面. 在该页面,所有的选项在运行时改变. 这个URI可以使用密码保护起来.

-aliases list

-auth_PUT file
PUT或者DELETE的密码文件

-auth_gpass file
全局密码文件的位置

-auth_realm domain_name

-cgi_env list
传递环境变量给CGI脚本
以逗号分割,如 “VAR1=VAL1,VAR2=VAL2″
-cgi_ext list
逗号分割的CGI扩展名,所有的该后缀的文件被看作一个CGI脚本
默认:”cgi,pl,php”

-cgi_interp file
指定一个文件作为所有CGI脚本的I解释器. 默认这个值是不设置的. mongoose会在脚本文件的第1行去寻找合适的解释器

-dir_list yes|no
是否列出目录

-error_log file

-idle_time num_seconds

-max_threads number

-mime-types list

-ports port_list
逗号分割的端口的立标. 如果端口为SSL, 需要在端口后面添加s. 如 “-ports 80,443s”
也可以指定绑定的IP地址. “-ports 127.0.0.1:8080″

-protect list

-root directory

-ssi_ext list

-ssl_cert pem_file

-uid login

例子

mongoose -root /var/www -ssl_cert /etc/cert.pem -ports 8080,8043s
-aliases /aa=/tmp,/bb=/etc
Windows下安装Mongoose
安装器 将 Mongoose安装为一个windows服务,会在windows运行时自动启动

cgi_interp 必须是一个到脚本解释器的绝对路径 比如 C:/php/php-cgi.exe

为了让Mongoose工作,不一定要安装, mongoose.exe 就足够了. 安装过程没有复制任何DLL或者写注册表,它只是解压缩文件,注册了一个windows 服务.

Mongoose是以CGI解释器的形式运行PHP的, 这以为着每次为PHP服务时都必须载入 PHP解释器

复制 php5.dll 和 php-cgi.exe到 你的root目录,
如果你需要使用数据库,还需要复制php_sqlite3.dll

从PHP发行版的目录里的默认的php.ini文件中, 建立一个php.ini文件, 做如下更改

short_open_tag = On 这个用来支持短标记
max_execution_time = 15
max_input_time = 10
memory_limit = 16M
display_errors = on (调试时打开)
display_startup_erros = on (调试时打开)
log_errors = Off
html_erros = Off
magic_quotes_gpc = Off
extension_dir = “C:\root”
extension=php_sqlite3.dll (将DLL放入到 root目录)
data.timezone=US/Eastern (改变时区)

修改 mongoose.conf
cgi_interp php-cgi.exe
cgi_ext php


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值