刚进来就是对公司产品的熟悉

     进集团不就,刚产生了协作社付给的首先个跟嵌入式有涉嫌的付加物开荒职业。本人Java Web出身,具备神话的求职经验(不为吹捧,请我们不用为那句话拖泥带水卡塔尔国,竟然胡里胡涂的就从一个做Java Web的,华丽的转身成为四个做跟自个儿铭心镂骨的嵌入式的人!废话太多不好,先总计一下这些成品开垦中相见的主题素材,供之后仿效。
     公司是二个转型公司,近些日子几来才起来侧重研究开发的。集团内部除了本人是Java Web出身,别的技能研发的都是C的,刚进去孟津梨相当的大,即便自身有自然的C和C 基本功。
     刚进来便是对同盟社出品的耳濡目染,读了须臾间源码(linux下,基本上都以C卡塔 尔(阿拉伯语:قطر‎,感到相比劳苦,没过多长期,老大就让作者对公司三个成品的布署分界面包车型客车举行改建,那个是索要平昔放进flash中的,工程体积的最大允许量1M!由于刚先生伊始未有张开深刻的研商,一直秉承着做java web的动脑筋,认为工程大小不在意,反就是位于计算机上的,硬盘相当不够就扩大容积就能够了。可是后来开采,嵌入式的制品对那个很敏感,在作规划的时候就应有考虑怎么样去给程序减重,怎么样去巩固代码品质。
     花了大致2个月的年月,将成品的改变开头达成,接下去正是大器晚成对比较小的修补的事了,老大把剩下的事交给了平素跟本人合营的老大人,让本人开头投入到小卖部PBX相关的钻研与花销中。
     集团PBX的事物,归属基本付加物,笔者要做的第生龙活虎件事正是将原始的计划分界面包车型地铁品格跟此前做的三个出品举行统风流洒脱,(cgi(linux下c完结) jquery卡塔 尔(英语:State of Qatar)。又三次被打击:linux下开采,不停的vi,还大概有不能不去掌握熟知的lighttpd和cgi(c达成)的通讯原理和深等级次序应用。在此之前大致对这一个成品进行了分心,估摸是要经历一次相当的惨重的支出。。。
     但是,作IT的,注定了亟需持续去学习。下边将本身对cgi的生机勃勃部分叩问写下来,应接同行们能拍砖。

      [color=olive]一,CGI概述
     CGI(公共网关接口)规定了Web服务器调用其余可执路程序(CGI)的接口合同规范。Web服务器通过调用CGI程序完结和Web浏览器的竞相,也正是CGI程序选拔Web浏览器发送给Web服务器的音信进行拍卖,将相应结果送给Web服务器及Web浏览器。CGI程序日常实现Web网页中表单数据的拍卖,数据库查询和实现与金钱观应用类其他合龙等职业。CGI程序能够用任何程序设计语言编写,如shell、Perl、Fortran、帕斯Carl、C等。不过用C语言编写的CGI程序有所施行快、安全性高(因为C语言程序是编译施行且不可被修正卡塔 尔(阿拉伯语:قطر‎等特征。
    
     CGI接口标准包含专门的学业输入、境况变量、规范输出三局地。
     1. 标准输入
    
     CGI程序像别的可执路程序相通,可通过标准输入(stdin)从Web服务器得到输入信息,如Form中的数据,那便是衰落的向CGI程序传递数据的POST方法。那表示在操作系统命令行状态可实行CGI程序,并对CGI程序举办调解。(从上马接触嵌入式初始,你就该适应频仍跟操作系统,特别是unix和linux那样的东西打交道的条件卡塔 尔(英语:State of Qatar)。POST方法是常用的不二秘籍,上面作者将那些方法为例,深入分析CGI程序设计的形式、进度和技能。
     
     2. 碰着变量

     操作系统提供了过多遭受变量,它们定义了程序的实践意况,应用程序能够存取它们。Web服务器和CGI接口又其余安装了部分环境变量,用来向CGI程序传递一些至关心爱戴要的参数。CGI的GET方法还透过景况变量QUERAV4Y-ST智跑ING向CGI程序传递Form中的数据。
    
     3. 标准输出
    
     CGI程序的正规输出(stdout)将出口音讯传递给Web服务器。传送给Web服务器的新闻方可用各种格式,平日以纯文本或许html文本的款式,那样我们就足以在命令行状态调节和测量试验CGI程序,并且获得它们的输出。

     上面是二个洗练的C实现的CGI程序,它将html中form的新闻从来出口到Web浏览器。
     
   
C代码 
#include <stdin.h> 
#include <stdlib.h> 
main() 

    int i, n; 
    printf("Contenttype:text/plainnn"); 
    n = 0; 
    if(getenv("CONTENT-LENGTH")) 
       n = atoi(getenv("CONTENT-LENGTH")); 
    for(i = 0;i < n;i ) 
       putchar(getchar()); 
    putchar("n"); 
    fflush(stdout); 

    
     上面临程序作以下容易的分析。
     printf("Contenttype:text/plainnn");
     此行通过正式输出将字符串Contenttype:text/plainnn传送给Web服务器。它是一个MINE头新闻,它报告Web服务器随后的输出是以纯ASCII文本的花样。注意:那个头音信中有五个换行符,那是因为Web服务器供给在实际上的文件音信早先从前先见到叁个空行。
     if(getenv("CONTENT-LENGTH")) n = atoi(getenv("CONTENT-LENGTH"));
     此行首先检查CONTENT-LENGTH景况变量是或不是留存。Web服务器在调用使用POST方法的CGI程序时设置此情状变量,它的文本值表示Web服务器传送给CGI程序的输入中的字符数目,由此利用atoi()函数将此情状变量的值转变来整数,并赋值给n。请介意,Web服务器并不以文件停止符来终止它的出口,所以假如不检查遭受变量CONTENT-LENGTH,CGI程序就不能够知道怎么时候输入完结了。
     for(i = 0;i < n;i ) putchar(getchar());
     此行从0循环到CONTENT-LENGTH - 1次将标准输入中读到的各样字符平昔拷贝到规范输出,相当于将有所的输入以ASCII的花样送回给Web服务器。

     通过此例,可将CGI程序的相近职业进程计算为如下几点:
     1. 通过检查遇到变量CONTENT-LENGTH鲜明有微微输入
     2. 循环使用getchar()或许其它文件读函数获得全数的输入
     3. 以相应的办法管理输入
     4. 因而Contenttype头音讯,将出口新闻的格式告诉给Web服务器
     5. 因此选拔printf()也许putchar()或然其余文件写函数,将出口传送给Web服务器。

     二,遇到变量
   
     景况变量是文本串(名字/值对),可以别OS Shell大概别的程序设置,也足以被别的程序访谈。它们是Web服务器传递数据给CGI程序的粗略手腕,之所以称为意况变量是因为它们是全局变量,任何程序都足以存取它们。
 
     上边是CGI程序设计中时常要用到的一些景况变量:
     HTTP-REFEREMercedes-EQ:调用该CGI程序的网页的U奥迪Q5L
     REMOTE-HOST:调用该CGI程序的Web浏览器的机器名和域名
     REQUEST-METHOD:当Web服务器传递数据给CGI程序时所运用的主意,分为GET和POST二种。GET方法仅经过意况变量(如QUE索罗德Y-ST梅赛德斯-迈巴赫ING卡塔尔国传递数据给CGI程序,而POST方法通过环境变量和行业内部输入传递数据给CGI程序,由此POST方法可较有利的传递数据给CGI程序。
     SC陆风X8IPT—NAME:该CGI程序的称呼
     QUEEvoqueY-ST安德拉ING:当使用POST方法时,Form中的数据最后放在QUEWranglerY-ST福特ExplorerING中,传递给CGI程序
     CONTENT-TYPE:传递给CGI程序数据的MIME类型,平时为"application/x-www-form-url-encoded",它是html form中以POST方法传递数据给CGI程序的数据编码类型,成为U卡宴L编码类型。
     CONTENT-LENGTH: 传递给CGI程序的数据字符数(字节数)

     三,Form中输入的分析和解码

     1. 深入分析名字/值对

     当客户提交多少个html form时,Web浏览器首先对form中的数据以名字/值没错样式张开编码,并发送给Web服务器,然后由Web服务器传递给CGI程序。其格式如下:
     name1=value1&name2=value2&name3=value3&name4=value4...
     当中名字是form中定义的input、select或textarea等tag的名字,值是顾客输入可能选拔的值。这种格式即为UPRADOL编码,程序中供给对其进展剖析和平解决码。要解析这种数据流,CGI程序必须首先将数据流分解成意气风发组组的名字/值对,这足以因此在输入流中查找上面包车型客车四个字符来实现。
     每当找到字符=,标记着二个form变量名字的收尾;每当找到字符&,标识着一个form变量值的扫尾。清注意输入数据的末尾一个变量值不以&结束。
     风度翩翩旦名字/值对解释后,还非得将输入中的一些特殊字符转变到相应的ASCII字符,那个特殊字符是:
     : 将 转变到空格符
     %xx : 用其十二进制ASCII码值表示的特殊字符。依照值xx将其转形成相应的ASCII字符。
     对form变量名和变量值都要实行这种转移。上面是叁个对form数据开展剖析并将结果回送给Web服务器的CGI程序。

   
C代码 
#include <stdio.h> 
#include <stdlib.h> 
#include <strings.h> 
 
int htoi(char *); 
 
main() 

    int i, n; 
    char c; 
    printf("Contenttype:text/plainnn"); 
    n = 0; 
    if(getenv("CONTENT-LENGTH")) 
        n = atoi("CONTENT-LENGTH"); 
    for(i = 0;i < n;i ) 
    { 
        int is-eq = 0; 
        c = getchar(); 
        switch(c) 
        { 
            case '&' :  
              c = 'n'; 
              break; 
            case ' ' :  
              c = '  '; 
              break; 
            case '%' :  
              { 
                  char s[3]; 
                  s[0] = getchar(); 
                  s[1] = getchar(); 
                  s[2] = 0; 
                  c = htoi(s); 
                  i = 2;   
              } 
              break; 
            case '=' :  
              c = ':'; 
              is-eq = 1; 
              break; 
        }; 
        putchar(c); 
        if(is-eq) 
            putchar('  '); 
    } 
    putchar('n'); 
    fflush(stdout); 

  
/** Convert hex string to int  **/ 
int htoi(char *s) 

    char *digits = "0123456789ABCDEF"; 
    if(islower(s[0])) s[0] = toupper(s[0]); 
    if(islower(s[1])) s[1] = toupper(s[1]); 
    return 16 * (strchar(digits,s[0]) - strchar(digits, '0')) (strchar(digits,s[1] -  strchar(digits, '0'))); 
    

     上面包车型客车次序首先输出多少个MIME头音信给Web服务器,检查输入中的字符数,并循环检查每一种字符。

     三,产生HTML输出

     CGI的出口由两局地构成:MIME头消息和实在的音讯。两部分之间以二个空行分开。能够行使MIME头音讯为"Contenttype:text/htmlnn"来输出html源代码给Web服务器,上边是一个轻便的事例:

   
C代码 
   #include <stdio.h> 
   #include <string.h> 
   main() 
   { 
       printf("Contenttype:text/htmlnn"); 
       printf("<html>n"); 
 
       printf("<head><title>An HTML Page From a CGI</title></h ead>n″"); 
 
       printf("<h2> This is an HTML page generated from with i n a CGI program..   .</h2>n"); 
 
       printf("<hr><p>n"); 
 
       printf("<a href="../output.html#two"><b> Go back to out put.html page < 
/b></a>n"); 
 
       printf("</body>n"); 
 
       printf("</html>n"); 
 
       fflush(stdout); 
   } 

作者“telyy123”  

Web出身,具备神话的求职经验(不为吹捧,请大家不要...

本文由金沙澳门官网-www.js333com-金沙js333com发布于金沙澳门官网计算机,转载请注明出处:刚进来就是对公司产品的熟悉

您可能还会对下面的文章感兴趣: