免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 22099 | 回复: 66
打印 上一主题 下一主题

[Web] [原创]大家进来看看, 用 C 写的 CGI 留言板程序 (CSP 源程序分析) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-15 11:37 |只看该作者 |倒序浏览
老朋友, 如果对CSP和eybuild仍不理解, 请先到 29 楼看完示例后再发表意见, 谢谢支持.

可以将 C 语言直接插入到 HTML中来编写 CGI 程序叫 CSP   (类似 ASP/JSP/PHP啦)
用 CSP 大大降低了直接用 C 写 CGI 程序的难度, 并且源程序非常直观.

下面是一个简单的留言板 CSP 源程序, 包括包括两个 CSP 文件, 两个 C 文件, 可以稍作修改以实现更复杂的应用(如连接SQL 数据库来实现多用户同时访问的数据存储等):




这里下载源代码: 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


============= review.csp =============

  1. <HTML><HEAD><TITLE>留言本</TITLE>
  2. <META http-equiv=Content-Type content="text/html; charset=gb2312">
  3. <STYLE>P {
  4.         size: 6pt
  5. }
  6. .title {
  7.         COLOR: #ffb6c1
  8. }
  9. </STYLE>

  10. <META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
  11. <BODY>
  12. <P><SPAN class=title>
  13. <CENTER>
  14. <H1>留 言 本</H1></CENTER></SPAN>
  15. <P></P>
  16. <CENTER>
  17. <TABLE style="FONT-SIZE: 9pt" cellSpacing=0 borderColorDark=#ffffff
  18. cellPadding=0 width=650 borderColorLight=#c0c0c0 border=1>
  19.   <TBODY>
  20. <%
  21. @include "../usr/db.h"
  22. {
  23.         RECORD        record;
  24.         void *        fp;

  25.         fp = open_db("rb+");
  26.        
  27.         while(1)
  28.         {
  29.                 if (db_read_next(fp, &record) <= 0)
  30.                         break;
  31. %>
  32.   <TR bgColor=#dadada height=20>
  33.     <TD>作者: <% = (record.name) %> </TD>
  34.     <TD>性别: <% = (record.sex) %> </TD>
  35.     <TD>邮件: <% = (record.mail) %> </TD>
  36.     <TD>时间: <% =(record.now) %></TD></TR>
  37.   <TR height=50>
  38.     <TD colSpan=4><xmp><% = (record.msg) %></xmp></TD></TR>
  39. <%
  40.         } /* for */
  41.        
  42.         close_db(fp);
  43. }
  44. %>
  45. </TBODY></TABLE></CENTER>
  46. <FORM action=<% =cgiPrefix(NULL) %>/store.csp method=post>
  47.         <CENTER>
  48.         <P>姓名: <INPUT name=name>
  49.         <P>性别: <INPUT type=radio value=0 name=sex>女性
  50.                           <INPUT type=radio value=1 name=sex>男性
  51.         <P>EMail:<INPUT name=email type=?Text?>
  52.         <P>我要留言:</P><TEXTAREA name=content rows=10 cols=95></TEXTAREA>
  53.         <P><INPUT type=submit value="发 表">
  54.        
  55.         <INPUT type=reset value=清除重写></P>
  56.         </CENTER>
  57. </FORM>
  58. </BODY></HTML>
复制代码


============= store.csp =============

  1. <html>
  2. <head>
  3.         <meta http-equiv="refresh" content="1; url=<% =cgiPrefix(NULL) %>/review.csp">
  4. <title>正在跳转...</title>
  5. </head>
  6. <body>
  7. <%
  8. @include "../usr/db.h"
  9. @include <time.h>
  10. {
  11.         RECORD        record;
  12.         void *        fp;
  13.         time_t         t;

  14.         memset(&record, 0, sizeof(record));

  15.         if (        '\0' == (strncpy(record.name, getParameter("name"), sizeof(record.name)-1))[0] ||
  16.                         '\0' == (strncpy(record.sex, getParameter("sex"), sizeof(record.sex)-1))[0] ||
  17.                         '\0' == (strncpy(record.mail, getParameter("email"), sizeof(record.mail)-1))[0] ||
  18.                         '\0' == (strncpy(record.msg, getParameter("content"), sizeof(record.msg)-1))[0] )
  19.         {
  20.                 ebprintf(ebfp, "'名称/性别/Email/内容' 均不能包为空");       
  21.         }
  22.         else
  23.         {
  24.                 /* get time */
  25.                 t = time(NULL);
  26.                 strftime(record.now, sizeof(record.now)-1,
  27.                                 "%Y-%m-%d %H:%M:%S", localtime(&t));
  28.                 /* convert sex */
  29.                 if (!strcmp("0", record.sex))
  30.                         strcpy(record.sex, "女");
  31.                 else
  32.                         strcpy(record.sex, "男");
  33.                
  34.                 fp = open_db("ab+");
  35.                 db_insert(fp, &record);
  36.                 close_db(fp);
  37.                
  38.                 ebprintf(ebfp, "留言成功,正在跳转...");
  39.         }
  40. }
  41. %>

  42. </body>
  43. </html>
复制代码


============= db.h =============

  1. #ifndef _INC_DB_H_
  2. #define _INC_DB_H_

  3. #define DB_NAME                "msg.db"

  4. typedef struct {
  5.         char                 name[16];
  6.         char                 sex[16];
  7.         char                 mail[16];
  8.         char                 now[24];
  9.         size_t                 msg_len;
  10.         char                 msg[512];
  11. } RECORD;


  12. extern void * open_db(char * mode);
  13. extern int close_db(void * fp);
  14. extern int db_read_next(void * fp, RECORD * rcd);
  15. extern int db_insert(void * fp, RECORD * rcd);

  16. #endif /* _INC_DB_H_ */
复制代码


============= db.h =============

  1. #include <stdio.h>
  2. #include <string.h>

  3. #include "db.h"

  4. /*
  5. open data base
  6. */
  7. void * open_db(char * mode)
  8. {
  9.         FILE *                 fp;
  10.        
  11.         fp = fopen(DB_NAME, mode);
  12.        
  13.         return fp;
  14. }

  15. /*
  16. close data base
  17. */
  18. int close_db(void * fp)
  19. {
  20.         if (NULL != fp)
  21.                 fclose(fp);
  22.        
  23.         return 0;       
  24. }

  25. /*
  26. read record from base
  27. */
  28. int db_read_next(void * fp, RECORD * rcd)
  29. {
  30.         size_t                len;
  31.        
  32.         if (NULL == fp)
  33.                 return -1;
  34.                
  35.         if (feof((FILE*)fp))
  36.                 return 0;
  37.        
  38.         memset(rcd, 0, sizeof(RECORD));
  39.        
  40.         /* read header */
  41.         len = sizeof(RECORD) - sizeof(rcd->msg);
  42.         if (len != (int)fread(rcd, 1, len, fp))
  43.                 return -1;
  44.        
  45.         /* read message body */
  46.         if (rcd->msg_len != fread(rcd->msg, 1, rcd->msg_len, (FILE*)fp))
  47.                 return -1;
  48.        
  49.         return sizeof(RECORD);
  50. }

  51. /*
  52. insert record to data base
  53. */
  54. int db_insert(void * fp, RECORD * rcd)
  55. {
  56.         size_t                len;
  57.        
  58.         if (NULL == fp || fseek(fp, 0, SEEK_END))
  59.                 return -1;
  60.        
  61.         /* write header */
  62.         rcd->msg_len = strlen(rcd->msg);
  63.         len = sizeof(RECORD) - sizeof(rcd->msg);
  64.        
  65.         if (len != fwrite(rcd, 1, len, (FILE*)fp))
  66.                 return -1;
  67.        
  68.         /* write message body */
  69.         if (rcd->msg_len != (fwrite(rcd->msg, 1, rcd->msg_len, (FILE*)fp)))
  70.                 return -1;
  71.        
  72.         return sizeof(RECORD);
  73. }
复制代码

[ 本帖最后由 newzy 于 2006-3-20 18:11 编辑 ]

review.rar

15.32 KB, 下载次数: 166

留言板源程序

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-03-15 11:41 |只看该作者
实在不理解这种语言有什么意义

论坛徽章:
0
3 [报告]
发表于 2006-03-15 11:55 |只看该作者
原帖由 北京野狼 于 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


如有不足, 请指教.

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2006-03-15 13:16 |只看该作者
原帖由 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我还是喜欢模板式的。

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2006-03-15 13:18 |只看该作者
原帖由 newzy 于 2006-3-15 11:55 发表


不依赖WEB 服务器:
  CSP 生成的 CGI 程序支持 CGI-1.1 标准, 所以只能支持这个标准的WEB 服务器都能运行它, 如 Apache, IIS, GoAhead, httpd, mini-httpd,  


仍然依赖web服务器

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2006-03-15 13:20 |只看该作者
总之csp也许在特殊情况有的意义。

但是我看开发效率不如直接c+模板方式。 入门难度又远超过php等。至于速度效率,我看也不怎么样。

论坛徽章:
0
7 [报告]
发表于 2006-03-15 14:14 |只看该作者
原帖由 北京野狼 于 2006-3-15 13:16 发表

也许嵌入式WEB开发的确有些意义,至少节省一个perl,php等的解释器。但是仍然需要一个csp的解释器


CSP 不需要解释器, 一般的开发步骤:
(1) 编写 HTML 模板文件
(2) 将可变的语句替换成 CSP 语句, 一般格式: <% 任意C 语句片断 %>
(3) CSP 文件要用 CSP2BIN 转换成 C 文件, C 程序文件是中间文件.
(4) 将 C 文件连同库用标准的 C 编译器编译成可执行文件, 只是后缀名取作 .cgi.

这个过程几乎跟 JSP/PHP 的开发过程一样, 只是最终生成的后缀名不同而亦.




但是要说节省开发周期,提高代码的可维护性绝对不可能。 用c 写web我还是喜欢模板式的。





HTML 与 C 程序是分离的:
(1) HTML 模板文件主要是由 WEB 开发人员编写, 甚至直接由已有系统从浏览器中”另存为…” 或”查看源文件获得”
(2) HTML中可变的部分插入 C 语句处理, 如调用其它 C 文件中的函数.

两者是明显分离的, 下面这段代码是由上面 review.csp 生成的中间C 文件, 以往直接用C 及 cgilib写出来的结果跟它相差无几, 看看哪个开发次效率更高维护性更好呢?

试试看, 能看出它就是上面留言版的主界面程序吗?



  1. /* NOTE: DO NOT EDIT THIS FILE,
  2. * this file is create by tool (csp2bin version: 00.07.00) automaticly,
  3. * build at: Tue Mar 14 16:43:25 2006
  4. */
  5. /* NOTE: YOU SHOULDN'T ADD THIS FILE TO YOUR PROJECT DIRECTLY,
  6. * When you add `../xx_maplist.c' to your project,
  7. * this file will be added into your project.
  8. *
  9. */

  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <eblib.h>
  13. #include "_review_csp.h"


  14. static int _review_csp___mime_header();

  15. int _review_csp__ (int calldepth, void * ebfp)
  16. {
  17.     int __ret=OK;
  18.     char * __page_name="review.csp";
  19.     char * __page_path="/";
  20.     char * __page_fullname="/review.csp";

  21.     if (calldepth==MAX_CALL_DEPTH)
  22.         __ret=_review_csp___mime_header(ebfp);
  23.     goto_ERROR;

  24.     __ret=(int)ebBufStringAdd(ebfp,
  25.         "<HTML><HEAD><TITLE>&Aacute;&ocirc;&Ntilde;&Ocirc;±&frac34;</TITLE>\n"
  26.         "<META http-equiv=Content-Type content=\"text/html; charset=gb2312\">\n"
  27.         "<STYLE>P {\n"
  28.         "        size: 6pt\n"
  29.         "}\n"
  30.         ".title {\n"
  31.         "        COLOR: #ffb6c1\n"
  32.         "}\n"
  33.         "</STYLE>\n"
  34.         "\n"
  35.         "<META content=\"MSHTML 6.00.2900.2180\" name=GENERATOR></HEAD>\n"
  36.         "<BODY>\n"
  37.         "<P><SPAN class=title>\n"
  38.         "<CENTER>\n"
  39.         "<H1>&Aacute;&ocirc; &Ntilde;&Ocirc; ±&frac34;</H1></CENTER></SPAN>\n"
  40.         "<P></P>\n"
  41.         "<CENTER>\n"
  42.         "<TABLE style=\"FONT-SIZE: 9pt\" cellSpacing=0 borderColorDark=#ffffff \n"
  43.         "cellPadding=0 width=650 borderColorLight=#c0c0c0 border=1>\n"
  44.         "  <TBODY>\n"
  45.         );
  46.     goto_ERROR;

  47.    
  48.     {
  49.     RECORD        record;
  50.     void *        fp;
  51.     fp = open_db("rb+");
  52.    
  53.     while(1)
  54.     {
  55.     if (db_read_next(fp, &record) <= 0)
  56.     break;
  57.     __ret=(int)ebBufStringAdd(ebfp,
  58.         "  <TR bgColor=#dadada height=20>\n"
  59.         "    <TD>×÷&Otilde;&szlig;: "
  60.         );
  61.     goto_ERROR;

  62.     __ret = (int)ebEvaluate(ebfp, "%s", record.name);
  63.     goto_ERROR;

  64.     __ret=(int)ebBufStringAdd(ebfp,
  65.         " </TD>\n"
  66.         "    <TD>&ETH;&Ocirc;±&eth;: "
  67.         );
  68.     goto_ERROR;

  69.     __ret = (int)ebEvaluate(ebfp, "%s", record.sex);
  70.     goto_ERROR;

  71.     __ret=(int)ebBufStringAdd(ebfp,
  72.         " </TD>\n"
  73.         "    <TD>&Oacute;&Ecirc;&frac14;&thorn;: "
  74.         );
  75.     goto_ERROR;

  76.     __ret = (int)ebEvaluate(ebfp, "%s", record.mail);
  77.     goto_ERROR;

  78.     __ret=(int)ebBufStringAdd(ebfp,
  79.         " </TD>\n"
  80.         "    <TD>&Ecirc;±&frac14;&auml;: "
  81.         );
  82.     goto_ERROR;

  83.     __ret = (int)ebEvaluate(ebfp, "%s", record.now);
  84.     goto_ERROR;

  85.     __ret=(int)ebBufStringAdd(ebfp,
  86.         "</TD></TR>\n"
  87.         "  <TR height=50>\n"
  88.         "    <TD colSpan=4><xmp>"
  89.         );
  90.     goto_ERROR;

  91.     __ret = (int)ebEvaluate(ebfp, "%s", record.msg);
  92.     goto_ERROR;

  93.     __ret=(int)ebBufStringAdd(ebfp,
  94.         "</xmp></TD></TR>\n"
  95.         );
  96.     goto_ERROR;

  97.     } /* for */
  98.    
  99.     close_db(fp);
  100.     }
  101.     __ret=(int)ebBufStringAdd(ebfp,
  102.         "</TBODY></TABLE></CENTER>\n"
  103.         "<FORM action="
  104.         );
  105.     goto_ERROR;

  106.     __ret = (int)ebEvaluate(ebfp, "%s", cgiPrefix(NULL));
  107.     goto_ERROR;

  108.     __ret=(int)ebBufStringAdd(ebfp,
  109.         "/store.csp method=post>\n"
  110.         "        <CENTER>\n"
  111.         "        <P>&ETH;&Otilde;&Atilde;&ucirc;&pound;&ordm; <INPUT name=name> \n"
  112.         "        <P>&ETH;&Ocirc;±&eth;&pound;&ordm; <INPUT type=radio value=0 name=sex>&Aring;&reg;&ETH;&Ocirc; \n"
  113.         "                          <INPUT type=radio value=1 name=sex>&Auml;&ETH;&ETH;&Ocirc; \n"
  114.         "        <P>EMail&pound;&ordm;<INPUT name=email type&pound;&frac12;\?Text\?> \n"
  115.         "        <P>&Icirc;&Ograve;&Ograve;&ordf;&Aacute;&ocirc;&Ntilde;&Ocirc;&pound;&ordm;</P><TEXTAREA name=content rows=10 cols=95></TEXTAREA> \n"
  116.         "        <P><INPUT type=submit value=\"·&cent; ±í\"> \n"
  117.         "        \n"
  118.         "        <INPUT type=reset value=&Ccedil;&aring;&sup3;&yacute;&Ouml;&Oslash;&ETH;&acute;></P>\n"
  119.         "        </CENTER>\n"
  120.         "</FORM>\n"
  121.         "</BODY></HTML>\n"
  122.         );
  123.     goto_ERROR;

  124.     if (ERROR == ebBufFlush(ebfp)) return ERROR;

  125.     return __ret;
  126. } /* _review_csp__ */

  127. static int _review_csp___mime_header(void * ebfp)
  128. {
  129.     return ebprintf(ebfp, "Content-type: text/html\n\n");
  130. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2006-03-15 14:24 |只看该作者
原帖由 北京野狼 于 2006-3-15 13:18 发表

仍然依赖web服务器


如果一定要说它依赖于服务器, 那就只能说是依赖于服务器是否支持 CGI 1.1 标准.
而 CGI 1.1 标准是目前 WEB 服务最基本的功能, 流行的WEB 服务器都会支持它.

CSP 生成的文件中间文件是标准 C 文件, 所以可以在任何支持标准 C 的系统的下编译运行 CSP 编写的CGI 程序.

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2006-03-15 14:31 |只看该作者
的确不需要csp的解释器,我说错了。但是既然几乎跟 JSP/PHP 的开发过程一样,那还要csp干吗?

路由器/交换机/网关这些设上装个perl解释器不占用多少空间, 而且这些设备基本都有perl解释器。

很多PDA不是用c开发的,java甚至是必须的。


不理解CSP的应用空间在那里

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2006-03-15 14:33 |只看该作者
原帖由 newzy 于 2006-3-15 14:24 发表


如果一定要说它依赖于服务器, 那就只能说是依赖于服务器是否支持 CGI 1.1 标准.
而 CGI 1.1 标准是目前 WEB 服务最基本的功能, 流行的WEB 服务器都会支持它.

CSP 生成的文件中间文件是标准 C 文件, 所以 ...


我说依赖的意思是,必须使用web服务器。 至于你说的标准和扩展的问题,比php,jsp,perl差远了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP