我做的一款小型的WebServer,绿色软件,请大家帮忙测试一下
软件名称:
==========
EasyWebServer网站服务器 V1.5
软件功能:
==========
这是一款小型的Web服务器软件。它可以很快速地在您
的PC上创建一个站点,而无需IIS等庞大复杂的工具。
它的主要功能特点如下:
◇ 遵循HTTP/1.1协议标准
◇ 支持CGI/1.1,支持ISAPI及缓存ISAPI
◇ 支持自定义端口、最大连接数、网络超时
◇ 支持自定义缺省文档列表,支持目录浏览
◇ 支持中文UTF-8编码
◇ 支持Cookie,支持SOAP等
◇ 支持多线程文件下载、断点续传
◇ 支持访问日志记录
◇ 极少的资源占用,极快的访问速度,极简单的设置
◇ 绿色软件,无须安装,不写注册表
◇ VC++ SDK 编写,体积超小
使用说明:
==========
1. 设置好主目录、端口号等参数后,启动服务器
点右键菜单--“浏览主页”,就可以在浏览器中看到效果了
2. 如果要执行CGI/ISAPI程序,注意要选中设置中的CGI/ISAPI权限
在Demo子目录下有CGI、ISAPI的演示(包含一个CGI的留言本),详见Demo\readme.txt
欢迎您的测试,并提出您的宝贵意见和建议!
软件下载
华军软件园:http://www.onlinedown.net/soft/47720.htm
编程爱好者:http://www.programfan.com/wysoft/showwysoft.asp?id=1491
问题点数:100、回复次数:11Top
1 楼newzy()回复于 2006-03-14 12:03:06 得分 10
不错, 在这么短的时间内做到这个程序很不容易.
我对这个WebServer CGI 方面进行了一些测试, 结果还比较满意的.
只是 CGI 文件扩展名只支持 .exe 的, 这样会导致在浏览器上第次都会显示下载输出结果的对对话框. 所以对 .cgi 的扩展名支持是很有必要的.
另外, 我用 CSP (C 语言直接插入到 HTML中) 实现了下你的 demo 示例中的留言板(viewmsg.exe), 内容稍作了些改动, 把源码分享给大家, 包括四个文件:
============= review.csp =============
<HTML><HEAD><TITLE>留言本</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE>P {
size: 6pt
}
.title {
COLOR: #ffb6c1
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY>
<P><SPAN class=title>
<CENTER>
<H1>留 言 本</H1></CENTER></SPAN>
<P></P>
<CENTER>
<TABLE style="FONT-SIZE: 9pt" cellSpacing=0 borderColorDark=#ffffff
cellPadding=0 width=650 borderColorLight=#c0c0c0 border=1>
<TBODY>
<%
@include "../usr/db.h"
{
RECORD record;
void * fp;
fp = open_db("rb+");
while(1)
{
if (db_read_next(fp, &record) <= 0)
break;
%>
<TR bgColor=#dadada height=20>
<TD>作者: <% = (record.name) %> </TD>
<TD>性别: <% = (record.sex) %> </TD>
<TD>邮件: <% = (record.mail) %> </TD>
<TD>时间: <% =(record.now) %></TD></TR>
<TR height=50>
<TD colSpan=4><xmp><% = (record.msg) %></xmp></TD></TR>
<%
} /* for */
close_db(fp);
}
%>
</TBODY></TABLE></CENTER>
<FORM action=<% =cgiPrefix(NULL) %>/store.csp method=post>
<CENTER>
<P>姓名: <INPUT name=name>
<P>性别: <INPUT type=radio value=0 name=sex>女性
<INPUT type=radio value=1 name=sex>男性
<P>EMail:<INPUT name=email type=?Text?>
<P>我要留言:</P><TEXTAREA name=content rows=10 cols=95></TEXTAREA>
<P><INPUT type=submit value="发 表">
<INPUT type=reset value=清除重写></P>
</CENTER>
</FORM>
</BODY></HTML>
============= store.csp =============
<html>
<head>
<meta http-equiv="refresh" content="1; url=<% =cgiPrefix(NULL) %>/review.csp">
<title>正在跳转...</title>
</head>
<body>
<%
@include "../usr/db.h"
@include <time.h>
{
RECORD record;
void * fp;
time_t t;
memset(&record, 0, sizeof(record));
if ( '\0' == (strncpy(record.name, getParameter("name"), sizeof(record.name)-1))[0] ||
'\0' == (strncpy(record.sex, getParameter("sex"), sizeof(record.sex)-1))[0] ||
'\0' == (strncpy(record.mail, getParameter("email"), sizeof(record.mail)-1))[0] ||
'\0' == (strncpy(record.msg, getParameter("content"), sizeof(record.msg)-1))[0] )
{
ebprintf(ebfp, "'名称/性别/Email/内容' 均不能包为空");
}
else
{
/* get time */
t = time(NULL);
strftime(record.now, sizeof(record.now)-1,
"%Y-%m-%d %H:%M:%S", localtime(&t));
/* convert sex */
if (!strcmp("0", record.sex))
strcpy(record.sex, "女");
else
strcpy(record.sex, "男");
fp = open_db("ab+");
db_insert(fp, &record);
close_db(fp);
ebprintf(ebfp, "留言成功,正在跳转...");
}
}
%>
</body>
</html>
============= db.h =============
#ifndef _INC_DB_H_
#define _INC_DB_H_
#define DB_NAME "msg.db"
typedef struct {
char name[16];
char sex[16];
char mail[16];
char now[24];
size_t msg_len;
char msg[512];
} RECORD;
extern void * open_db(char * mode);
extern int close_db(void * fp);
extern int db_read_next(void * fp, RECORD * rcd);
extern int db_insert(void * fp, RECORD * rcd);
#endif /* _INC_DB_H_ */
============= db.h =============
#include <stdio.h>
#include <string.h>
#include "db.h"
/*
open data base
*/
void * open_db(char * mode)
{
FILE * fp;
fp = fopen(DB_NAME, mode);
return fp;
}
/*
close data base
*/
int close_db(void * fp)
{
if (NULL != fp)
fclose(fp);
return 0;
}
/*
read record from base
*/
int db_read_next(void * fp, RECORD * rcd)
{
size_t len;
if (NULL == fp)
return -1;
if (feof((FILE*)fp))
return 0;
memset(rcd, 0, sizeof(RECORD));
/* read header */
len = sizeof(RECORD) - sizeof(rcd->msg);
if (len != (int)fread(rcd, 1, len, fp))
return -1;
/* read message body */
if (rcd->msg_len != fread(rcd->msg, 1, rcd->msg_len, (FILE*)fp))
return -1;
return sizeof(RECORD);
}
/*
insert record to data base
*/
int db_insert(void * fp, RECORD * rcd)
{
size_t len;
if (NULL == fp || fseek(fp, 0, SEEK_END))
return -1;
/* write header */
rcd->msg_len = strlen(rcd->msg);
len = sizeof(RECORD) - sizeof(rcd->msg);
if (len != fwrite(rcd, 1, len, (FILE*)fp))
return -1;
/* write message body */
if (rcd->msg_len != (fwrite(rcd->msg, 1, rcd->msg_len, (FILE*)fp)))
return -1;
return sizeof(RECORD);
}
Top
2 楼limlzm(凡叶)回复于 2006-03-14 15:43:23 得分 10
markTop
3 楼haolee(haohao)回复于 2006-03-16 23:48:30 得分 10
都是好东西, 收下了, 继续关注中...Top
4 楼czq9966(宁录)(毛主席领导咱闹革命……)回复于 2006-03-17 01:22:47 得分 10
UPTop
5 楼boydream(show me the money!)回复于 2006-04-04 10:27:53 得分 10
study~~~Top
6 楼223xh(大头菜)回复于 2006-04-04 10:50:29 得分 10
支持jsp和.net吗?Top
7 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2006-04-04 10:58:19 得分 10
看过了,非常不错
Top
8 楼winter911(药师)回复于 2006-04-23 08:02:40 得分 10
纯情顶Top
9 楼redapple2008()回复于 2006-04-25 15:52:26 得分 10
楼主厉害,学习Top
10 楼baojian88888(机器人)回复于 2006-05-23 09:34:27 得分 0
感谢各位的支持,感谢newzy的建议
《EasyWebServer网站服务器》 V1.6 已经发布
1. 修正了一些Bug
2. 初步实现了对PHP的支持Top
11 楼soft_2008(冬天到了,春天还远吗?)回复于 2006-06-17 15:41:20 得分 10
- -Top




