HTTP服务器加强版

与上一篇不同,本篇添加了大数据处理,对数据库的操作(增删查改)

以下注释均为测试,可忽略

绿色为文件蓝色为目录

这是整体的一个目录:

conf/server.conf:

IP:127.0.0.1
PORT:8080

htdocs/index.html:(数据库操作)

<html>
    <head>                                                                      
        <h1>hello,this is database</h1>
        <h2>you can choose a operoter...</h2>
    </head>
    <body>
        <h2>INSERT</h2>
            <form action="mysql_connect/sql_api" method="POST">
                name   :<input type="text" name="name"/><br/>
                sex    :<input type="text" name="sex"/><br/>
                age    :<input type="text" name="age"/><br/>
                tel    :<input type="text" name="tel"/><br/>
                school :<input type="text" name="school"/><br/>
                <input type="submit" value="insert"/><br/>
            </form>
        <h2>SELECT</h2>     
        <h2>you can choose one or zero ...</h2>
           <form action="mysql_connect/sql_api" method="GET">
                select_name   :<input type="text" name="select_name"/><br/>
                select_sex    :<input type="text" name="select_sex"/><br/>
                select_age    :<input type="text" name="select_age"/><br/>
                select_tel    :<input type="text" name="select_tel"/><br/>
                select_school :<input type="text" name="select_school"/><br/>
                select_id     :<input type="text" name="select_id"/><br/>
                <input type="submit" value="select data"/><br/>
            </form>
        <h2>DELETE</h2>
        <h2>you can choose one or zero ...</h2>
             <form action="mysql_connect/sql_api" method="GET">
                 delete_name  :<input type="text" name="delete_name"/><br/>
                 delete_sex   :<input type="text" name="delete_sex"/><br/>
                 delete_age   :<input type="text" name="delete_age"/><br/>      
                 delete_tel   :<input type="text" name="delete_tel"/><br/>
                 delete_school:<input type="text" name="delete_school"/><br/>
                 delete_id    :<input type="text" name="delete_id"/><br/>
                 <input type="submit" value="delete"/><br/>
             </form>
        <h2>UPDATE</h2>
            <form action="mysql_connect/sql_api" method="GET">
                 updata_name  :<input type="text" name="updata_name1"/>
                 <input type="text" name="updata_name2"/><br/>                  
                 updata_sex   :<input type="text" name="updata_sex1"/>
                 <input type="text" name="updata_sex1"/><br/>
                 updata_age   :<input type="text" name="updata_age"/>
                 <input type="text" name="updata_age"/><br/>
                 updata_tel   :<input type="text" name="updata_tel"/>
                 <input type="text" name="updata_tel"/><br/>
                 updata_school:<input type="text" name="updata_school"/>
                 <input type="text" name="updata_school"/><br/>
                 <input type="submit" value="updata"/><br/>
            </form>
        <img src="10.jpg" alt="mantouheqi" dth="200" height="300"/>
    </body>
</html>

htdocs/mysql_connect/main.cpp:

#include "sql_api.h"
 
void get_args(std::vector<std::string> &vec,std::string &op)                    
{
    std::string method=getenv("METHOD");//getenv return NULL to string is error
    std::string query_string;
    std::string content_length;
    char ch=‘a‘;
    int index=0;
    int ret=-1;
    char buf[_SIZE_];
    memset(buf,‘\0‘,sizeof(buf));
    if(method=="POST"){//POST
        std::string content_length=getenv("CONTENT_LENGTH");
        int len=atoi(content_length.c_str());
        memset(buf,‘\0‘,sizeof(buf));
        while(len){//&& index<sizeof(buf)-1){
            ret=read(0,&ch,1);
            buf[index++]=ch;
            len--;
        }
        if(len!=0){
            printf("error!\n");
            return;
        }
    }else{//GET
        query_string=getenv("QUERY_STRING");
        strcpy(buf,query_string.c_str());
        index=query_string.size();
    }
    buf[index]=‘\0‘;
//  std::cout<<buf<<std::endl;
    if(strncmp(buf,"name",4)==0){
        op="insert";
    }else if(strncmp(buf,"select_name",11)==0){
        op="select";
    }else if(strncmp(buf,"delete_name",11)==0){
        op="delete";
    }else if(strncmp(buf,"updata_name",11)==0){                                 
        op="updata";
    }
//  std::cout<<op<<std::endl;
    char *end=buf+index;
    int incount=0;
    while(end!=buf){
        if(*end == ‘=‘){
            vec.push_back(end+1);
        }
        if(*end == ‘&‘){
            *end=‘\0‘;
        }
        end--;
    }
}

void insert_echo_html()
{   
    std::cout<<"HTTP/1.1 200 OK\r\n\r\n";
    std::cout<<"<html>"<<std::endl;
    std::cout<<"<head>"<<std::endl;
    std::cout<<"<h1>insert success!</h1>"<<std::endl;
    std::cout<<"</head>"<<std::endl;
    std::cout<<"</html>"<<std::endl;
}   
    
void delete_echo_html()
{   
    std::cout<<"HTTP/1.1 200 OK\r\n\r\n";
    std::cout<<"<html>"<<std::endl;
    std::cout<<"<head>"<<std::endl;
    std::cout<<"<h1>delete success!</h1>"<<std::endl;
    std::cout<<"</head>"<<std::endl;                                            
    std::cout<<"</html>"<<std::endl;
}   
 
void updata_echo_html()
{   
    std::cout<<"HTTP/1.1 200 OK\r\n\r\n";
    std::cout<<"<html>"<<std::endl;                                             
    std::cout<<"<head>"<<std::endl;
    std::cout<<"<h1>updata success!</h1>"<<std::endl;
    std::cout<<"</head>"<<std::endl;
    std::cout<<"</html>"<<std::endl;
}   
    
void failed_echo_html()
{   
    std::cout<<"HTTP/1.1 200 OK\r\n\r\n";
    std::cout<<"<html>"<<std::endl;
    std::cout<<"<head>"<<std::endl;
    std::cout<<"<h1>operator failed!Info Is Not Exit or Your Can Check Your Args...</h1>"<<std::endl;
    std::cout<<"</head>"<<std::endl;
    std::cout<<"</html>"<<std::endl;
}   
int main()
{   
    std::vector<std::string> vec;
    std::string op;
    get_args(vec,op);
    
    int vec_size=vec.size();
    const char *name=vec[vec_size-1].c_str();
    const char *sex=vec[vec_size-2].c_str();
    const char *age=vec[vec_size-3].c_str();
    const char *tel=vec[vec_size-4].c_str();
    const char *school=vec[vec_size-5].c_str();
    const char *id=vec[vec_size-6].c_str();
    
    mysql_api sql;                                                              
    //连接到MYSQL服务器
    sql.mysql_connect_sql();
    
    bool ret=false;
    if(op=="insert"){
        ret=sql.mysql_insert(name,sex,age,tel,school);
        if(ret==true){
            ret=false;
            insert_echo_html();
        }else{
            failed_echo_html();
        }
    }else if(op=="select"){
        ret=sql.mysql_select(id,name,sex,age,tel,school);
        if(ret==true){
            ret=false;
        }else{
            failed_echo_html();                                                 
        }
    }else if(op=="delete"){
//      std::cout<<op<<std::endl;
        ret=sql.mysql_delete(id,name,sex,age,tel,school);
        if(ret==true){
            ret=false;
            delete_echo_html();
        }else{
            failed_echo_html();
        }
    }else if(op=="updata"){
        const char *oldname=vec[vec_size-1].c_str();
        const char *newname=vec[vec_size-2].c_str();
        const char *oldsex=vec[vec_size-3].c_str();
        const char *newsex=vec[vec_size-4].c_str();
        const char *oldage=vec[vec_size-5].c_str();
        const char *newage=vec[vec_size-6].c_str();
        const char *oldtel=vec[vec_size-7].c_str();
        const char *newtel=vec[vec_size-8].c_str();
        const char *oldschool=vec[vec_size-9].c_str();
        const char *newschool=vec[vec_size-10].c_str();                         
    
        ret=sql.mysql_updata(oldname,newname,oldsex,newsex,oldage,newage,oldtel,newtel,oldschool,newschool);
        if(ret==true){
            ret=false;
            updata_echo_html();
         }else{
            failed_echo_html();
        }
    }
    
    sql.mysql_close_sql();                                                      
    
    return 0;
}

htdocs/mysql_connect/sql_api.h:

#include <iostream>
#include <string>
#include <vector>                                                               
#include <mysql.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
#define _SIZE_ 2048
 
class mysql_api
{
public:
    mysql_api();
    void mysql_connect_sql();
    bool mysql_select(std::string id="",std::string name="",std::string sex="",std::string age="",std::string tel="",std::string school="");
    bool mysql_insert(std::string name,std::string sex,std::string age,std::string tel,std::string school);
    bool mysql_delete(std::string id="",std::string name="",std::string sex="",std::string age="",std::string tel="",std::string school="");
    bool mysql_updata(std::string oldname="",std::string newname="",std::string oldsex="",std::string newsex="",\  std::string oldage="",std::string newage="",std::string oldtel="",std::string newtel="",std::string oldschool="",std::string newschool="");
    bool mysql_close_sql();
    ~mysql_api();
private:
    bool _sql_op(std::string &sql_op);
    bool _select_data();
private:
    MYSQL mysql;
    std::string host;                                                           
    std::string user;
    std::string passwd;
    std::string db;
    unsigned int port;
    unsigned long client_flag;
};

htdocs/mysql_connect/sql_api.cpp:

#include "sql_api.h"
 
mysql_api::mysql_api()                                                          
    :host("127.0.0.1")
    ,user("root")
    ,passwd("密码")
    ,db("9_students")
    ,port(3306)
    ,client_flag(0)
{
    //获得或初始化一个MYSQL结构
    mysql_init(&mysql);
}
void mysql_api::mysql_connect_sql()
{
    //连接到MYSQL服务器
    mysql_real_connect(&mysql,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,NULL,0);
}
bool mysql_api::mysql_select(std::string id,std::string name,std::string sex,std::string age,std::string tel,std::string school)
{
    //select 列名称 from 表名称 [查询条件];
    std::string sql_op="select * from students where ";
    if(name!=""){
        sql_op.append("name=\"");
        sql_op.append(name);
        sql_op.append("\"");
    }else if(sex!=""){
        sql_op.append("sex=\"");
        sql_op.append(sex);
        sql_op.append("\"");
    }else if(age!=""){
        sql_op.append("age=");
        sql_op.append(age);
    }else if(tel!=""){
        sql_op.append("tel=\"");
        sql_op.append(tel);
        sql_op.append("\"");
    }else if(school!=""){
        sql_op.append("school=\"");                                             
        sql_op.append(school);
        sql_op.append("\"");
    }else if(id!=""){
        sql_op.append("id=");
        sql_op.append(id);
    }else{                                                                      
        sql_op="select * from students";
    }  
//  std::cout<<sql_op<<std::endl;
    if(_sql_op(sql_op)){
        return _select_data();
    }  
}   
       
bool mysql_api::mysql_insert(std::string name,std::string sex,std::string age,std::string tel=NULL,std::string school=NULL)
{   
    //insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
    //insert into students values(NULL, "王刚", "男", 20, "13811371377",NULL);
    std::string sql_op;
    sql_op="insert into students (name,sex,age,tel,school) values (\"";
    sql_op.append(name);                                                        
    sql_op.append("\",\"");
    sql_op.append(sex);
    sql_op.append("\",");
    sql_op.append(age);
    sql_op.append(",\"");
    sql_op.append(tel);
    sql_op.append("\",\"");
    sql_op.append(school);
    sql_op.append("\")");
//  std::cout<<sql_op<<std::endl;
    return _sql_op(sql_op);
}   
    
bool mysql_api::mysql_delete(std::string id,std::string name,std::string sex,std::string age,std::string tel,std::string school)
{   
    //delete from 表名称 where 删除条件
    //删除表中的所有数据: delete from students;
    std::string sql_op="delete from students where ";
    if(name!=""){
        sql_op.append("name=\"");
        sql_op.append(name);
        sql_op.append("\"");
    }else if(sex!=""){
        sql_op.append("sex=\"");
        sql_op.append(sex);
        sql_op.append("\"");
    }else if(age!=""){
        sql_op.append("age=");
        sql_op.append(age);
    }else if(tel!=""){
        sql_op.append("tel=\"");
        sql_op.append("\"");
        sql_op.append(tel);
    }else if(school!=""){
        sql_op.append("school=\"");
        sql_op.append(school);
        sql_op.append("\"");
    }else if(id!=""){
        sql_op.append("id=");
        sql_op.append(id);
    }
//  std::cout<<sql_op<<std::endl;
    if(sql_op=="delete from students where ")
        return false;
    return _sql_op(sql_op);
}   
    
bool mysql_api::mysql_updata(std::string oldname,std::string newname,std::string oldsex,std::string newsex,            std::string oldage,std::string newage,std::string oldtel,std::string newtel,std::string oldschool,std::string newschool)
{   
    //update 表名称 set 列名称=新值 where 更新条件;
    // update students set age=19,tel="18829342744" where tel="6703" and school="xpu";                                                
    std::string sql_op;
    std::string where;
    bool ret=false; 
    sql_op="update students set " ;
    where="where ";
    if(oldname!=""){
        where.append("name=\"");
        where.append(oldname);
        where.append("\"");
    }  
    if(newname!=""){
        sql_op.append("name=\"");
        sql_op.append(newname);
        sql_op.append("\"");
    }
    if(oldsex!=""){
        if(where!="where ")
            where.append(" and ");
        where.append("sex=\"");
        where.append(oldsex);
        where.append("\"");
    }
    if(newsex!=""){
        sql_op.append("sex=\"");
        sql_op.append(newsex);
        sql_op.append("\"");
    }
    if(oldage!=""){
        if(where!="where ")
            where.append(" and ");                                                                                                    
        where.append("age=");
        where.append(oldage);
    }
    if(newage!=""){
        sql_op.append("age=");
        sql_op.append(newage);
    }
    if(oldtel!=""){
        if(where!="where ")
            where.append(" and ");
        where.append("tel=\"");
        where.append(oldtel);
        where.append("\"");
    }
    if(newtel!=""){
        sql_op.append("tel=\"");
        sql_op.append(newtel);
        sql_op.append("\"");                                                                                                          
    }
    if(oldschool!=""){
        if(where!="where ")
            where.append(" and ");
        where.append("school=\"");
        where.append(oldschool);
        where.append("\"");
    }
    if(newschool!=""){
        sql_op.append("school=\"");
        sql_op.append(newschool);
        sql_op.append("\"");
    }
    sql_op.append(" ");
    
    std::string res=sql_op+where;
//  std::cout<<res<<std::endl;
    return _sql_op(res);
}   
        
bool mysql_api::mysql_close_sql()
{   
    //关闭与MySQL服务器的连接
    mysql_close(&mysql);
}   
    
mysql_api::~mysql_api()
{   
}   
    
bool mysql_api::_sql_op(std::string &sql_op)
{   
//  std::cout<<sql_op<<std::endl;
    bool ret=false;
    if(mysql_query(&mysql,sql_op.c_str())==0){
        ret=true;
//      std::cout<<ret<<std::endl;
    }
    return ret;
}   
    
bool mysql_api::_select_data()
{   
    MYSQL_RES *ret=mysql_store_result(&mysql);
    MYSQL_ROW row;
    int num_fields=mysql_num_fields(ret);
    std::cout<<"HTTP/1.1 200 OK\r\n\r\n";
    std::cout<<"<html>"<<std::endl;
    std::cout<<"<head>"<<std::endl;
    std::cout<<"<h1>id  name    sex   age   tel     school";                    
    std::cout<<"</h1>"<<std::endl;
    while ((row = mysql_fetch_row(ret)))
    {
        unsigned long *lengths;
        lengths = mysql_fetch_lengths(ret);
        std::cout<<"<h2>";
        for(int i = 0; i < num_fields; i++)
        {
            printf("[%.*s] ", (int)lengths[i], row[i] ? row[i] : "NULL");
        }
        std::cout<<"</h2>"<<std::endl;
        std::cout<<std::endl;
    }   
    std::cout<<"</head>"<<std::endl;
    std::cout<<"</html>"<<std::endl;                                            
    mysql_free_result(ret);
    return true;
}

htdocs/mysql_connect/Makefile:

ROOT_PATH=$(shell pwd)#shell是函数,它的参数是操作系统shell的命令,它和反引号的>功能是相同的,这就是说shell函数把执行操作系统命令后的输出作为函数返回值,这个函>数会生成一个shell程序来执行命令,所以要注意运行性能
                                                                                
#LINK=-I/home/chehlling/httpd/mysql_connect/mysql-clib/include     -L/home/chehlling/httpd/mysql_connect/mysql-clib/lib -lmysqlclient -lpthread -lm -lrt -ldl
 
sql_api:main.cpp sql_api.cpp
    g++ -o [email protected] $^ `${ROOT_PATH}/mysql-clib/bin/mysql_config --cflags --libs ` -lstdc++ 
 
.PHONY:clean
clean:
    rm -f sql_api
 
.PHONY:output
output:sql_api
    cp -f sql_api ../../output/htdocs/cgi_mysql/

htdocs/index.html:(大数运算操作)

<html>  
    <head>
        <h1>hello chehlling</h1>
    </head>
    <body>
        <hr/>
        <form action="cgi_bin/math_cgi" method="POST">
            data1: <input type="text" name="data1"/><br/>
            data2: <input type="text" name="data2"/><br/>
            +: <input type="radio" name="op" value="ADD"><br/>
            -: <input type="radio" name="op" value="SUB"><br/>
            *: <input type="radio" name="op" value="MUL"><br/>
            /: <input type="radio" name="op" value="DIV"><br/>
            %: <input type="radio" name="op" value="MOD"><br/>                  
            <input type="submit" /><br/>
        </form>
        <hr/>
        
        <img src="20.jpg" alt="mantouheqi" dth="200" height="300"/>
    </body>
</html>

htdocs/cgi_bin/math_cgi.cpp:

#include "bigdata.h"
#include <iostream>
#include <string>                                                               
#include <stdio.h>
#include <errno.h>
#include <vector>
#include <stdlib.h>
#include <string.h>
#define _SIZE_ 2048
 
void get_args(std::vector<std::string> &vec)
{
    std::string method=getenv("METHOD");
    std::string query_string; 
    std::string content_length;
    char ch=‘a‘;
    int index=0;
    int ret=-1;
    char buf[_SIZE_];
    memset(buf,‘\0‘,sizeof(buf));
    if(method=="POST"){//POST
        std::string content_length=getenv("CONTENT_LENGTH");
        int len=atoi(content_length.c_str());
        memset(buf,‘\0‘,sizeof(buf));
        while(len){//&& index<sizeof(buf)-1){
            ret=read(0,&ch,1);
            buf[index++]=ch;
            len--;
        }
        if(len!=0){
            printf("error!\n");
            return;
        }
    }else{//GET
        query_string=getenv("QUERY_STRING");
        strcpy(buf,query_string.c_str());
        index=query_string.size();
    }
    buf[index]=‘\0‘;
//  std::cout<<buf<<std::endl;
    int countin=0;
    char *end=buf+index;
    while(end!=buf){
        if(*end == ‘=‘){
            vec.push_back(end+1);
        //  std::cout<<vec[countin++]<<std::endl;
        }
        if(*end == ‘&‘){
            *end=‘\0‘;
        }
        end--;                                                                  
    }
}   

void echo_result(std::vector<std::string> &vec)
{
    const char *op=vec[0].c_str();
    BigData data1(vec[2].c_str());
    BigData data2(vec[1].c_str());
//  std::cout<<data1<<"     "<<data2<<std::endl;
    BigData sum;
    char ch;
    if( strcmp("ADD",op)==0 ){
        sum=data1+data2;
        ch=‘+‘;
    }else if( strcmp("SUB",op)==0 ){
        sum=data1-data2;
        ch=‘-‘;
    }else if( strcmp("MUL",op)==0 ){
        sum=data1*data2;
        ch=‘*‘;
    }else if( strcmp("DIV",op)==0 ){
        sum=data1/data2;
        ch=‘/‘;
    }else if( strcmp("MOD",op)==0 ){
        sum=data1%data2;
        ch=‘%‘;
    }else{
        return;
    }
    std::cout<<"HTTP/1.1 200 OK\r\n\r\n";
    std::cout<<"<html>"<<std::endl;                                             
    std::cout<<"<head>"<<std::endl;
    std::cout<<"  ";
    std::cout<<"<h1>math_cgi     ";
    std::cout<<op <<"</h1>"<<std::endl;
    std::cout<<"</head>"<<std::endl;
    std::cout<<"<body>"<<std::endl;
    std::cout<<data1<<ch<<data2<<"="<<sum<<std::endl;
    std::cout<<"</body>"<<std::endl;
    std::cout<<"</html>"<<std::endl;
     
}    
int main(int argc,char *argv[])
{    
    std::vector<std::string> vec;                                               
    get_args(vec);//reverse store args
    echo_result(vec);
     
    return 0;
}

htdocs/cgi_bin/bigadata.h:

#ifndef BIG_DATA_H
#define BIG_DATA_H
#include <string>
#include <string.h>                                                             
#include <iostream>
#include <cassert>
 
#define UN_INIT 0xccccccccccccccccll
#define MAX_INT64 0x7fffffffffffffffll
#define MIN_INT64 0x8000000000000000ll
 
typedef long long INT64;
 
class BigData
{
public:
    BigData(INT64 data = UN_INIT);
    BigData(const char *pData);
    BigData operator+(BigData& bigData);
    BigData operator-(const BigData& bigData);
    BigData operator*(const BigData& bigData);
    BigData operator/(const BigData& bigData);
    BigData operator%(const BigData& bigData);
    //=======================================
    bool operator<(const BigData& bigData);
    bool operator>(const BigData& bigData);
    bool operator==(const BigData& bigData);
    
    std::ostream& operator<<(std::ostream& _cout);
    
    friend std::ostream& operator<<(std::ostream& _cout, const BigData& bigData);
    friend std::istream& operator>>(std::istream& _cin, BigData bigData);  
private:
    std::string Add(std::string left, std::string right);
    std::string Sub(std::string left, std::string right);
    std::string Mul(std::string left, std::string right);
    std::string Div(std::string left, std::string right);
    void INT64ToString();
    bool IsINT64Owerflow()const;
    bool IsLeftStrBig(char *pLeft, size_t LSize, char *pRight, size_t RSize);
    char SubLoop(char *pLeft, size_t LSize, char *pRight, size_t RSize);
    
private:                                                                    
    long long m_llValue;
    std::string m_strData;
};  
#endif

htdocs/cgi_bin/bigadata.cpp:

htdocs/cgi_bin/Makefile:

math_cgi:math_cgi.cpp bigdata.cpp
    g++ -o [email protected] $^ -lstdc++
                                                                                
.PHONY:clean
clean:
    rm -rf math_cgi
   
.PHONY:output
output:math_cgi
    cp -f math_cgi ../../output/htdocs/cgi_bin/

httpd.c  httpd.h   main.c  这三个文件和上一篇一样

Makefile

ROOT_PATH=$(shell pwd)
LDFLAGS=-lpthread
FLAGS=#-D_DEBUG_#-g
 
CC=gcc
BIN=httpd
SRC=$(shell ls *.c)
OBJ=$(SRC:.c=.o)
                                                                                
CGI_BIN=htdocs/cgi_bin
MYSQL_CONNECT=htdocs/mysql_connect
 
.PHONY:all
all:$(BIN) cgi
$(BIN):$(OBJ)
    @echo "Linking [$^] to [[email protected]]"
    @$(CC) -o [email protected] $^  $(LDFLAGS)
    @echo "Linking done..."
%.o:%.c
    @echo "Compling [$<] to [[email protected]]"
    @$(CC) -c $< -D_V2_ $(FLAGS) 
    @echo "Compling done..."
   
   
.PHONY:cgi
cgi:
    @for name in `echo $(CGI_BIN)`;    do        cd $$name;        make;        cd -;    done
    @for name in `echo $(MYSQL_CONNECT)`;    do        cd $$name;        make;        cd -;    done
   
.PHONY:clean
clean:
    @rm -rf *.o $(BIN) output
    @for name in `echo $(CGI_BIN)`;    do        cd $$name;        make clean;        cd -;    done
    @for name in `echo $(MYSQL_CONNECT)`;    do        cd $$name;        make clean;        cd -;    done
.PHONY:output
output:$(BIN) cgi
    @mkdir -p output/log
    @cp -rf htdocs output/
    @mkdir -p output/htdocs/cgi_bin
    @cp -f httpd output/
    @cp -f start.sh output/
    @cp -rf conf output/
    @mkdir -p output/htdocs/cgi_mysql
    @for name in `echo $(CGI_BIN)`;\                                            
    do        cd $$name;        make output;        cd -;    done
    @for name in `echo $(MYSQL_CONNECT)`;    do        cd $$name;        make output;        cd -;    done

start.sh 

#! /bin/bash
 
ROOT_PATH=$(pwd)                                                                
conf=$ROOT_PATH/conf/server.conf
ser=$ROOT_PATH/httpd
 
ip=$(grep -E "^IP:" $conf |awk -F: ‘{print $NF}‘)
port=$(grep -E "^PORT:" $conf | awk -F: ‘{print $NF}‘)
$ser $ip $port

运行结果:

插入:

查询:

删除:

更新:

发布之后output的目录下:

《完》

时间: 2024-10-02 05:51:15

HTTP服务器加强版的相关文章

linux服务器开发二(系统编程)--线程相关

线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共享). 进程与线程的区别:在于是否共享地址空间. 独居(进程). 合租(线程). Linux下: 线程:最小的执行单位. 进程:最小分配资源单位,可看成是一个线程的进程. 安装man文档 sudo apt-get install glibc-doc sudo apt-get install manp

《从入门到精通云服务器》-3

从上期的内容中,我们知道云服务器有灵活扩展,满足需求的独特优势.那么企业如何根据自己的业务去更好地配置与升级云服务器呢?下面我们将从CPU.内存 .带宽 .线路与操作系统展开讨论. CPU + 内存 + 带宽篇 按公司不同的发展阶段,采用不同的CPU.内存.带宽: 公司建站初期,正处于初始阶段,并发访问量小.适合选择省钱适用的经济型配置, 可以从1核 CPU + 1G内存 + 2M带宽起步.当然了,即便都是建站初期,网站类型不同,配置也需适当升级.若是普通的网站,比如文字网站,图片网站,论坛等,

升讯威微信营销系统开发实践:(3)中控服务器的设计 .Net 还是 Java?

.Net 还是 Java?  :) 最近园子里又出现了.Net 和 Java 的口水贴,如果你觉得本文的内容根本就是 a piece of cake,不值一提,轻轻松松就能码出可靠健壮的实现,或许还可以讨论下.Net 和 Java 的问题,否则我想你还是歇歇吧,对你来说都是一样的,用好一样就行了,否则 .Net 1.1 都能完爆你. .Net的应用领域没有有些人想的那么窄,只能说你眼界实在是太浅了..Net在国外是否受待见?自己去国外招聘网站看一看就是了,又没被墙的,呵呵. 技术不过关不要赖平台

Centos6.5下利用rsyslog+loganalyzer+mysql部署日志服务器

RHEL 6.x 搭建rsyslog日志服务器和loganalyzer日志分析工具 =============================================== rsyslog的介绍 logrotate日志滚动的介绍 rsyslog的存储途径 基于web的loganalyzer日志分析工具的搭建 ====================================================== 一.rsyslog的介绍 Linux的日志记录了用户在系统上一切操作,看日

阿里云centos服务器cpu使用率100%和redis漏洞问题

2016-10-27 开发服务器病毒的一次解决 一:发现问题 早上9点左右,短信告警cpu使用达到100%,ssh连接不上,重启服务器,并没有解决cpu满载的情况,但可以用ssh连上了. 二:解决办法 遇到这种突然的cpu飙升,且用top命令看不到(shift+P)占用cpu特别大的进程,初步怀疑服务器中病毒了并且有可能执行着计划任务 查看计划任务 果然,计划任务显示,它在每分钟执行一个远程名为pm.sh脚本,经查,该ip地址为韩国 获取该脚本,内容如下: ===================

盘点十大最流行的Linux服务器发行版

随着Linux不断发展,Linux所支持的文件系统类型也在迅速扩充.很多的数据中心服务器上都运行着Linux,可以节省大量的许可证费用及维护费用.但伴随着Linux新版本的发行,其中每一个不同版本的Linux所支持的文件系统类型都有所不同. 那么,对于这种情况来说,Linux系统家族中也划分着针对不同的用户群,比如Ubuntu被认为Linux新用户最容易操作的平台,而Slackware Linux是需要经过有着一定应用基础的用户,CentOS是一个企业级的发行版,特别适合对稳定性,可靠性和功能要

从入门到精通云服务器_转

从入门到精通云服务器 第一讲  到底什么是云计算 云计算这个概念从提出到今天,差不多10年了.这10年间,云计算取得了飞速的发展与翻天覆地的变化,是继1980年代大型计算机到客户端-服务器的大转变之后的又一次巨变,先是机器越来越小,然后...然后就云里雾里了. 云计算到底是什么鬼? 云计算的基础是并行计算 如果想让计算机变强,怎么办? 那还不简单,加CPU,加内存,加硬盘. 老板,我身上的孔已经被插满了啊! 简单,换更高级的CPU,换新的DDR内存,换新的SSD硬盘. 老板,那个死摩尔定律告诉我

18、Linux命令对服务器CPU进行监控

我刚开始做性能测试的时候,什么也不懂,就只知道压测.什么时候把系统压瘫痪什么时候结束.但是系统因为什么瘫痪却不是很清楚,后来开始研究服务器性能监控,运用到工作中,提高了不少生产力,下面就把我常用的命令或者工具分享给大家. 监控Linux 服务器CPU top 参数介绍 top - 10:38:29[当前系统时间], 194 days[系统已经运行了194天], 1 user[个用户当前登录], load average: 0.07, 0.03, 0.01[系统负载,即任务队列的平均长度] Tas

Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本

新版发布 近日,轻量级开源 Web 服务器 Tengine 发布了2.3.0版本,新增如下特性: ngx_http_proxy_connect_module,该模块让 Tengine 可以用于正向代理场景,支持对 CONNECT 方法请求的处理: HTTP2 Server粒度控制 新增 HTTP2指令,可针对 listen 相同端口的 server 进行个性化开启与关闭 HTTP2: Stream模块支持 server_name 指令,可在 SSL 场景下,基于 SNI 识别出域名,让四层SSL