深入精晓放区救济总会括机种类,让Tiny服务器运维起来

By admin in 美高梅手机版4858 on 2019年4月11日

  近年来求学到了《深远精通计算机体系》的第三壹章互联网编制程序,在最后一节是二个名称叫Tiny的小型web服务器的落实,源代码书中曾经交付,那里就不再复制粘贴了。那篇小博客首要记录一下课后题十的解答。原标题为:
     写出CGI
adder函数的HTML表单。你的表单应该包蕴五个文本框,用户将索要相加的四个数字填在那八个文本框中。你的表单应该利用GET方法请求内容。
   
 因为本身在此以前没接触过HTML表单,先百度之,找到了w三school的HTML教材,看了1晃表单的片段,写出了2个很简短的小表单,命名字为index.html:

  近来攻读到了《浓厚掌握放区救济总会结机连串》的第3一章互连网编制程序,在结尾1节是五个名字为Tiny的小型web服务器的兑现,源代码书中早已付出,那里就不再复制粘贴了。那篇小博客首要记录一下课后题十的解答。原标题为:
     写出CGI
adder函数的HTML表单。你的表单应该包涵七个文本框,用户将须求相加的八个数字填在这三个文本框中。你的表单应该选取GET方法请求内容。
深入精晓放区救济总会括机种类,让Tiny服务器运维起来。   
 因为本身从前没接触过HTML表单,先百度之,找到了w叁school的HTML教材,看了眨眼之间间表单的一对,写出了三个很简单的小表单,命名称为index.html:

《长远领会放区救济总会结机种类》tiny服务器——一,深远明白计算机类别

  近来攻读到了《深刻明白计算机体系》的第二一章互连网编制程序,在最后一节是二个名称为Tiny的袖珍web服务器的贯彻,源代码书中早已付诸,那里就不再复制粘贴了。那篇小博客首要记录一下课后题10的解答。原标题为:
     写出CGI
adder函数的HTML表单。你的表单应该包蕴五个文本框,用户将急需相加的四个数字填在那多个文本框中。你的表单应该使用GET方法请求内容。
   
 因为小编原先没接触过HTML表单,先百度之,找到了w三school的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八以后浏览器展现的效果图。888捌是自家设置的tiny的端口,至于为何未有前面包车型地铁/index.html,是因为自身在源代码上校index.html设为了主界面。

美高梅手机版4858 1

  大家得以随便输入七个数字,点击Submit按钮,结果必然是狼狈的。。

美高梅手机版4858 2

  如上海教室所示,结果展现的是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代码如下所示:

 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捌,输入四个数字,结果如图:

美高梅手机版4858 3

  至此,大家学习Tiny的率先品级就是完事了,落成了课后题1壹.10的要求,能够处理来自浏览器的静态请求和动态请求。但是,由于大家的Tiny一遍只可以处理三个连续,作用太低了。下1节大家就要对Tiny举办一下纠正,使其能够帮忙并发处理。

近期攻读到了《深刻掌握总括机连串》的第二一章互联网编制程序,在结尾壹节是一…

前边写了《深远领悟总计机体系》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八自此浏览器展现的效能图。888八是本身设置的tiny的端口,至于为什么向来不前边的/index.html,是因为笔者在源代码旅长index.html设为了主界面。

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

美高梅手机版4858 4

美高梅手机版4858 5

方法一:

一.将全部源文件tiny.c、csapp.c和csapp.h放在同多少个目录下。此外在一如既往目录下放置photo.jpg作为测试文件。使用命令:

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

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

$gcc -o adder adder.c

三.运行Tiny程序,并内定端口号(拾二4–49151可用,别的为有名端口)

$./tiny 1024

4.现行反革命Tiny已经运维起来了,打开浏览器就足以访问了
访问静态内容
美高梅手机版4858 6
走访动态内容
美高梅手机版4858 7

  我们得以随便输入多个数字,点击Submit按钮,结果必然是难堪的。。

  我们得以任由输入三个数字,点击Submit按钮,结果必然是有万分态的。。

主意贰:使用Makefile完毕Tiny的编写翻译链接:

前1段时间看过Makefile的有的知识,所以自个儿就试一下用make命令来运转Tiny。

一.与办法一见仁见智的是,在办事目录下新建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的编写翻译链接。
美高梅手机版4858 8
3.接续的操作与方式1是均等的,不再赘言

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

美高梅手机版4858 9

美高梅手机版4858 10

美高梅手机版4858 11

  如上海体育场地所示,结果展现的是0。注目的在于该网页的地址栏处,大家看来”localhost:8888/cgi-bin/adder?num壹=2二&num2=22″,看过tiny源码大家就会知道,adder.c所要分析的数额是在&符号两边的纯数字,也正是说,要想正确的被adder.c程序求和,地址栏应该出示”localhost:8888/cgi-bin/adder?2二&2二”才对。出现上海图书馆中的错误的来头就是,adder程序未有到手多个参数的数值大小。化解办法不会细小略,只必要在adder.c程序里把八个数字取出来就行了,整个adder.c代码如下所示:

  如上航海用教室所示,结果突显的是0。注目的在于该网页的地点栏处,我们看看”localhost:8888/cgi-bin/adder?num一=22&num二=22″,看过tiny源码大家就会领悟,adder.c所要分析的数目是在&符号两边的纯数字,约等于说,要想正确的被adder.c程序求和,地址栏应该呈现”localhost:8888/cgi-bin/adder?22&2二”才对。出现上海体育地方中的错误的因由尽管,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:8888,输入多少个数字,结果如图:

美高梅手机版4858 ,  重新编写翻译adder.c之后,大家再一次在浏览器输入网址:localhost:888八,输入七个数字,结果如图:

美高梅手机版4858 12

美高梅手机版4858 13

  至此,大家学习Tiny的率先品级就是完事了,达成了课后题1一.10的须求,可以处理来自浏览器的静态请求和动态请求。可是,由于大家的Tiny三次只好处理一个一而再,成效太低了。下一节大家就要对Tiny举办一下立异,使其能够扶助并发处理。

  至此,大家上学Tiny的率先品级正是完事了,完毕了课后题11.10的供给,能够处理来自浏览器的静态请求和动态请求。不过,由于大家的Tiny一次只好处理二个总是,功效太低了。下一节大家就要对Tiny进行一下革新,使其可以帮助并发处理。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有