本帖最后由 伊海 于 2014-9-27 16:42 编辑
板书19 C语言也能开发网站
3、动态Web的原理:浏览器向服务器发送请求,服务器响应请求然后将响应的结果以HTML的方式发送给浏览器,浏览器将HTML显示出来。
4、本课程讲解的C语言开发Web的技术叫“CGI”,网上搜索相关资料的关键字“C语言CGI”。
5、课程需要HTML的基础,如果HTML不熟悉的话请参考《自己动手写网站》的课程, 视频下载页面: http://www.rupeng.com/forum/forum-28-1.html
6、环境准备:
a)下载安装apache,此软件是Http服务器,和Tomcat、IIS等类似。推荐下载地址:http://www.skycn.com/soft/1218.html。可能遇到的问题,已经安装了Tomcat、IIS等软件,将他们卸载(也可以修改Apache的端口,不过新手还是直接卸载其他软件比较好)。
b)VC、C-Free、DevC++、TC、PellesC等任意一款可以开发控制台C程序的开发工具(几乎所有C开发工具都支持)。课上将使用VC。
7、开发第一个CGI程序
a)新建控制台程序
b)代码: - #include "stdafx.h"
- int main(int argc, char* argv[])
- {
- printf("Contenttype:text/html\n\n"); //根据HTTP协议,这里一定要有个空行。
- printf("Hello RuPeng!");
- return 0;
- }
复制代码c编译生成exe程序(比如aaa.exe),将exe拷贝到apache的cgi-bin目录, 一般是C:\Program Files\ApacheSoftware Foundation\Apache2.2\cgi-bin
d)打开浏览器,敲入:http://127.0.0.1/cgi-bin/aaa.exe
e)分析:127.0.0.1是什么?main程序就是普通的控制台程序,printf只是前边多了一句“printf("Contenttype:text/html\n\n");”,暂时不关心它的意义。
f)每次修改后都要重新拷贝exe到cgi-bin,有没有简单的方法?VC中设置输出路径:设置(settings)→连接(Link)→输出文件名(Output FileName)。注意每次修改要重新编译才能起作用。
8、一定注意程序是运行在服务器上的,比如将CGI程序放到如鹏的服务器上,那么aaa.exe是运行在如鹏服务器上的,只不过是把printf的结果打印到用户的浏览器上而已。CGI程序中可以使用所有的C语言特性、函数、调用ODBC访问数据库等等。如果不调用Windows 的函数,则可以一行不动的移植到Linux/Unix等操作系统下。
9、输出完整的HTML页面:
- #include "stdafx.h"
- #include "stdlib.h"//add getenv
- int main(int argc, char* argv[])
- {
- printf("Contenttype:text/html\n\n"); //根据HTTP协议,这里一定要有个空行。
- printf("<html>");
- printf("<body>");
- printf("hello <a >RuPeng.com</a>");
- printf("</body>");
- printf("</html>");
- return 0;
- }
复制代码
10、输出环境变量:
a)getenv,在stdlib.h中, char * getenv(const char *),参数是环境变量的名字,返回值是环境变量的值,都是字符串(确切的说是字符指针)类型。
b)printf("%s ",getenv("SERVER_SOFTWARE"));
c)可选值:
HTTP_USER_AGENT
递交表单的浏览器的名称、版本 和其他平台性的附加信息。
SERVER_NAME
CGI脚本运行时的主机名和IP地址.
SERVER_SOFTWARE
你的服务器的类型如:
CERN/3.0
或
NCSA/1.3.
SCRIPT_NAME
指向这个CGI脚本的路径,
是在URL中显示的(如,
/cgi-bin/thescript).
REMOTE_HOST
递交脚本的主机名,这个值不能被设置.
REMOTE_ADDR
递交脚本的主机IP地址.
QUERY_STRING
脚本参数或者表单输入项(如果是用GET递交).
QUERY_STRING
包含URL中问号后面的参数.
CONTENT_TYPE
如果表单是用POST递交,
这个值将是
application/x-www-form-urlencoded.
在上载文件的表单中,
content-type
是个
multipart/form-data.
CONTENT_LENGTH
对于用POST递交的表单,
标准输入口的字节数.
REQUEST_METHOD POST或 GET,取决于你的表单是怎样递交的.
HTTP_REFERER
递交表单的文本的
URL,不是所有的浏览器都发出这个信息,不要依赖它
HTTP_ACCEPT
浏览器能直接接收的Content-types
GATEWAY_INTERFACE
运行的CGI版本.
SERVER_PROTOCOL
服务器运行的HTTP协议.
SERVER_PORT
服务器运行的TCP口.
11、怎么无法换行?
“\n”是文本级别的换行,浏览器把”<br/>”才当成换行。但是“a\nb”和“ab”没有不同吗?看一看,分析一下。
12、请求参数
a)可以通过地址给CGI程序传递参数“aa.exe?name=tom”, 参数和CGI名称之间用“?”间隔,参数的“名”、“值”之间用“=”间隔
b)取参数printf("%s\n",getenv("QUERY_STRING"));
c)打招呼,单个参数:
char* pQueryStr=getenv("QUERY_STRING");
char pName[256];
sscanf(pQueryStr,"name=%s",pName);
printf("Hello %s!\n",pName);
d)计算器,多个参数。多个参数键值对之间用“&”分割:
char* pQueryStr=getenv("QUERY_STRING");
int i1,i2;
sscanf(pQueryStr,"i1=%i&i2=%i",&i1,&i2);
printf("%i+%i=%i\n",i1,i2,i1+i2);
|