澳门新蒲京娱乐

新蒲京娱乐场777 6
服务器质量参数目标新蒲京娱乐场777:
图片 19
那点事儿

语言开发

三、 测试

这次测验

行使了两台机械。意气风发台Ubuntu的浏览器作为客商端,少年老成台Redhat作为劳务器端,在那之中Redhat是Ubuntu上依照VirtualBox的风流洒脱台设想机。

IP地址音信如下:Ubuntu的vboxnet0:

<img src="http://jbcdn2.b0.upaiyun.com/2016/11/73d81eee84e5fe07de8e076ee6b5d25a.jpg" alt="图片 1" />

RedHateth0:

图片 2

RedHat主机编写翻译项目:

图片 3

鉴于大家同事监听了8000和4444,所以有多少个进程运营。

HTTP的首页:

图片 4

目录显示效果:

图片 5

HTTP GET页面:

图片 6

HTTPGET响应:

图片 7

从HTTP GET响应中大家观看UENCOREL,参数实乃经过U卡宴L传送过去的。

其中getAuth.c如下:

#include "wrap.h"  
#include "parse.h"  

int main(void) {  
    char *buf, *p;  
    char name[MAXLINE], passwd[MAXLINE],content[MAXLINE];  

    /* Extract the two arguments */  
    if ((buf = getenv("QUERY_STRING")) != NULL) {  
    p = strchr(buf, '&');  
    *p = '\0';  
    strcpy(name, buf);  
    strcpy(passwd, p+1);  
    }  

    /* Make the response body */  
    sprintf(content, "Welcome to auth.com:%s and %s\r\n<p>",name,passwd);  
    sprintf(content, "%s\r\n", content);  

    sprintf(content, "%sThanks for visiting!\r\n", content);  

    /* Generate the HTTP response */  
    printf("Content-length: %d\r\n", strlen(content));  
    printf("Content-type: text/html\r\n\r\n");  
    printf("%s", content);  
    fflush(stdout);  
    exit(0);  
}

HTTPS的首页:由于大家的CA不可信,所以供给大家承认

图片 8

认可后HTTPS首页:

图片 9

HTTPS POST页面:

图片 10

HTTPS POST响应:

图片 11

从上大家能够看看,POST提交的参数的确不是因此UENVISIONL传送的。

5、蒙受的朝气蓬勃对标题:

1)本地蚕回测量试验ok,Linux下的浏览器测量检验也足以,但无法接外部的浏览器访谈(没有设置桥接形式)嗯~要是在外表浏览器测量检验的话千万别忘记关闭防火墙。

化解:切换拔尖客商:$service iptables stop

2)服务器应答时,未有将html格式的页面发送,而是将底层的兑今世码展现在浏览器,并且在调试时将自然要打字与印刷的调节和测量检验音讯会打字与印刷到网页上(在答应空行时将send期望发送的数值写的太大,本来只供给发送八个字节的内容)
消除:先检查代码,思路精确,在容易并发难点之处步入调试音信,最终将标题一定在echo_www()函数内

3)不能够显得图片(那个标题是不曾将装有发送的气象思量全盘,只思考到目录、可执路程序,但未有诬捏到若是央浼的是三个路线分明的日常文书)
消除:测量试验央求多个门道明确的test.html文件,参与调节和测量检验新闻,将标题一定在:借使央求的能源存在,应该怎样管理。对于普通文书,找到后并回显给浏览器;假若是目录,应答的是暗许页面;借使是可执路程序,奉行后回来结果

4)能展现图片后,但展现的不完全(原因:echo_www中,期待读取意气风发行音讯的line值太小,不可能存下一张图纸)

5)运维cgi情势时,每趟提交数据并扩充submit后都会自行现身提示下载的页面
原因:在响应报头中,将Content-Type中的”text”写成”test”。而浏览器对于不可能辨识或深入分析的实业,都会提醒顾客下载。

 

风姿洒脱、 达成效果与利益:

1.支持GET/POST方法

2.支撑SSL安全连接即HTTPS

3.支持CGI

4.基于IP地址和掩码的表达

5.目录展现

6.日志功效

7.错误提醒页面

github地址:

源代码下载地址:点击展开链接

2)GET方法

  在该措施下,CGI程序不大概直接从服务器的正经八百输入(顾客发送的消息正文)中获取数据,因为服务器把它从行业内部输入接受到得数据编码到境况变量QUE纳瓦拉Y_STRING(或PATH_INFO)。

  选用GET方法提交HTML表单数据的时候,顾客机将把这些多少附加到由ACTION标识命名的U大切诺基L的终极,用一个席卷把通过U昂科威L编码后的新闻与CGI程序的名字分别:?name=hgq$id=1,QUERY_STSportageING的值为name=hgq&id=1(?左侧为要央求的财富,左边为参数,参数情势经常为name=value情势,以“&”连接)。恐怕利用nomal格局的GET方法,无参数,不带正文,唯有诉求行+音信报头+空行。有个别技术员不情愿利用GET方法,因为在她们看来,把动态音信附加在U奇骏L的末段有违UPAJEROL的观点:U君越L作为朝气蓬勃种标准用语,经常是用作网络能源的独占鳌头定位标示。

本条重视是在CS应用程式底蕴上做的,加多了POST,SSL,目录展现等成效。

1、项目介绍

  HTTP商讨是应用层的面向对象的情商,由于其简捷、神速的法子,适用于布满式超媒体新闻种类。合同的详细内容,后面大器晚成篇HTTP左券精解早已详细介绍了,这里不再赘述。

   项目全部描述:HTTP接济客商端/服务器格局,终端顾客可透过浏览器或互连网爬虫与服务器组建连接,所以率先要求自己作主达成服务器Server端,具体由头文件httpd.h、main函数文件httpd.c、模块成效函数文件httpd.c组成,重要达成顾客端与服务器通过socket创建通讯机制。首先由顾客主动发起二个到服务器上点名端口(暗中认可端口为80)的乞请,服务器则在特别端口监听客商端发送过来的伸手。服务器蓬蓬勃勃行大器晚成行读取诉求,通过诉求音信决断客商须要财富的办法和路线,若方法和路径没相当,则方法和路径通过CGI模式或非CGI向客商提供分歧的HTML网页音信。管理完须要客商端向顾客发送响应,包涵气象行如:“HTTP/1.1
200 OK”、响应报头、音信正文,新闻体即为服务器上的财富。

落时间效益果与利益意气风发:静态首页呈现(图片、文字文字音讯);

贯彻二:协理表单提交,能够依靠浏览器或telnet工具使用GET、POST方法访谈服务器,实现数据的轻易计算效能;

完结三:引进MYSQL,客商可透过页面表单实行数据操作,服务器获得顾客提交的数目后,会把多少存入到远端数据库,客户端也可伸手查看数据库音信。

风度翩翩体项目标文件目录:

图片 12

目录:
conf:配置文件,寄放供给绑定的服务器的ip和port ;
log:shell的日记文件以致http错误管理的日记文件 ;
sql_client:mysql部分的API及CGI实现;
thread_pool:线程池达成;
wwwroot:web服务器职业的根目录,饱含种种财富页面(举例暗中认可的index.html页面,差错管理的404页面),以至执行cgi的可执路程序。上面还会有叁个 cgi-bin目录,是寄存在CGI脚本之处。那几个本子使WWW服务器和浏览器能运转外部程序,而没有需求运维另叁个主次。它是运营在Web服务器上的二个顺序,并由来自于浏览者的输入触发。

方方面面项指标框架图:

 图片 13

二、设计原理

率先介绍一些HTTP合同基本知识。

#1.GET/POST

本完结扶植GET/POST方法,都以HTTP左券需求援救的典型方法。

GET方法首尽管通过U兰德XC90L发送供给和传送数据,而POST方法在伸手头空生机勃勃格之后传送数据,所以POST方法比GET方法安全性高,因为GET方法能够平昔看看传送的多少。此外四个分别就是GET方法传输的多寡不大,而POST方法相当大。所以日常表单,登入页面等都以透过POST方法。

#2.MIME类型

当服务器获取顾客端的诉求的文本名,将分析文件的MIME类型,然后告诉浏览器改文件的MIME类型,浏览器通过MIME类型解析传送过来的多少。具体来讲,浏览器央浼三个主页面,该页面是贰个HTML文件,那么服务器将”text/html”类型发给浏览器,浏览器通过HTML深入分析器度和胆识别发送过来的内容并体现。

上面将陈说二个切实可行意况。

客商端应用浏览器通过U昂CoraL发送需要,服务器获取伏乞。

如浏览器UOdysseyL为:127.0.0.1/postAuth.html,

那么服务器获取到的央浼为:GET  /postAuth.html  HTTP/1.1

野趣是索要根目录下postAuth.html文件的原委,通过GET方法,使用HTTP/1.1说道(1.1是HTTP的版本号卡塔尔(قطر‎。那是服务器将分析文件名,得到消息postAuth.html是一个HTML文件,所以将”text/html”发送给浏览器,然后读取postAuth.html内容发给浏览器。

金玉锦绣简单的MIME类型识别代码如下:

第意气风发正是经过文件后缀获取文件类型。

static void get_filetype(const char *filename, char *filetype)   
{  
    if (strstr(filename, ".html"))  
        strcpy(filetype, "text/html");  
    else if (strstr(filename, ".gif"))  
        strcpy(filetype, "image/gif");  
    else if (strstr(filename, ".jpg"))  
        strcpy(filetype, "image/jpeg");  
    else if (strstr(filename, ".png"))  
        strcpy(filetype, "image/png");  
    else  
    strcpy(filetype, "text/plain");  
}

只要支持HTTPS的话,那么我们就#define HTTPS,那重大通过gcc
的D选项完成的,具体细节可参看man手册。

静态内容呈现落成如下:

static void serve_static(int fd, char *filename, int filesize) 
{
    int srcfd;
    char *srcp, filetype[MAXLINE], buf[MAXBUF];

    /* Send response headers to client */
    get_filetype(filename, filetype);
    sprintf(buf, "HTTP/1.0 200 OK\r\n");
    sprintf(buf, "%sServer: Tiny Web Server\r\n", buf);
    sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);
    sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);

    /* Send response body to client */
    srcfd = Open(filename, O_RDONLY, 0);
    srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
    Close(srcfd);

    #ifdef HTTPS 
    if(ishttps)
    {
        SSL_write(ssl, buf, strlen(buf));
    SSL_write(ssl, srcp, filesize);
    }
    else
    #endif
    {
    Rio_writen(fd, buf, strlen(buf));
    Rio_writen(fd, srcp, filesize);
    }
    Munmap(srcp, filesize);
}

#3.CGI规范

万一一定要彰显页面那么可信贫乏动态交互作用技能,于是CGI发生了。CGI是集体网关接口(Common
Gateway
Interface卡塔尔(قطر‎,是在CGI程序和Web服务器之间传递新闻的规规矩矩。CGI允许Web服务器施行外界程序,并将它们的输出发送给浏览器。这样就提供了动态人机联作能力。

那正是说服务器是怎么着分开管理静态页面和动态CGI程序的呢?那关键是经过解析UQX56L的法门。大家能够定义CGI程序的目录,如cgi-bin,那么只要UWranglerL包罗”cgi-bin”字符串则那是动态程序,且将U凯雷德L的参数给cgiargs。借使是静态页面,parse_uri再次回到1,反正重返0。所以我们能够因此再次回到值不一样区别的服务类型。

切切实实解析U大切诺基L格局如下:

static void serve_static(int fd, char *filename, int filesize) 
{
    int srcfd;
    char *srcp, filetype[MAXLINE], buf[MAXBUF];

    /* Send response headers to client */
    get_filetype(filename, filetype);
    sprintf(buf, "HTTP/1.0 200 OK\r\n");
    sprintf(buf, "%sServer: Tiny Web Server\r\n", buf);
    sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);
    sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);

    /* Send response body to client */
    srcfd = Open(filename, O_RDONLY, 0);
    srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
    Close(srcfd);

    #ifdef HTTPS 
    if(ishttps)
    {
        SSL_write(ssl, buf, strlen(buf));
    SSL_write(ssl, srcp, filesize);
    }
    else
    #endif
    {
    Rio_writen(fd, buf, strlen(buf));
    Rio_writen(fd, srcp, filesize);
    }
    Munmap(srcp, filesize);
}

GET形式的CGI标准落到实处原理:

服务器通过U宝马X3L获取传给CGI程序的参数,设置情状变量QUEOdysseyY_ST奥德赛ING,并将业内输出重定向到文件描述符,然后通过EXEC函数簇实行外界CGI程序。外界CGI程序拿到QUEGL450Y_STHighlanderING并管理,管理完后输出结果。由于那个时候正式输出已重定向到文件描述符,即发送给了浏览器。

完成细节如下:由于涉及到HTTPS,所以有个别有一些复杂。

static void serve_static(int fd, char *filename, int filesize) 
{
    int srcfd;
    char *srcp, filetype[MAXLINE], buf[MAXBUF];

    /* Send response headers to client */
    get_filetype(filename, filetype);
    sprintf(buf, "HTTP/1.0 200 OK\r\n");
    sprintf(buf, "%sServer: Tiny Web Server\r\n", buf);
    sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);
    sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);

    /* Send response body to client */
    srcfd = Open(filename, O_RDONLY, 0);
    srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
    Close(srcfd);

    #ifdef HTTPS 
    if(ishttps)
    {
        SSL_write(ssl, buf, strlen(buf));
    SSL_write(ssl, srcp, filesize);
    }
    else
    #endif
    {
    Rio_writen(fd, buf, strlen(buf));
    Rio_writen(fd, srcp, filesize);
    }
    Munmap(srcp, filesize);
}

POST形式的CGI规范落到实处原理:

鉴于POST格局不是经过UTiguanL传递参数,所以实现格局与GET格局不意气风发致。

POST形式获取浏览器发送过来的参数长度设置为条件变量CONTENT-LENGTH。并将参数重定向到CGI的正规化输入,那关键透过pipe管道完毕的。CGI程序从专门的职业输入读取CONTENT-LENGTH个字符就得到了浏览器传送的参数,并将管理结果输出到正式输出,同理标准输出已重定向到文件描述符,所以浏览器就可以吸收接纳管理的响应。

实际落到实处细节如下:

static void serve_static(int fd, char *filename, int filesize) 
{
    int srcfd;
    char *srcp, filetype[MAXLINE], buf[MAXBUF];

    /* Send response headers to client */
    get_filetype(filename, filetype);
    sprintf(buf, "HTTP/1.0 200 OK\r\n");
    sprintf(buf, "%sServer: Tiny Web Server\r\n", buf);
    sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);
    sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);

    /* Send response body to client */
    srcfd = Open(filename, O_RDONLY, 0);
    srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
    Close(srcfd);

    #ifdef HTTPS 
    if(ishttps)
    {
        SSL_write(ssl, buf, strlen(buf));
    SSL_write(ssl, srcp, filesize);
    }
    else
    #endif
    {
    Rio_writen(fd, buf, strlen(buf));
    Rio_writen(fd, srcp, filesize);
    }
    Munmap(srcp, filesize);
}

目录呈现效果原理:

主借使透过U本田CR-VL获取所需目录,然后拿走该目录下具备文件,并发送相应音信,包罗文件格式对应图片,文件名,文件大小,最终修正时间等。由于大家发送的公文名是通过超链接的花样,所以大家能够点击文件名接续浏览消息。

切实落到实处细节如下:

static void serve_static(int fd, char *filename, int filesize) 
{
    int srcfd;
    char *srcp, filetype[MAXLINE], buf[MAXBUF];

    /* Send response headers to client */
    get_filetype(filename, filetype);
    sprintf(buf, "HTTP/1.0 200 OK\r\n");
    sprintf(buf, "%sServer: Tiny Web Server\r\n", buf);
    sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);
    sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);

    /* Send response body to client */
    srcfd = Open(filename, O_RDONLY, 0);
    srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
    Close(srcfd);

    #ifdef HTTPS 
    if(ishttps)
    {
        SSL_write(ssl, buf, strlen(buf));
    SSL_write(ssl, srcp, filesize);
    }
    else
    #endif
    {
    Rio_writen(fd, buf, strlen(buf));
    Rio_writen(fd, srcp, filesize);
    }
    Munmap(srcp, filesize);
}

HTTPS的实现:

HTTPS首要依靠openssl的开源库达成。若无设置,那么大家就不#define
HTTPS。
HTTPS的职能首要正是提供安全的连年,服务器和浏览器之间传递的数量是由此加密的,加密情势能够和煦选定。

开班一而再延续时,服务器须要发送CA,由于大家的CA是计出万全签发的,所以须要大家和谐增添为可靠。

访谈调整功能:

器重是经过获取顾客端IP地址,并更动为整数,与上配备文件中定义的掩码,若是契合配置文件中允许的网段,那么可以访谈,不然不得以。

切切实实完结如下。

static void serve_static(int fd, char *filename, int filesize) 
{
    int srcfd;
    char *srcp, filetype[MAXLINE], buf[MAXBUF];

    /* Send response headers to client */
    get_filetype(filename, filetype);
    sprintf(buf, "HTTP/1.0 200 OK\r\n");
    sprintf(buf, "%sServer: Tiny Web Server\r\n", buf);
    sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);
    sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);

    /* Send response body to client */
    srcfd = Open(filename, O_RDONLY, 0);
    srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
    Close(srcfd);

    #ifdef HTTPS 
    if(ishttps)
    {
        SSL_write(ssl, buf, strlen(buf));
    SSL_write(ssl, srcp, filesize);
    }
    else
    #endif
    {
    Rio_writen(fd, buf, strlen(buf));
    Rio_writen(fd, srcp, filesize);
    }
    Munmap(srcp, filesize);
}

布署文件的读取:

重公投取信息都定义与结构文件中。

格式比如如下;

#HTTP PORT
PORT = 8888

所以读取配置文件函数具体如下:

static char* getconfig(char* name)  
{  
/* 
pointer meaning: 

...port...=...8000... 
   |  |   |   |  | 
  *fs |   |   |  *be    f->forward  b-> back 
      *fe |   *bs       s->start    e-> end 
          *equal 
*/  
    static char info[64];  
    int find=0;  
    char tmp[256],fore[64],back[64],tmpcwd[MAXLINE];  
    char *fs,*fe,*equal,*bs,*be,*start;  

    strcpy(tmpcwd,cwd);  
    strcat(tmpcwd,"/");  
    FILE *fp=getfp(strcat(tmpcwd,"config.ini"));  
    while(fgets(tmp,255,fp)!=NULL)  
    {  
        start=tmp;  
        equal=strchr(tmp,'=');  

        while(isblank(*start))  
            ++start;  
        fs=start;  

        if(*fs=='#')  
            continue;  
        while(isalpha(*start))  
            ++start;  
        fe=start-1;  

        strncpy(fore,fs,fe-fs+1);  
        fore[fe-fs+1]='\0';  
        if(strcmp(fore,name)!=0)  
            continue;  
        find=1;  

        start=equal+1;  
        while(isblank(*start))  
            ++start;  
        bs=start;  

        while(!isblank(*start)&&*start!='\n')  
            ++start;  
        be=start-1;  

        strncpy(back,bs,be-bs+1);  
        back[be-bs+1]='\0';  
        strcpy(info,back);  
        break;  
    }  
    if(find)  
        return info;  
    else  
        return NULL;  
}

1)POST方法

  借使选取POST方法,那么客商端发送的顾客数量将寄存在CGI进度的科公输子入中,即音讯正文内,较为隐瞒,且平日从不上限。同时将客商数据的长短授予际遇变量中的CONTENT_LENGTH。客商端用POST格局发送数占领三个对应的MIME类型(通用Internet邮件扩大服务:Multi-purpose Internet Mail Extensions)。目前,MIME类型日常是:application/x-wwww-form-urlencoded,该项目表示数据来源HTML表单。该品种记录在条件变量CONTENT_TYPE中,CGI程序应该检查该变量的值。

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图