近期求学到了《深刻了然放区救济总会结机种类》的第3壹章网络编制程序,在最终壹节是多少个名称叫Tiny的小型web服务器的落实,源代码书中曾经交付,那里就不再复制粘贴了。那篇小博客首要记录一下课后题10的解答。原标题为:
     写出CGI
adder函数的HTML表单。你的表单应该包涵多个文本框,用户将索要相加的四个数字填在那七个文本框中。你的表单应该运用GET方法请求内容。
   
 因为小编原先没接触过HTML表单,先百度之,找到了w三school的HTML教材,看了弹指间表单的有个别,写出了三个很粗大略的小表单,命名叫index.html:

  近日学习到了《深刻明白计算机种类》的第一一章互连网编制程序,在最终一节是1个名称为Tiny的微型web服务器的贯彻,源代码书中早就付出,这里就不再复制粘贴了。那篇小博客主要记录一下课后题拾的解答。原标题为:
     写出CGI
adder函数的HTML表单。你的表单应该包含两个文本框,用户将须要相加的多少个数字填在那多少个文本框中。你的表单应该使用GET方法请求内容。
   
 因为本身在此之前没接触过HTML表单,先百度之,找到了w3school的HTML教材,看了弹指间表单的有的,写出了一个非常粗略的小表单,命名称叫index.html:

《深切精晓放区救济总会括机系列》tiny服务器——一,深刻理解放区救济总会结机种类

  近日求学到了《深刻掌握计算机连串》的第31章互联网编制程序,在结尾1节是二个名叫Tiny的微型web服务器的兑现,源代码书中曾经交给,那里就不再复制粘贴了。那篇小博客首要记录一下课后题十的解答。原标题为:
     写出CGI
adder函数的HTML表单。你的表单应该包含七个文本框,用户将索要相加的多少个数字填在那三个文本框中。你的表单应该采纳GET方法请求内容。
   
 因为自个儿在此以前没接触过HTML表单,先百度之,找到了w3school的HTML教材,看了眨眼之间间表单的一对,写出了一个很简短的小表单,命名叫index.html:

 1 <!DOCTYPE html>
 2 <html>
 3 <body>
 4 
 5 <p>
 6 please enter two numbers:<br>
 7 </p>
 8 
 9 <form action="/cgi-bin/adder">
10   The first number:
11   <input type="number" name="num1"> <br>
12   The second number:
13   <input type="number" name="num2"> <br>
14   <input type="submit" value="Submit">
15 </form>
16 
17 </body>
18 </html>

  那是输入localhost:888八过后浏览器展现的效益图。8888是本人设置的tiny的端口,至于缘何一贯不后面包车型客车/index.html,是因为笔者在源代码上校index.html设为了主界面。

澳门金沙国际 1

能够响应html表单的Tiny,深远驾驭计算机序列。  大家能够不管道输送入八个数字,点击Submit按钮,结果一定是畸形的。。

澳门金沙国际 2

  如上海图书馆所示,结果显示的是0。注目的在于该网页的地方栏处,大家看到”localhost:8888/cgi-bin/adder?num壹=22&num二=2二”,看过tiny源码大家就会精通,adder.c所要分析的数量是在&符号两边的纯数字,也正是说,要想正确的被adder.c程序求和,地址栏应该显得”localhost:8888/cgi-bin/adder?2二&22″才对。现身上图中的错误的来由尽管,adder程序没有收获三个参数的数值大小。化解措施很简短,只必要在adder.c程序里把多少个数字取出来就行了,整个adder.c代码如下所示:

 1 #include "net.h"
 2 
 3 int main(void)
 4 {
 5     char *buf, *p;
 6     char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE];
 7     char tmp[MAXLINE];
 8     int n1 = 0, n2 = 0;
 9 
10     if ( (buf = getenv("QUERY_STRING")) != NULL) {
11         p = strchr(buf, '&');
12         *p = '\0';
13 
14         strcpy(arg1, buf);
15         strcpy(arg2, p+1);
16 
17         //用来取出两个参数的代码
18         p = strchr(arg1, '=');
19         strcpy(arg1, p+1);
20         p = strchr(arg2, '=');
21         strcpy(arg2, p+1);
22 
23         n1 = atoi(arg1);
24         n2 = atoi(arg2);
25     }
26 
27     sprintf(content, "QUERY_STRING = %s", buf);
28     sprintf(content, "Welcome to add.com: ");
29     //sprintf(content, "arg1=%s, arg2=%s\n", arg1, arg2);  调试输出参数
30     sprintf(content, "%sThe Internet addition portal.\r\n<p>", content);
31     sprintf(content, "%sThe answer is: %d + %d = %d\r\n<p>",
32             content, n1, n2, n1 + n2);
33     sprintf(content, "%sThanks for visiting!\r\n", content);
34 
35     //generate the http response
36     printf("Connection: close\r\n");
37     printf("Content-length: %d\r\n", (int)strlen(content));
38     printf("Content-type: text/html\r\n\r\n");
39     printf("%s", content);
40     fflush(stdout);
41 
42     exit(0);
43 }

  重新编译adder.c之后,大家重新在浏览器输入网站:localhost:888八,输入七个数字,结果如图:

澳门金沙国际 3

  至此,大家学习Tiny的首先等级便是完事了,达成了课后题1一.10的渴求,能够处理来自浏览器的静态请求和动态请求。不过,由于大家的Tiny叁回只可以处理2个连接,功用太低了。下1节我们就要对Tiny实行一下改革,使其能够帮助并发处理。

方今攻读到了《深切精通放区救济总会结机体系》的第31章网络编制程序,在结尾一节是一…

前边写了《深切领会放区救济总会括机种类》1书中的Tiny服务器的源码解析,不过书中并从未介绍怎样运维Tiny,上边就介绍下怎么让Tiny运营起来。

 1 <!DOCTYPE html>
 2 <html>
 3 <body>
 4 
 5 <p>
 6 please enter two numbers:<br>
 7 </p>
 8 
 9 <form action="/cgi-bin/adder">
10   The first number:
11   <input type="number" name="num1"> <br>
12   The second number:
13   <input type="number" name="num2"> <br>
14   <input type="submit" value="Submit">
15 </form>
16 
17 </body>
18 </html>
 1 <!DOCTYPE html>
 2 <html>
 3 <body>
 4 
 5 <p>
 6 please enter two numbers:<br>
 7 </p>
 8 
 9 <form action="/cgi-bin/adder">
10   The first number:
11   <input type="number" name="num1"> <br>
12   The second number:
13   <input type="number" name="num2"> <br>
14   <input type="submit" value="Submit">
15 </form>
16 
17 </body>
18 </html>

Tiny的源文件有tiny.c、csapp.c和csapp.h七个。此外要在根目录下新建cgi-bin目录用于存放CGI程序。

  那是输入localhost:888八事后浏览器呈现的意义图。8888是本身设置的tiny的端口,至于缘何平素不前边的/index.html,是因为本身在源代码上校index.html设为了主界面。

  那是输入localhost:888八事后浏览器呈现的效率图。8888是本身设置的tiny的端口,至于何以一直不前边的/index.html,是因为自个儿在源代码中校index.html设为了主界面。

深深领会放区救济总会计机体系(原书第3版) PDF清晰汉语版 
http://www.linuxidc.com/Linux/2015-03/114720.htm

澳门金沙国际 4

澳门金沙国际 5

方法一:

1.将全体源文件tiny.c、csapp.c和csapp.h放在同3个索引下。别的在同样目录下放置photo.jpg作为测试文件。使用命令:

$gcc -o tiny tiny.c csapp.c -lpthread

  注:加-lpthread是因为csapp.c中稍加函数用了10二线程库
贰.将测试用CGI程序嵌入cgi-bin目录下,并编写翻译成可执行程序

$gcc -o adder adder.c

3.周转Tiny程序,并点名端口号(拾2四–49151可用,其余为闻明端口)

$./tiny 1024

4.现行反革命Tiny已经运维起来了,打开浏览器就可以访问了
访问静态内容
澳门金沙国际 6
走访动态内容
澳门金沙国际 7

  大家可以随便输入五个数字,点击Submit按钮,结果一定是非符合规律的。。

  大家能够任由输入八个数字,点击Submit按钮,结果一定是颠叁倒4的。。

澳门金沙国际,方法2:使用Makefile完毕Tiny的编写翻译链接:

前一段时间看过Makefile的有的学问,所以自身就试一下用make命令来运作Tiny。

1.与方法1两样的是,在做事目录下新建include目录,把csapp.h放置到该目录下。然后编写Makefile如下

CFLAGS= -Wall -g -I./include 
LIBS=-lpthread

tiny: tiny.o csapp.o 
    cc -o tiny tiny.o csapp.o $(LIBS)

clean:
    rm *.o tiny 

  Makefile中接纳CFLAGS设置编写翻译参数并点名头文件的职位为./include。用LIBS钦定要链接的库。
二.在干活目录中输入指令make,即可实现Tiny的编写翻译链接。
澳门金沙国际 8
三.接续的操作与艺术1是1律的,不再赘言

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-04/116046.htm

澳门金沙国际 9

澳门金沙国际 10

澳门金沙国际 11

  如上海教室所示,结果展现的是0。注意在该网页的地点栏处,大家看出”localhost:8888/cgi-bin/adder?num一=2贰&num二=2二”,看过tiny源码大家就会通晓,adder.c所要分析的多寡是在&符号两边的纯数字,也正是说,要想正确的被adder.c程序求和,地址栏应该展现”localhost:8888/cgi-bin/adder?2二&2二”才对。现身上海教室中的错误的来由就是,adder程序未有获得多个参数的数值大小。化解办法很不难,只须求在adder.c程序里把七个数字取出来就行了,整个adder.c代码如下所示:

  如上海教室所示,结果呈现的是0。注意在该网页的地方栏处,我们看来”localhost:8888/cgi-bin/adder?num一=2二&num2=22″,看过tiny源码大家就会知晓,adder.c所要分析的多少是在&符号两边的纯数字,也正是说,要想正确的被adder.c程序求和,地址栏应该出示”localhost:8888/cgi-bin/adder?2二&22″才对。出现上海教室中的错误的原由就是,adder程序没有赢得三个参数的数值大小。消除办法一点也不细略,只供给在adder.c程序里把八个数字取出来就行了,整个adder.c代码如下所示:

 1 #include "net.h"
 2 
 3 int main(void)
 4 {
 5     char *buf, *p;
 6     char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE];
 7     char tmp[MAXLINE];
 8     int n1 = 0, n2 = 0;
 9 
10     if ( (buf = getenv("QUERY_STRING")) != NULL) {
11         p = strchr(buf, '&');
12         *p = '\0';
13 
14         strcpy(arg1, buf);
15         strcpy(arg2, p+1);
16 
17         //用来取出两个参数的代码
18         p = strchr(arg1, '=');
19         strcpy(arg1, p+1);
20         p = strchr(arg2, '=');
21         strcpy(arg2, p+1);
22 
23         n1 = atoi(arg1);
24         n2 = atoi(arg2);
25     }
26 
27     sprintf(content, "QUERY_STRING = %s", buf);
28     sprintf(content, "Welcome to add.com: ");
29     //sprintf(content, "arg1=%s, arg2=%s\n", arg1, arg2);  调试输出参数
30     sprintf(content, "%sThe Internet addition portal.\r\n<p>", content);
31     sprintf(content, "%sThe answer is: %d + %d = %d\r\n<p>",
32             content, n1, n2, n1 + n2);
33     sprintf(content, "%sThanks for visiting!\r\n", content);
34 
35     //generate the http response
36     printf("Connection: close\r\n");
37     printf("Content-length: %d\r\n", (int)strlen(content));
38     printf("Content-type: text/html\r\n\r\n");
39     printf("%s", content);
40     fflush(stdout);
41 
42     exit(0);
43 }
 1 #include "net.h"
 2 
 3 int main(void)
 4 {
 5     char *buf, *p;
 6     char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE];
 7     char tmp[MAXLINE];
 8     int n1 = 0, n2 = 0;
 9 
10     if ( (buf = getenv("QUERY_STRING")) != NULL) {
11         p = strchr(buf, '&');
12         *p = '\0';
13 
14         strcpy(arg1, buf);
15         strcpy(arg2, p+1);
16 
17         //用来取出两个参数的代码
18         p = strchr(arg1, '=');
19         strcpy(arg1, p+1);
20         p = strchr(arg2, '=');
21         strcpy(arg2, p+1);
22 
23         n1 = atoi(arg1);
24         n2 = atoi(arg2);
25     }
26 
27     sprintf(content, "QUERY_STRING = %s", buf);
28     sprintf(content, "Welcome to add.com: ");
29     //sprintf(content, "arg1=%s, arg2=%s\n", arg1, arg2);  调试输出参数
30     sprintf(content, "%sThe Internet addition portal.\r\n<p>", content);
31     sprintf(content, "%sThe answer is: %d + %d = %d\r\n<p>",
32             content, n1, n2, n1 + n2);
33     sprintf(content, "%sThanks for visiting!\r\n", content);
34 
35     //generate the http response
36     printf("Connection: close\r\n");
37     printf("Content-length: %d\r\n", (int)strlen(content));
38     printf("Content-type: text/html\r\n\r\n");
39     printf("%s", content);
40     fflush(stdout);
41 
42     exit(0);
43 }

  重新编写翻译adder.c之后,大家再度在浏览器输入网站:localhost:888八,输入四个数字,结果如图:

  重新编写翻译adder.c之后,大家再度在浏览器输入网站:localhost:888八,输入多少个数字,结果如图:

澳门金沙国际 12

澳门金沙国际 13

  至此,大家学习Tiny的第3等级正是完毕了,完毕了课后题1一.拾的须求,可以处理来自浏览器的静态请求和动态请求。然则,由于大家的Tiny壹回只可以处理四个一而再,功能太低了。下1节我们就要对Tiny进行一下革新,使其能够扶助并发处理。

  至此,大家学习Tiny的率先品级正是成功了,完结了课后题11.拾的渴求,能够处理来自浏览器的静态请求和动态请求。但是,由于大家的Tiny二次只可以处理2个老是,作用太低了。下一节大家就要对Tiny进行一下核对,使其能够帮助并发处理。

相关文章