[color=Red]老朋友, 如果对CSP和eybuild仍不理解, 请先到 29 楼看完示例后再发表意见, 谢谢支持.[/color]
[size=4]可以将 C 语言直接插入到 HTML中来编写 CGI 程序叫 CSP (类似 ASP/JSP/PHP啦)
用 CSP 大大降低了直接用 C 写 CGI 程序的难度, 并且源程序非常直观.
下面是一个简单的留言板 CSP 源程序, 包括包括两个 CSP 文件, 两个 C 文件, 可以稍作修改以实现更复杂的应用(如连接SQL 数据库来实现多用户同时访问的数据存储等):[/size]
[size=3]这里下载源代码: http://www.eybuild.com/develop/download/review.rar
看看 eybuild 的中文手册: http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.pdf
这里下载 CSP 开发环境: http://www.eybuild.com/develop[/size]
============= 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);
}
[ 本帖最后由 newzy 于 2006-3-20 18:11 编辑 ]
review.rar
北京野狼 回复于:2006-03-15 11:41:25
实在不理解这种语言有什么意义
newzy 回复于:2006-03-15 11:55:23
引用:原帖由 北京野狼 于 2006-3-15 11:41 发表
实在不理解这种语言有什么意义
呵呵, CSP 是学习了不少 ASP/JSP/PHP 的语法.
但从效率上和许多直接用 C 开发CGI的应用领域上绝对 CSP 还是有它的很多优势地.
1. 嵌入式WEB开发是设计 CSP 的最原始初衷, 就是要为嵌入式开发定制的一套类似 ASP/JSP/PHP的C语言开发工具. 因为嵌入式设备(如PDA/路由器/交换机/VOIP网关等)上用的开发语言主要是 C, 而传统的 CGI 库 clib 以及开发模式远远不能跟上现代的开发需求. 现在 CSP 的eybuild开发环境提供的PC和嵌入式设备上高效移植的开发库, 让服务器上应用和嵌入开发进行了有效统一, 使得两者上的开发变得更为容易. 同时, 优秀的跨平台的移植性也是eybuild的最主要特性之一.
实践证明, CSP 及其开发工具 eybuild是嵌入式设备WEB开发的最理想工具, 它能大大节省开发周期(一般能节省4-6倍), 最能大大提高最终代码的可维护性(维护的是 HTML 和 C 代码, 而两都分开的, 所以维护更容易).
2. 天然的移植性(不需要虚拟机):
因为会翻译成的中间代码就是 C 嘛, 所以你可以多种平台下编译使用它, 只要有C 编译器即可, 所以它也是嵌入式设备(交叉编译)上WEB应用开发的绝佳选择.
3. 不依赖WEB 服务器:
CSP 生成的 CGI 程序支持 CGI-1.1 标准, 所以只能支持这个标准的WEB 服务器都能运行它, 如 Apache, IIS, GoAhead, httpd, mini-httpd, ...
4. 集成性好:
你可以把你的一个站点上所有的文件(包括页面,图片, CSS,JS文件等) 生成到一个 CGI 程序中, 或者几个非常独立的 CGI 文件模块, 这样非常方法管理, 同时不还不必担心代码被泄露.
可以下载综合示例看看, 压缩包里还包括一个微小WEB 服务器(92k, 需要安装) GoAhead. 它能展示 CSP 及其开发工具 eybuild 的一些特性.
http://www.eybuild.com/develop/demoshow.htm
如有不足, 请指教.
北京野狼 回复于:2006-03-15 13:16:26
引用:原帖由 newzy 于 2006-3-15 11:55 发表
嵌入式WEB开发是设计 CSP 的最原始初衷, 就是要为嵌入式开发定制的一套类似 ASP/JSP/PHP的C语言开发工具. 因为嵌入式设备(如PDA/路由器/交换机/VOIP网关等)上用的开发语言主要是 C, 而传统的 CGI 库 clib 以及开发模式远远不能跟上现代的开发需求. 现在 CSP 的eybuild开发环境提供的PC和嵌入式设备上高效移植的开发库, 让服务器上应用和嵌入开发进行了有效统一, 使得两者上的开发变得更为容易. 同时, 优秀的跨平台的移植性也是eybuild的最主要特性之一.
实践证明, CSP 及其开发工具 eybuild是嵌入式设备WEB开发的最理想工具, 它能大大节省开发周期(一般能节省4-6倍), 最能大大提高最终代码的可维护性(维护的是 HTML 和 C 代码, 而两都分开的, 所以维护更容易).
也许嵌入式WEB开发的确有些意义,至少节省一个perl,php等的解释器。但是仍然需要一个csp的解释器
但是要说节省开发周期,提高代码的可维护性绝对不可能。 用c 写web我还是喜欢模板式的。
北京野狼 回复于:2006-03-15 13:18:33
引用:原帖由 newzy 于 2006-3-15 11:55 发表
不依赖WEB 服务器:
CSP 生成的 CGI 程序支持 CGI-1.1 标准, 所以只能支持这个标准的WEB 服务器都能运行它, 如 Apache, IIS, GoAhead, httpd, mini-httpd,
仍然依赖web服务器
北京野狼 回复于:2006-03-15 13:20:37
总之csp也许在特殊情况有的意义。
但是我看开发效率不如直接c+模板方式。 入门难度又远超过php等。至于速度效率,我看也不怎么样。
newzy 回复于:2006-03-15 14:14:50
引用:原帖由 北京野狼 于 2006-3-15 13:16 发表
也许嵌入式WEB开发的确有些意义,至少节省一个perl,php等的解释器。但是仍然需要一个csp的解释器
[size=3]CSP 不需要解释器, 一般的开发步骤:
(1) 编写 HTML 模板文件
(2) 将可变的语句替换成 CSP 语句, 一般格式: <% 任意C 语句片断 %>
(3) CSP 文件要用 CSP2BIN 转换成 C 文件, C 程序文件是中间文件.
(4) 将 C 文件连同库用标准的 C 编译器编译成可执行文件, 只是后缀名取作 .cgi.
这个过程几乎跟 JSP/PHP 的开发过程一样, 只是最终生成的后缀名不同而亦.[/size]
引用:
但是要说节省开发周期,提高代码的可维护性绝对不可能。 用c 写web我还是喜欢模板式的。
[size=3]HTML 与 C 程序是分离的:
(1) HTML 模板文件主要是由 WEB 开发人员编写, 甚至直接由已有系统从浏览器中”另存为…” 或”查看源文件获得”
(2) HTML中可变的部分插入 C 语句处理, 如调用其它 C 文件中的函数.
两者是明显分离的, 下面这段代码是由上面 review.csp 生成的中间C 文件, 以往直接用C 及 cgilib写出来的结果跟它相差无几, 看看哪个开发次效率更高维护性更好呢?
[color=Red]试试看, 能看出它就是上面留言版的主界面程序吗? [/color]
[/size]
/* NOTE: DO NOT EDIT THIS FILE,
* this file is create by tool (csp2bin version: 00.07.00) automaticly,
* build at: Tue Mar 14 16:43:25 2006
*/
/* NOTE: YOU SHOULDN'T ADD THIS FILE TO YOUR PROJECT DIRECTLY,
* When you add `../xx_maplist.c' to your project,
* this file will be added into your project.
*
*/
#include <stdio.h>
#include <string.h>
#include <eblib.h>
#include "_review_csp.h"
static int _review_csp___mime_header();
int _review_csp__ (int calldepth, void * ebfp)
{
int __ret=OK;
char * __page_name="review.csp";
char * __page_path="/";
char * __page_fullname="/review.csp";
if (calldepth==MAX_CALL_DEPTH)
__ret=_review_csp___mime_header(ebfp);
goto_ERROR;
__ret=(int)ebBufStringAdd(ebfp,
"<HTML><HEAD><TITLE>ÁôÑÔ±¾</TITLE>\n"
"<META http-equiv=Content-Type content=\"text/html; charset=gb2312\">\n"
"<STYLE>P {\n"
" size: 6pt\n"
"}\n"
".title {\n"
" COLOR: #ffb6c1\n"
"}\n"
"</STYLE>\n"
"\n"
"<META content=\"MSHTML 6.00.2900.2180\" name=GENERATOR></HEAD>\n"
"<BODY>\n"
"<P><SPAN class=title>\n"
"<CENTER>\n"
"<H1>Áô ÑÔ ±¾</H1></CENTER></SPAN>\n"
"<P></P>\n"
"<CENTER>\n"
"<TABLE style=\"FONT-SIZE: 9pt\" cellSpacing=0 borderColorDark=#ffffff \n"
"cellPadding=0 width=650 borderColorLight=#c0c0c0 border=1>\n"
" <TBODY>\n"
);
goto_ERROR;
{
RECORD record;
void * fp;
fp = open_db("rb+");
while(1)
{
if (db_read_next(fp, &record) <= 0)
break;
__ret=(int)ebBufStringAdd(ebfp,
" <TR bgColor=#dadada height=20>\n"
" <TD>×÷Õß: "
);
goto_ERROR;
__ret = (int)ebEvaluate(ebfp, "%s", record.name);
goto_ERROR;
__ret=(int)ebBufStringAdd(ebfp,
" </TD>\n"
" <TD>ÐÔ±ð: "
);
goto_ERROR;
__ret = (int)ebEvaluate(ebfp, "%s", record.sex);
goto_ERROR;
__ret=(int)ebBufStringAdd(ebfp,
" </TD>\n"
" <TD>Óʼþ: "
);
goto_ERROR;
__ret = (int)ebEvaluate(ebfp, "%s", record.mail);
goto_ERROR;
__ret=(int)ebBufStringAdd(ebfp,
" </TD>\n"
" <TD>ʱ¼ä: "
);
goto_ERROR;
__ret = (int)ebEvaluate(ebfp, "%s", record.now);
goto_ERROR;
__ret=(int)ebBufStringAdd(ebfp,
"</TD></TR>\n"
" <TR height=50>\n"
" <TD colSpan=4><xmp>"
);
goto_ERROR;
__ret = (int)ebEvaluate(ebfp, "%s", record.msg);
goto_ERROR;
__ret=(int)ebBufStringAdd(ebfp,
"</xmp></TD></TR>\n"
);
goto_ERROR;
} /* for */
close_db(fp);
}
__ret=(int)ebBufStringAdd(ebfp,
"</TBODY></TABLE></CENTER>\n"
"<FORM action="
);
goto_ERROR;
__ret = (int)ebEvaluate(ebfp, "%s", cgiPrefix(NULL));
goto_ERROR;
__ret=(int)ebBufStringAdd(ebfp,
"/store.csp method=post>\n"
" <CENTER>\n"
" <P>ÐÕÃû£º <INPUT name=name> \n"
" <P>ÐԱ𣺠<INPUT type=radio value=0 name=sex>Å®ÐÔ \n"
" <INPUT type=radio value=1 name=sex>ÄÐÐÔ \n"
" <P>EMail£º<INPUT name=email type£½\?Text\?> \n"
" <P>ÎÒÒªÁôÑÔ£º</P><TEXTAREA name=content rows=10 cols=95></TEXTAREA> \n"
" <P><INPUT type=submit value=\"·¢ ±í\"> \n"
" \n"
" <INPUT type=reset value=Çå³ýÖØÐ´></P>\n"
" </CENTER>\n"
"</FORM>\n"
"</BODY></HTML>\n"
);
goto_ERROR;
if (ERROR == ebBufFlush(ebfp)) return ERROR;
return __ret;
} /* _review_csp__ */
static int _review_csp___mime_header(void * ebfp)
{
return ebprintf(ebfp, "Content-type: text/html\n\n");
}
newzy 回复于:2006-03-15 14:24:44
引用:原帖由 北京野狼 于 2006-3-15 13:18 发表
仍然依赖web服务器
如果一定要说它依赖于服务器, 那就只能说是依赖于服务器是否支持 CGI 1.1 标准.
而 CGI 1.1 标准是目前 WEB 服务最基本的功能, 流行的WEB 服务器都会支持它.
CSP 生成的文件中间文件是标准 C 文件, 所以可以在任何支持标准 C 的系统的下编译运行 CSP 编写的CGI 程序.
北京野狼 回复于:2006-03-15 14:31:40
的确不需要csp的解释器,我说错了。但是既然几乎跟 JSP/PHP 的开发过程一样,那还要csp干吗?
路由器/交换机/网关这些设上装个perl解释器不占用多少空间, 而且这些设备基本都有perl解释器。
很多PDA不是用c开发的,java甚至是必须的。
不理解CSP的应用空间在那里
北京野狼 回复于:2006-03-15 14:33:28
引用:原帖由 newzy 于 2006-3-15 14:24 发表
如果一定要说它依赖于服务器, 那就只能说是依赖于服务器是否支持 CGI 1.1 标准.
而 CGI 1.1 标准是目前 WEB 服务最基本的功能, 流行的WEB 服务器都会支持它.
CSP 生成的文件中间文件是标准 C 文件, 所以 ...
我说依赖的意思是,必须使用web服务器。 至于你说的标准和扩展的问题,比php,jsp,perl差远了
newzy 回复于:2006-03-15 15:05:51
引用:原帖由 北京野狼 于 2006-3-15 13:20 发表
总之csp也许在特殊情况有的意义。
但是我看开发效率不如直接c+模板方式。 入门难度又远超过php等。至于速度效率,我看也不怎么样。
"入门难度又远超过php" 不是太赞同
呵呵, 如果你会基本的 C 程序的话, CSP 入门怎么可能比 PHP 难. 既然会 PHP, 那就把用PHP的语句换成 C 就成了(并将 <?php ?> 换成 <% %>, 如下面给个例子输出 "Hello world"例子:
CSP 的中间文件是 C, 最后编译生成的可执行文件(即CGI), 如果怀疑 CSP的效率就是在怀疑 C 写 CGI 程序的执行效率啦. 目前, C 仍是高效率要求下的最佳选择.
"但是我看开发效率不如直接c+模板方式", 能给个例子对比说明下吗?
如有不妥, 请指正.
<html>
<body>
<% print ("hello world<BR>"); %>
<% echo ("hello world<BR>"); %>
当然也可写成:
<% ="hello world<BR>" %>
<body>
</html>
北京野狼 回复于:2006-03-15 15:29:31
如果一个人,php,c都不会呢?学哪个快。
http://bbs.chinaunix.net/viewthread.php?tid=607153
http://bbs.chinaunix.net/viewthread.php?tid=602125&extra=&page=5
newzy 回复于:2006-03-15 16:11:32
引用:
原帖由 北京野狼 于 2006-3-15 14:31 发表
...
路由器/交换机/网关这些设上装个perl解释器不占用多少空间, 而且这些设备基本都有perl解释器。
很多PDA不是用 ...
像上面所列的嵌入式设备, 一般地特点是: 内存/外存储器小, CPU速度慢, 实时处理要求高. 比如通常一个小路由器 8M/16M RAM, 8M/16M Flash RAM, CPU 100MHZ; 操作系统除了选择"功能经过了反复裁减的Linux", 还有 VxWorks, eCos、uC/OS-II ... 不见得在上面都能运行 PERL 解释器; 还有 WEB 服务器, Apache 可能不再是嵌入式上的有益选择, 那么像 GoAhead, mini-httpd, ...许多WEB 服务器, 上也不尽都能很好地支持 perl.
诸上等原因, 仍限制着嵌入式领域 WEB 的主要开发还是选择基于 C 直接开发 CGI 程序.
另外, PDA上的 GUI及其应用是用多用JAVA来开发的, 不过下层程序如驱动,通信协议等还是用C的.
newzy 回复于:2006-03-15 16:13:05
引用:原帖由 北京野狼 于 2006-3-15 14:31 发表
...
但是既然几乎跟 JSP/PHP 的开发过程一样,那还要csp干吗?
上面已提到嵌入式领域选择 CSP 是因为嵌入式的特点决定的.
在服务级的 WEB 应用选择CSP 则是现有开发工具的有益补充. 就是说并不强求你一定选择CSP进行开发, 而是CSP及其配套开发工具eybuild的以下特点, 使得我们选择 CSP 开发更有益:
1. 执行代码高效率的追求
C 是高效率性是毋庸质疑的, CSP 是对直接用 C 开发的CGI 的一种包装, 所以天然地继承了 C 语言的高效性性. 喜欢用 C 开发的程序员, CSP是最有吸引力的选择.
2. 高效的集成技术:
通过集成技术, 你可以把许多CSP/HTML页面集成生成到一个CGI中(包括图片, CSS 及其它静态文件). 甚至, 你可以将一个小型的网站或应用生成到一个CGI文件中, 这使得最的可执行脚本文件管理变得异常简单. 这一点在嵌入式设备上特别有用, 因为它们中的很多急乎没有外存(如Flash ROM). eybuild 为最后生成的 CGI 程序在其内部建立了虚拟目录, 页面间的引用几乎跟真实文件系统一样.
更多CSP的特点, 请看下 《eybuild 中文手册》中的“1.2 为什么要选择eyBuild开发Web站点 ”一节,
见: http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.pdf
北京野狼 回复于:2006-03-15 17:04:57
如果非使用c开发web 的话,那就直接写,没必要使用csp。
我做过7年用c写web。不得已也使用php,jsp最不喜欢的就是在html页面里面写程序。
我也开发过防火墙,老实说国内的防火墙70%的工作就是做web配置,大多使用bsd,而且根本就不是嵌入
式,就是一台主机,连硬盘都有。
newzy 回复于:2006-03-16 10:30:35
引用:原帖由 北京野狼 于 2006-3-15 17:04 发表
如果非使用c开发web 的话,那就直接写,没必要使用csp。
我做过7年用c写web。不得已也使用php,jsp最不喜欢的就是在html页面里面写程序。
我也开发过防火墙,老实说国内的防火墙70%的工作就是做web配置,大 ...
呵呵 如果有人能够步行一日千里, 那么他出门时几乎没有必要乘任何交通工具.
如果有人喜欢并能在很短的时间内以超强的能力直接用 C 写完很多重复/繁琐CGI 页面处理, 那他也不必要借助任何工具, 包括 PHP/JSP.
之所以现在 ASP/PHP/JSP 能取代直接用 C 写 CGI, JSP 能取代 java Servlet的方式写 CGI. 是因为它们都在CGI基础上做了抽象, 简化了开发难度,复杂度等. 跟大家都知道 JSP 最终还是翻译成 java Servlet 的 CGI程序一样, CSP 最终也被翻译成了 C 的 CGI程序. CSP 不是在简单的炒作概念, 它的真正目的是为了简化用 C 开发 CGI程序的难度和复杂度, 以提高程序开发速度.
我手头的一项开发工作(VDSL2 局端+用户端设备)上包括70余个配置页面, 如果一个个的 printf 出来还是有点工作量的吧, 还要手工转换其中的 \"\'\n\r 等符号, 对动态输出页面的流程控制. 如果没有一定的CGI开发功底, 其难度和工作量还是很可观的. 用CSP 则在大简化了这个过程:
(1) 用很短的时间从已有产品中截取 HTML 页面模板, 就是从浏览器文件另存为啦
(2) 修改好页面间的连接关系
(3) 与各下层模块商定 API接口, 即定义中间层接口 (在 HTML中调用的 下层函数, HTML中尽量少的加入复杂处理, 就像现在的 JSP 一样, 为了更好地使 C 和 HTML分离.)
(4) 在 HTML中依照 CSP 语法插入 C 语句语句. 中间层程序员编写 C 文件的 API 函数(调用 eybuild提供的CGI库), 下层模块实现功能处理.
(6) 将 CSP 文件/静态的页面/图片文件/CSS文件等用 eybuild 的翻译成 C 文件
(7) 将 *_csp_maplist.c , *_rom_maplist.c, 其它 .C 文件, eybuild 库一起编译生成可执行的 CGI文件.
我用 C 做 CGI 时间比你少些只有5年啦, 有不妥之处请多指教.
也移植过BSD 的防火墙 IP Filter 到 VxWorks以支持 NAT/包过滤等, 这个防火墙还是不错地. 直接在 BSD 下也用过. 很多公司都是直接在 PC上装个BSD来用这个防火墙.
haolee 回复于:2006-03-16 23:44:58
讨论的很精彩嘛, 继续关注中, 不过也学着了不少东西地...
北京野狼 回复于:2006-03-17 09:48:52
newzy 兄弟说的也对,只是我认为一个程序员能用CSP开发, 那就没什么理由不能用c直接开发web
仅仅是需要一套web库而已, 比如hash,cgi处理等
jeffyan 回复于:2006-03-17 16:51:01
实在不理解这种语言有什么意义
newzy 回复于:2006-03-17 17:22:24
引用:原帖由 jeffyan 于 2006-3-17 16:51 发表
实在不理解这种语言有什么意义
应该说 CSP (C Language Service Page) 不是一种语言, 它是是联合 C 和 HTML/XML 等模板文件中快速编写 CGI 程序的一种方法. 即 像 ASP/JSP/PHP 的语法一样. 将 C 语句插入到 HTML/XML 模板文件, 以简化对 HTML 输出及文件结构控制等重复工作.
CSP 文件与其相关的图片/CSS文件都可被转换成 C 文件, 最终再编译生成可执行的 CGI 文件.
同时 CSP 的开发环境还提供了 CGI 库, 以快速编写必要的 C 程序.
就像用高级语言而很少用直接用汇编和机器语言道理一样,
汇编机器语言啥都能做为什么大家还用 C?!
[ 本帖最后由 newzy 于 2006-3-17 17:29 编辑 ]
xinglp 回复于:2006-03-18 13:00:01
这么麻烦,还没有俺的FastCGI论坛好呢
xiaoxiaota 回复于:2006-03-18 20:06:04
查了下, 国外有个公司做了个类似的CSP engine, 还得花钱买呢
实质上是一个扩展标记再加上一些有用的库
我现在正在用C写CGI, 便拿过来试用了, 效果不错, 效率提高了4-6倍, 并且又是免费的, 何乐而不为之呢
wjfree 回复于:2006-03-19 13:03:48
看了一会,有点明白csp是什么概念了,
csp 我的理解是将csp文件中的html代码转换为c的代码像
将<br></br>转换为c输出:printf("<br></br>")
最终生成一个c的源文件之后的事情就跟csp没什么关系了.
不知道这样理解对不对
connet 回复于:2006-03-19 13:56:06
不如直接使用 cgilib 来得快。
eybuild 基本就是 goahead 修改一下, 不开放源码了, 我个人抵制这种东西。
8M/18M 跑 thttpd+php+ssl 绰绰有余。我自己给 thttpd 加上 ssl 支持,连接 php, 程序才1M, 运行空间2-3M 绝对足够。 php 静态连接,速度足够快。
newzy 回复于:2006-03-19 15:24:40
引用:原帖由 connet 于 2006-3-19 13:56 发表
eybuild 基本就是 goahead 修改一下, 不开放源码了, 我个人抵制这种东西。
不知这位仁兄如何得到上面这个结论的.
GoAhead 跟 IIS/Apache/thttpd 等一样是 WEB 服务器. 而 eybuild 是 开发 CGI 程序的工具.
两者是两个功能完全不同的的东西. 就像一个是盘子, 一个菜刀一样; 一个是个用来盛菜的(Web 服务器), 一个是用来做菜的(CGI 开发工具eybuild), 不能因为它们跟菜都有关系就说一是个从另一改过来的吧.
为了方便给大家伙演示 eybuild 下做的 CGI 程序, 修改了 GoAhead中的对CGI支持的bug. GoAhead 仅是可选的一个 Web 服务器而已, 对此还特别说明过, 见: http://www.eybuild.com/develop/demoshow.htm#down-demo
引用:
说明:
如果在 Windows 上已经安装并启动了 IIS 或 Apache 等 Web 服务器, 可以不运行下文所述的 GoAhead Web 服务器, 而直接将 cgi-bin 目录中的 CGI 文件拷到 IIS 或 Apache 的可执行脚本的目录, 然后从浏览器访问它们.
另外, 本人并未有拿开源的东西拒为已有的行为, 关于定制的部分特性, 早已发布在 GoAhead 的相关论坛中, 以支持开源项目. http://www.prolix.ro/dokuwiki/documentation:goahead:general.
[ 本帖最后由 newzy 于 2006-3-19 15:29 编辑 ]
newzy 回复于:2006-03-19 16:15:01
引用:原帖由 connet 于 2006-3-19 13:56 发表
不如直接使用 cgilib 来得快。
8M/18M 跑 thttpd+php+ssl 绰绰有余。我自己给 thttpd 加上 ssl 支持,连接 php, 程序才1M, 运行 ...
现在, 大家很少用直接用 cgilib 开发 CGI, 主要是它的开发效率低, 代码可维护性差. 而 ASP/JSP/PHP/PERL等, 虽然执行效率上不如 C 开发的高, 但大家仍在执行效率和开发效率/可维护性等方面选择了一个折衷.
JSP/PHP等说白了还都是 CGI, 但它比 cgilib 开发的优越性就在于: 对 cgilib 进行了进一步的封装, 通过在 HTML/XML等中直接嵌入ASP/JSP/PHP语句以实现对复杂细节的屏蔽, 同时简化了重复烦琐的语句输出细节, 这一点相信用过Java Servlet开发的 JSP 程序员会最有体会.
CSP学习了很多 ASP/JSP/PHP等的优点, 设计它的初衷是要为WEB 开发提供一个, 能将 C 语句像VB /JAVA /PHP语句等能直接嵌入到HTML/XML中的开发CGI的快捷的开发工具. 是的, eybuild现在就是这样一种开发工具. 它不仅提供了高效的 cgilib 库, 还来 C 开发 CGI 提供了一套专门的配套开发工具. 使得用 C 开发 CGI 程序跨平台性, 集成性, 开发效率大大提高.
另外, eybuild 一直都致力于各种平台下的CGI程序的开发, 特别是嵌入式领域. 使得 eybuild 开发出来的程序小至几十K空间都可以运行, 这一点远非 ASP/JSP/PHP/PERL等所能比及. 楼上这位兄弟所言 “才1M” 对eybuild开发的CGI来说大是一种奢侈了吧.
用一句话概括来说吧: eybuild 是嵌入式设备上开发的最佳选择, 同时也是现有服务器 WEB开发工具最有益的补充.
newzy 回复于:2006-03-19 16:57:17
引用:原帖由 wjfree 于 2006-3-19 13:03 发表
看了一会,有点明白csp是什么概念了,
csp 我的理解是将csp文件中的html代码转换为c的代码像
将<br></br>转换为c输出:printf("<br></br>")
最终生成一个c的源文件之后的事情就 ...
是的, eybuild的最基本功能就是这样.
用一个叫 CSP2BIN 的工具将已经编辑好的 CSP源文件翻译成 C 程序文件(中间文件). 然后再用C 编辑器(如 VC, gcc等)将该中间 C 程序, 自定义 C 程序, 以及eybuild 提供 CGI 库一起编译生成 CGI 程序. 你可以[url=http://www.eybuild.com/develop/download/demo.tar.gz]下载示例, 做下看看那些中间的 C 程序文件.
还有, 生成的中间文件并未直接调用类似 printf 的库函数进行输出, 因为它们都是不带缓冲的, 一旦后面的内容出现错误, 将不能把错误信息输出了. eybuild 库中[url=http://www.eybuild.com/develop/doc/API/ebio.html] ebio模块 提供了带缓冲 [url=http://www.eybuild.com/develop/doc/API/ebio.html#ebprintf]ebprintf().
其实, eybuild 提供的功能远不止这些. 你不仅可能将多个动态页面集成到一个CGI文件中, 还可以图片文件等静态文件集成到 CGI文件中. 在嵌入式应用中, 往往常会通过eybuild将一整个网站生成到一个或者很少的CGI中, 以方便对 CGI文件的管理, 在”综合示例”中有关于这一特性的演示.
更多特性, 可参阅 [url=http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.pdf]eybuild 中文件手册.
Good Luck!
macrodba 回复于:2006-03-20 09:46:37
路过看看
supersarah 回复于:2006-03-20 11:21:08
看不出来,这样的开发,和直接用 c 写 cgi 有什么差别
自己曾经做过一些工具,目的是用 c 写 cgi 的时候,能够更方便一些,使用 awk 从特定模版中抽取,形成 c/c++ 源文件,然后便已成 .cgi,可以做到 html 和 c 分离,我只管 c,html/javascript 我不管,让月薪 2k 的人来干 :)
还设计过怎样在不暴露 c 源代码的情况下,分别编译和连接的问题。不过这样复杂一些,后来大多数用户很少用 cgi 了,也就没有进一步做。
newzy 回复于:2006-03-20 17:24:22
大家好,
其实很多上面的帖子已经解释很多了, 请大家在发言前能认真看一下.
如果还是不能理解, 再请看下这个 宽带路由器 的例子(Windows 环境, 几个月前做的)
其中包括 39 个 CSP 文件, 9 个图片文件, 1 个JS 文件, 1个CSS 文件
试想下如果用 C 语句一个一个的输出会有多大工作量?
如果再加下本身的逻辑处理, 那么将 C 与 HTML等这样交织在一起其维护性会怎样?
点击这里下载源程序:
[size=4]http://www.eybuild.com/develop/download/FR40.rar[/size][/color]
点击这里下载 CGI 程序(自带web 服务器, 如下图):
[size=4]http://www.eybuild.com/develop/download/soho-router.rar[/size]
源程序运行方法:
1. 确保安装了 eybuild 开发环境
2. 解压开后, 运行 fr40.bat 以将 csp 目录中的 csp 文件翻译成 C 程序.
3. 用 VC++ 打开 FR40prj 中的工程, 编译生成 CGI 程序.
宽带路由器 CGI 执行演示步骤:
1. 解压下载后的 soho-router.rar
2. 如果电脑上已经安装IIS或 Apache 也可直接将 soho-router/cgi-bin/fr40.cgi 拷贝到它们相应的 cgi-bin 目录中运行本示例.
否则, 请先打开本示例自带的 WEB 服务器 soho-router/webs.exe
3. 打开IE浏览器, 打开输入: http://127.0.0.1/cgi-bin/fr40.cgi
备注:
本例仅用于演示之用, 内部逻辑处理并未加入; 同时, 界面所有权归fr40公司所有, 请勿将本例中的任何源码(包括翻译生成的C程序文件)作为商业用途

[ 本帖最后由 newzy 于 2006-3-21 16:10 编辑 ]
北京野狼 回复于:2006-03-20 18:37:08
引用:原帖由 newzy 于 2006-3-20 17:24 发表
其实很多上面的帖子已经解释很多了, 请大家在发言前能认真看一下.
newzy 是真够执着的。 那里解释清楚了。 能用CSP开发, 那就没什么理由不能用c直接开发web。
你的很多话有的意淫的成分,:D别生气。就象很多linux,google
狂热者,看不得别人说linux的缺点
就是好就是好!
xinglp 回复于:2006-03-20 20:11:39
呵呵 好玩 继续
能在CSP开发FCGI么
newzy 回复于:2006-03-21 16:04:47
引用:原帖由 xinglp 于 2006-3-20 20:11 发表
呵呵 好玩 继续
能在CSP开发FCGI么
谢谢支持.
由于CSP 及其开发环境eybuild 最初是定位在嵌入式设备的开发WEB 开发, 所以在已正式发布的版本 v0.5, v0.6, v0.7 中并没有对 fast cgi 支持. eybuild工作组正在加紧做这方面的工作, 可能在 v0.9 版以后对 fast cgi 支持.
flowingtree 回复于:2006-03-25 08:53:37
引用:原帖由 newzy 于 2006-3-21 16:04 发表
谢谢支持.
由于CSP 及其开发环境eybuild 最初是定位在嵌入式设备的开发WEB 开发, 所以在已正式发布的版本 v0.5, v0.6, v0.7 中并没有对 fast cgi 支持. eybuild工作组正在加紧做这方面的工作, 可能在 v0.9 ...
:hug::hug::handshake
newzy 回复于:2006-03-25 12:48:02
eybuild 0.8 bata 版, 现正在紧张测试中. 预祝本月 29 号 Release 版能如期正式发出.
newzy 回复于:2006-03-30 21:29:11
感谢支持,[size=4]eybuild-00-08-02 [/size]发布了。
本版开发包可在windows/Linux下使用,同时开发包中附了更多 CGI 示例程序,这里下载: [size=4]http://www.eybuild.com[/size]
[size=4]综合示例:http://www.eybuild.com/develop/demoshow.htm
中文手册:http://www.eybuild.com/develop/doc/manual/eybuild_manual_ch.htm[/size]
[ 本帖最后由 newzy 于 2006-3-30 21:34 编辑 ]
superjunk 回复于:2006-04-02 01:46:29
newzy兄很是执著,执著的为csp辩解!!!我很喜欢这种执著精神,或许我欠缺的就是这种精神...
其实你无需这种执著的辩解,csp终究到底的话是一种方法,一种实现c的cgi的方法,有些人会为你介绍的途径鼓掌,同样也有人不肖!!!
大家也无需去争辩这种方法好不好,个人的喜好问题而已!!!
在C写CGI的过程中,我个人倾向淋漓尽致的直接写代码,或许这可能使工作量来得大一些,但是个人的模式已经固定!
newzy 回复于:2006-04-04 10:27:43
superjunk 兄弟说地很对, 不同人有不同的喜好, CSP 只是用 C 写CGI的一种方法, 每个人可以根据自己的需要和应用特性选择不同的方法吧. 同时非常感谢你的公正的评论.
"淋漓尽致的直接写代码" 是很多资深C程序员的共同爱好, 就像当年微软主推MFC 时, 很多人还是对SDK非常热衷一样.
eybuild SDK中也提供了对现在有 cgilib 库的一个升级版, 也很方便 "淋漓尽致的直接写代码".
写CGI的都知道获取并分析客端的参数和上传文件操作是两解析复杂/重复/烦琐的过程, 优其是单表中提交数据混合上传文件的操作, 关于这两个最基本的. eybuild SDK 提供两类似 JSP和 ASP 的两个 API: [size=3][url=http://www.eybuild.com/develop/doc/api/ebrequest.html#getParameter]getParameter(), [url=http://www.eybuild.com/develop/doc/api/dopost.html#getPostItemValue]getPostItemValue(), [url=http://www.eybuild.com/develop/doc/api/dopost.html#getPostFileCount]getPostFileCount(), ...[/size]
getParameter() 用的最多, POST 和 GET 方法的提交的数据(除上传文件)都可以用它方便获取.
下面给个直接用 SDK 写的 CGI 例子 (来自: [url=http://www.eybuild.com/develop/download/eybuild-00-08-02.tar.gz][size=2]eybuild-00-08-02开发包[/size], $EYBUILD_BASE/project/raw/cgimain.c).
如有不妥, 请指教.
int cgimain()
{
printf("Content-Type: text/html\n\n");
if ( 0 != strcmp("true", getParameter("result")) )
{
printf("<html>\n<body>\n");
printf("<H2>This is a cgi test.</H2 >\n");
printf("<form action=\"raw.cgi?result=true\" method=post>\n");
printf("<p>Input: <input type=text name=\"inputbox1\"></p>\n");
printf("<p>Choose: \n");
printf("<select name=\"choosebox1\">\n");
printf(" <option value=\"Good Luck\">Good Luck</option>\n");
printf(" <option value=\"Hello world\">Hello world</option>\n");
printf(" <option value=\"Bye bye\">Bye bye</option>\n");
printf("</select>\n");
printf("</p>\n");
printf("<p><input type=submit value=\"submit\"></p>\n");
printf("</form>\n");
printf("</body>\n</html>\n");
}
else
{
printf("<html>\n<body>\n");
printf("<p>What you input is: <b>%s</b></p>\n", getParameter("inputbox1"));
printf("<p>What you choose is: <b>%s</b></p>\n", getParameter("choosebox1"));
printf("<p><A href=\"raw.cgi\">Return</A></p>\n");
printf("</body>\n</html>\n");
}
return OK;
}
主界面:
提交后的结果:

[ 本帖最后由 newzy 于 2006-4-4 10:58 编辑 ]
loog 回复于:2006-04-04 20:57:15
....還是不懂CSP
newzy 回复于:2006-04-06 11:06:26
引用:原帖由 loog 于 2006-4-4 20:57 发表
....還是不懂CSP
还不懂就再去看看 "eybuild 中文手册" 吧:
[size=4][url=http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.htm]http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.htm[/size]
[size=4][url=http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.pdf]http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.pdf[/size]
或再下载示例看看吧:
[size=4]http://www.eybuild.com/develop/demoshow.htm[/size]
或在线提问或把你的问题发邮件到 [email]newzy@eybuild.com[/email]
祝你好运.
[ 本帖最后由 newzy 于 2006-4-6 11:10 编辑 ]
yhch 回复于:2006-04-07 10:46:57
我觉得CSP还是很有意义的
sickcat2004 回复于:2006-04-07 17:10:10
引用:原帖由 北京野狼 于 2006-3-17 09:48 发表
newzy 兄弟说的也对,只是我认为一个程序员能用CSP开发, 那就没什么理由不能用c直接开发web
仅仅是需要一套web库而已, 比如hash,cgi处理等
基本上同意野狼大哥的观点,不是说csp不好,而是有觉得没有必要,多此一举,嵌入式估计需要
diogin 回复于:2006-04-08 13:48:33
引用:原帖由 yhch 于 2006-4-7 10:46 发表
我觉得CSP还是很有意义的
是的,尤其期待对FastCGI的支持,否则在非嵌入设备应用的意义不是太大。
newzy 回复于:2006-04-09 22:17:05
谢谢关注,
支持 FastCGI 的 eybuild 版本已经发完成,正在依照 FastCGI Specification 对各种平台进行内部测试。近期将推出一个针对 FastCGI 的 bata 版,谢谢继续支持。
xxme 回复于:2006-04-11 16:56:09
关注,
看着上面哥几个的话, 再没看到东西前莫论好坏吧.
songyi1999 回复于:2006-04-14 11:32:46
好啊,我觉得不错,至少生成目标文件后别人看不到源程序比较安全.
kwest 回复于:2006-04-14 13:08:31
看了一下,CSP说白了就是将web页面(包括图片,HTML文件,CSS,JS等)及其内嵌的C语言转换成C源文件,并将转换后的C代码编译成CGI文件。之后将CGI文件放在webserver的cgi-bin目录下就可以访问了。不知道我理解得对不对?在HTML页面需要动态显示的地方插入<%C代码%>,这中方式对嵌入式web应用确实很方便,尤其对习惯用C语言的程序员。
不过,不知楼主想过没有,如果你的CSP只能用于有文件系统支持的webserver中,如果有的webserver(如GoAhead)不用文件系统,而是直接将网页编译成ROM文件。不知在newzy兄在eybuild中是否提供了这种功能?
newzy 回复于:2006-04-14 16:24:39
kwest的理解非常正确, CSP 不是新技术. 就是对现有 CGI 技术的一种封装, 以使得 C 写CGI 能像 ASP/JSP/PHP 一样基于 HTML/XML 等模板进行快速开发.
"编译成ROM文件", 这个问题提得非常好.
从一开始 eybuild 就参考了 GoAhead 的相关设计, 并提供了ROM格式的应用上, 而且这还是 eybuild 最显著的特性之一. 相信你已经注意到有一个工具(web2bin) 和两个函数: romPrefix() 和 cgiPrefix(), 它们就是专为此而设计的. 函数原型[url=http://www.eybuild.com/develop/doc/API/ebrequest.html](见 eybuild API 参考):
char * romPrefix (char * cginame);
char * cgiPrefix (char * cginame);
WEB2BIN 用于将静态的文件生成 C 文件, 并被编译到 CGI 程序内部的虚目录中去, 虚目录是由 .map 文件中定义的.
下面举一个例子,
<IMG SRC="<% =romPrefix(url) %>/image/abc.jpg">
这里根据 url 的值和应用环境不同将可能有三类重要的返回值:
1. "" 空串,
表示引用本地文件系统中的文件
2. "http://ip/cgi-bin/xx.cgi?file="
表示引用外部一个CGI 文件中图片文件, 当然也可以是本身
3. "/goform/myForm?file="
表示 GoAhead 的ROM file 中图片.
谢谢 kwest 的支持. 同时希望提供出更建议和问题, 以促进 eybuild 的演进.
[ 本帖最后由 newzy 于 2006-4-14 16:41 编辑 ]
JGAME 回复于:2006-04-25 16:46:06
我看也不怎么样,,,不如写成
fastcgi 是吧..
jnow 回复于:2006-04-26 13:45:57
引用:原帖由 sickcat2004 于 2006-4-7 17:10 发表
基本上同意野狼大哥的观点,不是说csp不好,而是有觉得没有必要,多此一举,嵌入式估计需要
对嵌入式开发,还是很有必要的,支持csp!!
newzy 回复于:2006-04-27 13:11:55
引用:原帖由 JGAME 于 2006-4-25 16:46 发表
我看也不怎么样,,,不如写成
fastcgi 是吧..
经过对FastCGI组件的近 1 个月的严密测试,
现在我可以非常自信地告诉你, [color=Red][size=4]eybuild 0.8.4版 已经对 FastCGI 有了非常完美的支持.[/size][/color]
原有的代码, 只要中只要加上如下两句, 就可以在CGI 和 FastCGI 之间进行切换使用, 其它原代码原幅不动:
[color=Blue]#ifdef[/color] HAVE_FASTCGI
BEGIN_FASTCGI_LOOP();
[color=Blue]#endif[/color] [color=Green]/* HAVE_FASTCGI */[/color]
[color=Blue]#ifdef [/color]HAVE_FASTCGI
END_FASTCGI_LOOP();
[color=Blue]#endif[/color] [color=Blue]/* HAVE_FASTCGI */[/color]
请这里下载 eybuild 0.8.4版:
[size=4]http://www.eybuild.com/develop/download/eybuild-00-08-04.tar.gz[/size]
中文手册 0.4:
[size=4]http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.htm
http://www.eybuild.com/develop/doc/manual/eyBuild_manual_ch.pdf[/size]
附件是一个留言本程序(windows版) (其中libfcgi.dll来自FastCGI提供的库, http://www.fastcgi.com/dist, 将libfcgi.dll复制到 windows 系统目录, 如 system32)
源文件可在 {eybuild开发包}/project/review/ 目录找到
[ 本帖最后由 newzy 于 2006-4-27 13:16 编辑 ]
review.rar
xinglp 回复于:2006-04-28 17:20:17
引用:原帖由 newzy 于 2006-4-27 13:11 发表
#ifdef HAVE_FASTCGI
BEGIN_FASTCGI_LOOP();
#endif /* HAVE_FASTCGI */
#ifdef HAVE_FASTCGI
END_FASTCGI_LOOP();
#endif /* HAVE_FASTCGI */
while (FCGI_Accept()>=0)
{
...
}
你们把FastCGI 弓虽 女干 成这个样子了
newzy 回复于:2006-04-28 17:44:33
是地,
是对 while (FCGI_Accept()>=0) 做了一层封装, 以适应eybuild 平台库, 以及扩展性和向后兼容性.
原型被定义成:
/* begin fast cgi loop */
#define BEGIN_FASTCGI_LOOP() \
while (FCGI_Accept() >= 0) { \
if (ERROR == ebParseRequest()) \
break;
/* end fastcgi loop */
#define END_FASTCGI_LOOP() \
}
#endif /* HAVE_NO_CGIMAIN */
[ 本帖最后由 newzy 于 2006-4-29 08:51 编辑 ]
xinglp 回复于:2006-04-29 15:36:39
如果不清楚FastCGI机制的用户,打算用你们的产品直接从CGI到FastCGI,然后他直接在两端加上
BEGIN_FASTCGI_LOOP();END_FASTCGI_LOOP(); 然而在这中间他们用了malloc,呵呵......
你应该知道FastCGI这项技术为什么没有流行起来的原因吧,当初很多人就是这么干的,然后....
再然后他们喊着FastCGI不稳定,开发难度高,其实是他们原始的程序不够严密,甚至说根本上就有隐含的错误,只是在CGI的机制下没有表现出来罢了,但是FastCGI要求把程序写到和守护进程一样的严密级别,其实这也没有什么难得,主要是从一开编程就养成良好的习惯,这也是一个合格程序员的基本要求。
这位牛兄,你说呢?
[ 本帖最后由 xinglp 于 2006-4-29 15:37 编辑 ]
北京野狼 回复于:2006-04-29 16:53:23
引用:原帖由 xinglp 于 2006-4-29 15:36 发表
如果不清楚FastCGI机制的用户,打算用你们的产品直接从CGI到FastCGI,然后他直接在两端加上
BEGIN_FASTCGI_LOOP();END_FASTCGI_LOOP(); 然而在这中间他们用了malloc,呵呵......
你应该知道FastCGI这项技术为什 ...
不能这么说。 非要求每个程序都写得及其严禁,算法精密是错误的。 商业软件只有两个要求
第一要是能用的,第二是稳定。
php等之所以流行就是因为入门简单。 说程序写严密了没有什么难的,你这属于在技术的陷阱里面意淫中。
xinglp 回复于:2006-04-29 18:23:01
引用:原帖由 北京野狼 于 2006-4-29 16:53 发表
不能这么说。 非要求每个程序都写得及其严禁,算法精密是错误的。 商业软件只有两个要求
第一要是能用的,第二是稳定。
php等之所以流行就是因为入门简单。 说程序写严密了没有什么难的,你这属于在技术 ...
哼哼,我发现你一直喜欢和人吵架,上次和台湾的那个家伙就是
引用:原帖由 北京野狼 于 2006-4-29 16:53 发表
你这属于在技术的陷阱里面意淫中
不是陷阱,更不是意淫,抛开FCGI 甚至抛开具体的语言,你说的 "第一要是能用的,第二是稳定"
你是做什么的?估计不是在银行部门做应用吧,估计你也不是在千万级访问应用吧,
是不是做ADSL猫里面的程序,哼哼,那样的话 ~~~~~~~~~~~~~
BTW:写程序严格一点有错么??????????? 真正意淫的是你吧
引用:原帖由 北京野狼 于 2006-4-29 16:53 发表
第一要是能用的,第二是稳定。
[ 本帖最后由 xinglp 于 2006-4-29 18:35 编辑 ]
xinglp 回复于:2006-04-29 18:26:46
引用:原帖由 newzy 于 2006-4-28 17:44 发表
是地,
是对 while (FCGI_Accept()>=0) 做了一层封装, 以适应eybuild 平台库, 以及扩展性和向后兼容性.
原型被定义成:
/* begin fast cgi loop */
#define BEGIN_FASTCGI_LOOP() \
while (FCGI_Acc ...
你们怎么什么东西都喜欢封装,里面有没有封装别的什么东西呀,backdoor什么的,呵呵开玩笑?
[ 本帖最后由 xinglp 于 2006-5-4 15:45 编辑 ]
北京野狼 回复于:2006-04-29 22:49:43
引用:原帖由 xinglp 于 2006-4-29 18:23 发表
哼哼,我发现你一直喜欢和人吵架,上次和台湾的那个家伙就是
不是陷阱,更不是意淫,抛开FCGI 甚至抛开具体的语言,你说的 "第一要是能用的,第二是稳定"
你是做什么的?估计不是在银行 ...
我和台湾那个? 争论google的问题那次?
你还喜欢幻想。真要做一个好的猫的程序,才是不能出错,网站出错有什么关系。
我不做千万级别的网站,我怎么会用c写cgi.
我对你和LZ的钻研精神很佩服,不过无论是fastcgi还是csp都是无实际意义的技术。
[ 本帖最后由 北京野狼 于 2006-4-29 23:10 编辑 ]
xinglp 回复于:2006-04-30 07:25:44
你和那些Linux狂热者一样, 不合你争辩了? In your word,无实际意义
xplus 回复于:2006-04-30 09:34:18
好东西
北京野狼 回复于:2006-04-30 10:03:00
心爱的被否定的确不爽。
大众的选择是最好的说明。即便你那个论坛能比discuz更出色,更高效。一个fastcgi程序员月薪比php高多少,一台服务器才多少钱。
过于狂热一个产品,不够理智才象那些linux狂热者。 不多说了,祝你好运
xinglp 回复于:2006-04-30 17:15:21
我并没有认为你说的话否认了什么,对于这个东西我比你清楚,你说的话也没有让我丝毫不爽,你是不是很失望,呵呵,我也并没有狂热这个产品。
顺便说一下,如果你的C CGI不在话下,那么C FastCGI也不应该是问题,稍微转变一下思路就可以了,
FastCGI并不比CGI难写,甚至还可以利用FastCGI的机制简化一些东西, 在循环体的外面不必太注重效率(毕竟只执行一次),这样就可以在循环体的外部做许多准备工作,为循环体内部尽可能的准备好一切,这样,有时候反而比普通cgi更容易实现某些功能,同样是一个计数器,你可以想象两者的不同,孰难孰易,如果你的程序不能工作简单的修改以FastCGI的方式运行,你的程序肯定有问题,
关于:"一个fastcgi程序员月薪比php高多少,一台服务器才多少钱",我还没有凭那个FastCGI论坛得到任何收益,目前我还是一个挣扎在温饱线上的学生,也没有资金购买好的机器,只能用理想的算法解决问题,我也不清楚你说的一台服务器多少钱,我的程序可以在基本不值钱的机器上运行的很好,效果应该不会比在你说得多少钱的服务器上差,数据库我用集群的,Web我可以用FastCGI实现负载均衡和冗余。
"心爱的被否定的确不爽" 不是什么心爱的,呵呵,只是玩玩而已!我现在要做的是采用完成端口方式实现一个Web并嵌如MySQL实现一个exe的Web应用,再发展是做成嵌入式,用到智能家电什么的,呵呵 和你是同行了
[ 本帖最后由 xinglp 于 2006-4-30 17:22 编辑 ]
issin 回复于:2006-05-10 11:38:53
麻烦提供linux环境开发示例,谢谢!
newzy 回复于:2006-05-10 13:54:31
eybuild 开发包中的示例在 linux 和 windows 上源文件是共用的,
linux 下的项目文件在unix 目录, windows 下的项目文件在 win32 目录, 见:
eybuild/project/demo/unix
eybuild/project/demo/win32
eybuild/project/review/unix
eybuild/project/review/win32
eybuild/project/raw/unix
eybuild/project/raw/win32
例, Linux 下编译:
cd eybuild/project/demo/unix
make all
cp ./demo.cgi $CGI-BIN/
Good Luck!
issin 回复于:2006-05-12 15:41:11
正在做一个视像电话的cgi开发,觉得eybuild是个不错的工具,请多指教。
xinglp 回复于:2006-05-13 13:14:01
我准备做一个类似模板的东东 和你竞争
newzy 回复于:2006-05-15 13:17:54
引用:原帖由 issin 于 2006-5-12 15:41 发表
正在做一个视像电话的cgi开发,觉得eybuild是个不错的工具,请多指教。
希望 eybuild 能给你们带来方便.
引用:原帖由 xinglp 于 2006-5-13 13:14 发表
我准备做一个类似模板的东东 和你竞争
祝你能比我们做得更好.
xinglp 回复于:2006-05-16 10:46:12
引用:原帖由 newzy 于 2006-5-15 13:17 发表
祝你能比我们做得更好.
不过我们的定位不一样 我主要做web应用
我的原则是不改变原来的程序流程,只是一个模板,有程序员自己使用
grt8000 回复于:2006-05-17 17:45:01
不开放源码?在非x86的cpu上怎么用?
toarms 回复于:2006-06-23 14:29:04
yes
zzm9981 回复于:2006-11-29 13:16:25
用shttpd作服务器,Lua作脚本引擎,CGILua作开发框架。
这三个都是开源项目,组合起来非常完美,总的大小在200k左右。
运行时占用内存在1M左右。
shttpd和Lua都是C写的,所以移植性很好,我已经把他们移植到
了对C标准库支持最差的WinCE,其他的平台就容易多了。我没有
使用标准的CGI方式,而是把Lua引擎直接嵌入到了shttpd里,所以
每一个请求只使用一个线程来处理,速度比标准的CGI要快。
Lua本身是一个非常简单的语言,最近也变得越来越流行,CGILua则
是一套用Lua写的CGI开发框架,支持内嵌到HTML中,也支持直接
print出页面来。
因为用到的组件都是开源的,所以我的这个套装也会开源,现在正在
打磨,等相对稳定之后就会释放出来。
pilgrim_kevin 回复于:2007-01-24 17:28:06
楼上的东东,非常期待。
pilgrim_kevin 回复于:2007-01-24 17:30:49
搂主的eybuild不开源,不知道能否透露一下价格几何,悄悄话给我。我想在arm平台上编译。
|