linux centos7下 c++编程
阅读原文时间:2023年07月09日阅读:1

在Linux下与在windos下编程没啥区别,可以在windos上实现后,然后更改一些,移植到linux中

yum install gcc
yum install gcc-c++

vi main.cpp    内容如下

#include
using namespace std;
int main(){
cout << "Hello World" << endl;
return 0;
}

g++ main.cpp //生成.out 文件
./main.out
或者
g++ main.cpp -o main.out
或者
g++ main.cpp -o main

这样生成的三个文件内容是一样的

连接mysql

c++需要mysql库(#include),需下载mysql-devel

yum install mysql-devel    

mysql_config --libs

vi main.cpp

#include //需加尖括号
#include
using namespace std;
void linkToMysql()
{
MYSQL link;
mysql_init(&link);
if(mysql_real_connect(&link,"127.0.0.1","zabbix","zabbix","zabbix",0,NULL,0)==NULL){
cout<<"连接错误";
}else{
cout<<"连接成功";
}
mysql_close(&link);
}
int main(){
linkToMysql();
}

mysql_real_connect()函数原型

MYSQL mysqlrealconnect(
MYSQL mysql,     
const char host,     //ip地址
const char user,     //mysql用户名
const char passwd,    //用户名密码
const char db,      //对应mysql用户可访问数据库名
unsigned int port,     
const char unixsocket,
unsigned intclientflag)

编译并链接文件

g++ -L/usr/lib64/mysql -lmysqlclient -o main main.cpp
./main    

cgi编程

让apache支持cgi

1.加载 CGI 支持模块,打开 Apache 配置文件(/etc/httpd/conf),寻找 LoadModule cgi_module modules/mod_cgi.so 解除前面的 #

2.定义 CGI 运行目录,解除在 Apache 配置文件中 ScriptAlias /cgi-bin/ "/var/www/cgi-bin" 前面的 # ( 根据实际情况而定)

3.启用对 CGI 的支持,解除在 Apache 配置文件中 AddHandler cgi-script .cgi 前面的 #

4.修改为如下

AllowOverride None Options ExecCGI indexes FollowSymLinks Require all granted AddHandler cgi-script .cgi

简单测试一下

注意是在 /var/www/cgi-bin  目录

a.cpp

#include
using namespace std;
int main ()
{
cout<<"Content-Type: text/html\n\n";
cout<<"hi";
return 0;
}

//编译
g++ a.cpp -o a.cgi

访问 http://192.168.43.8/cgi-bin/a.cgi

测试时出现500错误,查看错误日志显示:End of script output before headers

原因:我没加下面这句

cout<<"Content-Type: text/html\n\n";

html 与 c 交互 (get传值给c)

在/var/www/html  下建一个cgi.html文件

内容如下

用户名
密 码


在/var/www/cgi-bin  建一个pass.c , 然后编译为pass.cgi    gcc pass.c -o pass.cgi

#include
#include
#include

char* getcgidata(FILE* fp, char* requestmethod);
int main()
{
char *input;
char *req_method;
char name[64];
char pass[64];
int i = 0;
int j = 0;

// printf("Content-type: text/plain; charset=iso-8859-1\n\n");
printf("Content-type: text/html\n\n");
printf("The following is query reuslt:

");

            req\_method = getenv("REQUEST\_METHOD");  
            input = getcgidata(stdin, req\_method); 

            // 我们获取的input字符串可能像如下的形式  
            // Username="admin"&Password="aaaaa"  
            // 其中"Username="和"&Password="都是固定的  
            // 而"admin"和"aaaaa"都是变化的,也是我们要获取的 

            // 前面9个字符是UserName=  
            // 在"UserName="和"&"之间的是我们要取出来的用户名  
            for ( i = 9; i < (int)strlen(input); i++ )  
            {  
                         if ( input\[i\] == '&' )  
                         {  
                                        name\[j\] = '\\0';  
                                        break;  
                         }  
                         name\[j++\] = input\[i\];  
            } 

            // 前面9个字符 + "&Password="10个字符 + Username的字符数  
            // 是我们不要的,故省略掉,不拷贝  
            for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ )  
            {  
                         pass\[j++\] = input\[i\];  
            }  
            pass\[j\] = '\\0'; 

            printf("Your Username is %s<br>Your Password is %s<br> \\n", name, pass); 

            return 0;  

}

char* getcgidata(FILE* fp, char* requestmethod)
{
char* input;
int len;
int size = 1024;
int i = 0;

            if (!strcmp(requestmethod, "GET"))  
            {  
                         input = getenv("QUERY\_STRING");  
                         return input;  
            }  
            else if (!strcmp(requestmethod, "POST"))  
            {  
                         len = atoi(getenv("CONTENT\_LENGTH"));  
                         input = (char\*)malloc(sizeof(char)\*(size + 1)); 

                         if (len == 0)  
                         {  
                                        input\[0\] = '\\0';  
                                        return input;  
                         } 

                         while(1)  
                         {  
                                        input\[i\] = (char)fgetc(fp);  
                                        if (i == size)  
                                        {  
                                                     input\[i+1\] = '\\0';  
                                                     return input;  
                                        } 

                                        --len;  
                                        if (feof(fp) || (!(len)))  
                                        {  
                                                     i++;  
                                                     input\[i\] = '\\0';  
                                                     return input;  
                                        }  
                                        i++; 

                         }  
            }  
            return NULL;  

}

记得给cgi.html  赋予777或755权限,我修改了半天文件,文件就是没更新,原因就是没给权限

访问http://192.168.43.8/cgi.html

输入 admin  123456

完成了c的动态web实现

c++  调用cgicc库 来更加简便的实现web

cgicc 稳定版本3.2.16: http://ftp.gnu.org/gnu/cgicc/cgicc-3.2.16.tar.gz

$ tar xzf cgicc-X.X.X.tar.gz
$ cd cgicc-X.X.X/
$ ./configure --prefix=/usr
$ make
$ make install

注意:libcgicc.so 和 libcgicc.a 库会被安装到/usr/lib目录下,需执行拷贝命令:

$ sudo cp /usr/lib/libcgicc.* /usr/lib64/

才能使 CGI 程序自动找到 libcgicc.so 动态链接库。

先熟悉cgicc库的各种类,方法和属性

https://www.cnblogs.com/aquester/archive/2018/12/04/10064335.html

cgicc官方开发文档:http://www.gnu.org/software/cgicc/doc/lib_overview.html

https://www.cnblogs.com/skawu/p/11069290.html

CGICC由两大部分组成:

1) CGI输入处理子模块(CGI classes):

    cgicc::Cgicc 是cgicc库的主类。它用于检索特定HTML表单元素(如复选框、单选按钮和文本字段),上载文件的信息,以及保存,还原和检索CGI环境的信息和组:

    cgicc::CgiEnvironment 封装从HTTP服务器传递到CGI应用程序的数据。这包括由CGI标准中指定的HTTP服务器设置的所有环境变量。

    cgicc::FormEntry是一个不可变的类,表示HTML表单元素(如文本字段、单选按钮或复选框)中的单个用户条目。FormEntry本质上是一个名称/值对,其中名称是HTML表单本身中指定的表单元素的名称,值是用户输入的或用户选择的值。FormEntry提供了允许以字符串、整数或双精度形式访问值的方法。

    cgicc::FormFile是一个不可变的类,表示通过HTTP文件上载机制上载的文件。FormFile与FormEntry非常相似,但没有提供以不同类型访问值的众多方法。

2) 响应生成子模块(Response generation classes):

1) http header classes

cgicc::HTTPCookie是一个名称/值对,用于使用调用方自己的计算机存储调用方的一段信息。cookie通常被用作识别用户的一种手段。cgicc的任何头类都可能包含任意数量的cookie

cgicc::HTTPHeader 是所有简单HTTP头的基类。很少直接使用;相反,使用提供的子类之一。

cgicc::HTTPContentHeader 继承 cgicc::HTTPHeader 用于指示CGI应用程序返回给客户端的数据类型。

cgicc::HTTPRedirectHeader 继承cgicc::HTTPHeader 用于将客户端重定向到其他URL。

cgicc::HTTPStatusHeader 继承 cgicc::HTTPHeader 用于返回3位HTTP状态码和相关消息。

cgicc::HTTPHTMLHeader 继承 cgicc::HTTPContentHeader 用于MIME类型text/html的数据。

cgicc::HTTPResponseHeader 是一个更强大的通用HTTP头类,用于构造完整的HTTP响应。

  1) HTML generation classes

    HTML生成类用于在任何HTTP头之后生成HTML响应,由三部分组成。

      包含HTML版本信息的行

      声明性头段(由head元素分隔)

      包含文档实际内容的正文

cgicc定义了两个特殊的HTML类:
cgicc::HTMLDoctype用于指定HTML4.0标准所要求的HTML版本信息
cgicc::comment用于表示HTML注释

下面是输入处理子模块

简单实现一个通过post登录

/var/www/html  下放置login.html 文件

用户名
密 码


/var/www/cgi-bin  下放置 text.cpp文件

#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cgicc;
int main ()
{
cout<<"Content-Type: text/html\n\n"; Cgicc cgi; form_iterator username = cgi.getElement("Username"); form_iterator password = cgi.getElement("Password"); if(username->getValue()=="admin"){
if(password->getValue()=="123456")
cout<< "login success!!";
  else
    cout<< "password error";
}
else
cout<< "error login";
return 0;
}

g++ -o text.cgi text.cpp -l cgicc

这里介绍cgi类下的 getElement()函数,传入html的name

getElement() 实现了方法重载,上面我们使用的是第一个,返回form_iterator

form_iterator 和const_form_iterator 都是FormEntry的别名

通过调用FormEntry 类中的getValue()函数即可得到输入框的值,然后再做比较

下面通过连接mysql,来对用户密码确认

c++连接mysql 需要 mysql-server , mysql-client, mysql-devel

然后创建用户,数据库等

下面为简单的检测是否连接数据库

#include
#include
using namespace std;
int main(){
MYSQL conn;
mysql_init(&conn);
 if(mysql_real_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT_FOUND_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字
{
cout<<"Content-Type: text/html\n\n";
cout<<"connect success!";
}
}

编译
g++ `mysql_config --cflags --libs` -o mysql.cgi mysql.cpp

更深一步,就是增删改查,更多mysql语句请参考:https://www.cnblogs.com/CloudComputing-binbin/p/14470008.html

下面是结合c++ msyql

参考:

c++ 使用mysql查询结果为空的解决方法:https://blog.csdn.net/weixin_39616287/article/details/113686946

mysql 查询语句测试

#include
#include
using namespace std;
int main(){
MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row;

mysql\_init(&conn);  
cout<<"Content-Type: text/html\\n\\n";  
if(mysql\_real\_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT\_FOUND\_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字  
{  
    if(mysql\_query(&conn,"select username from account where username='admin' and password='123456';"))  //执行sql  
        cout<<"query fail...";  
    else{  
        cout<<"query success!!";  
        result=mysql\_store\_result(&conn);  
        int i=0;  
        while((row=mysql\_fetch\_row(result))){      //获取每行  
            i++;  
            cout<<"<script>alert('welcome to "<<row\[0\]<<"')</script>";       
        }  
        if(i==0)   //判断查询是否为空  
            cout<<"<script>alert('"<<"username or password error..."<<"')</script>";  
    }  
}  
else  
    cout<<"connetc fail...";  

}

mysql 与cgi 结合使用,html文件还是上面的文件

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cgicc;
int main ()
{
cout<<"Content-Type: text/html\n\n"; Cgicc cgi; form_iterator username = cgi.getElement("Username"); form_iterator password = cgi.getElement("Password"); string sql="select username from account where username='"; sql+=username->getValue(); //getValue() 的返回值为string
sql+="' and password='";
sql+=password->getValue();
sql+="';";
const char* sql_=sql.c_str();

MYSQL conn;  
MYSQL\_RES \*result;  
MYSQL\_ROW row;    

mysql\_init(&conn);  
if(mysql\_real\_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT\_FOUND\_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字  
{  
    if(mysql\_query(&conn,sql\_))        //执行sql  
        cout<<"query fail...";  
    else{  
        cout<<"query success!!";  
        result=mysql\_store\_result(&conn);  
        int i=0;  
        while((row=mysql\_fetch\_row(result))){  
            i++;  
            cout<<"<script>alert('welcome to "<<row\[0\]<<"')</script>";  
        }  
        if(i==0)             //通过查询出行的计数,来判断是否查询成功  
            cout<<"<script>alert('"<<"username or password error..."<<"')</script>";  
            cout<<"<script>window.location.href='http://118.195.139.82/login.html'</script>"; //登录失败,跳转登录页面  
    }  
}  
else  
    cout<<"connetc fail...";

}

g++ `mysql_config --cflags --libs` -l cgicc -o text.cgi text.cpp

最后就是cgicc + mysql + cookie 实现登录

cookie的学习参考菜鸟教程:  https://www.runoob.com/cplusplus/cpp-web-programming.html

下面是实现的主类  header.h

#include
#include
#include
#include
#include
#include
#include
#include
#include //sprintf() 需要用到该库
#include //用于整型转字符串
#include //用于随机数
#include //哈希加密
using namespace std;
using namespace cgicc;

class main_{
public:
int login(){
Cgicc cgi;
form_iterator username = cgi.getElement("Username");
form_iterator password = cgi.getElement("Password");
string sql="select username from account where username='";
sql+=username->getValue(); //getValue() 的返回值为string
sql+="' and password='";
sql+=password->getValue();
sql+="';";
const char* sql_=sql.c_str();

        MYSQL conn;  
        MYSQL\_RES \*result;  
        MYSQL\_ROW row;    

        mysql\_init(&conn);  
        if(mysql\_real\_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT\_FOUND\_ROWS)) //"root":数据库管理员 "":root密码 "test":数据库的名字  
        {  
            if(mysql\_query(&conn,sql\_)){}        //执行sql ,执行失败返回1  
                //cout<<"query fail...";  
            else{  
                //cout<<"query success!!";  
                result=mysql\_store\_result(&conn);  
                int i=0;  
                while((row=mysql\_fetch\_row(result))){  
                    i++;  
                    setcookie(username->getValue(),password->getValue());  
                    cout<<"<script>alert('welcome to "<<row\[0\]<<"')</script>";  
                    return 1;  
                }  
                if(i==0){             //通过查询出行的计数,来判断是否查询成功  
                    cout<<"Content-Type: text/html\\n\\n";        //这句要加上,不然就出现解析错误了,alert语句就显示不了  
                    cout<<"<script>alert('"<<"username or password error..."<<"')</script>";  
                    cout<<"<script>window.location.href='http://118.195.139.82/login.html'</script>"; //登录失败,跳转登录页面  
                    return 0;  
                }  
            }  
        }  
        else{  
            cout<<"Content-Type: text/html\\n\\n";  
            cout<<"connetc fail...";  
        }

    }  
    void setcookie(string username,string password){  
        string sessid="Set-Cookie:Sessid=";  
        sessid+=set\_cookie\_sha(username,password);  
        sessid+=";";  
        cout<<sessid;  
        cout<<"Content-Type: text/html\\n\\n";         //cookie 要在c  
    }  
    int check\_cookie(){  
        MYSQL conn;  
        MYSQL\_RES \*result;  
        MYSQL\_ROW row;  
        mysql\_init(&conn);  
        mysql\_real\_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT\_FOUND\_ROWS);  
        string sql="select \* from cookie\_time where cookie='";

        Cgicc cgi;  
        const\_cookie\_iterator cci;  
        const CgiEnvironment& env = cgi.getEnvironment();  
        for( cci = env.getCookieList().begin();cci != env.getCookieList().end(); ++cci ){  
            if(cci->getName()=="Sessid"){  
                sql+=cci->getValue();  
                sql+="' limit 1;";  
                mysql\_query(&conn,sql.c\_str());  
                result=mysql\_store\_result(&conn);  
                int i=0;  
                while((row=mysql\_fetch\_row(result))){  
                    i++;  
                }  
                if(i==1){  
                    //cout<<"success! ";  
                    return 1;  
                }  
                else  
                    return 0;  
            }  
        }  
    }  
    string set\_cookie\_sha(string username,string password){  
        stringstream str\_t;  
        stringstream str\_r;  
        int t=time(0);  
        srand(t);  
        int rand=random();  
        str\_t << t;  
        str\_r << rand;  
        string str\_time=str\_t.str();  
        string str\_rand=str\_r.str();  
        //cout<<str\_time<<str\_rand<<"admin123456"<<endl;  
        string cookie=str\_time+str\_rand+username+password;    //时间戳+随机数+用户名密码  
        //cout << sha256("dfs") << endl;  
        string sha\_cookie=sha256(cookie);  
        insert\_cookie(sha\_cookie,str\_time);  
        return sha\_cookie;  
    }  
    void insert\_cookie(string cookie,string str\_time){  
        string sql="insert into cookie\_time(cookie,time)values('";  
        sql+=cookie;  
        sql+="',";  
        sql+=str\_time;  
        sql+=");";  
        const char\* sql\_=sql.c\_str();

        MYSQL conn;  
        MYSQL\_RES \*result;  
        MYSQL\_ROW row;    

        mysql\_init(&conn);  
        if(mysql\_real\_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT\_FOUND\_ROWS)){  
            if(mysql\_query(&conn,sql\_)){}  
        }  
    }  
    string sha256(const string str){  
        char buf\[2\];  
        unsigned char hash\[SHA256\_DIGEST\_LENGTH\];  
        SHA256\_CTX sha256;  
        SHA256\_Init(&sha256);  
        SHA256\_Update(&sha256, str.c\_str(), str.size());  
        SHA256\_Final(hash, &sha256);  
        string NewString = "";  
        for(int i = 0; i < SHA256\_DIGEST\_LENGTH; i++){  
            sprintf(buf,"%02x",hash\[i\]);  
            NewString = NewString + buf;  
        }  
        return NewString;  
    }  

};

check.cpp  //调用类的login() 来检测登录密码, 直接访问会出错

#include
#include "header.h"
int main ()
{
main_ a;
if(a.login()==1){
cout<<"";
}

}

home.cpp  //这就是通过登录后的系统界面, 直接访问没有cookie或cookie错误的会页面跳转到登陆界面,

#include "header.h"
int main(){
cout << "Content-type:text/html\n\n";
main_ ma;
if(ma.check_cookie()==0){
cout<<"";
cout<<"";
return 0;
}
cout<<"good night!";
}

login.html

用户名
密 码


g++ `mysql_config --cflags --libs` -l cgicc -l ssl -l crypto -o check.cgi check.cpp
g++ `mysql_config --cflags --libs` -l cgicc -l ssl -l crypto -o home.cgi home.cpp

实现:

cookie是用 时间戳+随机数+用户密码 的sha加密

cookie 以及cookie授予的时间存入数据库中,创建事件,过期的cookie将被删除

检查cookie是用查询的,没做任何过滤,存在太low的sql注入了

cookie也是

想了想,盲注不照样爆库么,限定字符只有数字字母,这样应该就全防吧

还有创建定时删除过期cookie事务

参考:https://www.cnblogs.com/wang-yaz/p/12424858.html

开启mysql事务功能,永久开启方法:/etc/my.cnf中[mysqld]添加event_scheduler=on #重启服务

create table cookie_time(cookie varchar(100),time int);
create event de_cookie on schedule every 5 second do delete from cookie where time<(unix_timestamp(now())-60); //每五秒删除前一分钟的数据
create event de_cookie on schedule every 1 hour do delete from cookie where time<(unix_timestamp(now())-14400); //每一小时删除前4小时的数据

c++ 哈希加密:https://www.cnblogs.com/CloudComputing-binbin/p/14754486.html

注册

register.html

#include"header.h"
int main(){
cout << "Content-type:text/html\n\n";

Cgicc cgi;  
form\_iterator password = cgi.getElement("Password");  
form\_iterator password\_check = cgi.getElement("Password\_check");  
if(password->getValue()!=password\_check->getValue()){    //两次密码是否正确  
    cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";  
    cout<<"<body><script> swal({ title: 'Password Not Match',text:'Check your password again',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/register.html';}});</script></body></html>";  
    return 0;  
}

form\_iterator username = cgi.getElement("Username");  
main\_bypass bypass;  
if(bypass.bypass(username->getValue())==0||bypass.bypass(password->getValue())==0){    //过滤输入值,只允许字母和数字  
    cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";  
    cout<<"<body><script> swal({ title: 'Forbidden Character',text:'Letters and numbers only allowed',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/login.html';}});</script></body></html>";  
    return 0;  
}else if(bypass.bypass(username->getValue())==2||bypass.bypass(password->getValue())==2){  
    cout<<"Content-Type: text/html\\n\\n";  
    cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";  
    cout<<"<body><script> swal({ title: 'Character Too Short',text:'5~20 characters only',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/register.html';}});</script></body></html>";  
    return 0;  
}

MYSQL conn;        //连个数据库  
mysql\_init(&conn);  
mysql\_real\_connect(&conn,"localhost","bin","bin","bin",0,NULL,CLIENT\_FOUND\_ROWS);

//查询是否注册过  
MYSQL\_RES \*result;  
MYSQL\_ROW row;  
string sql\_one="select username from account where username='"+username->getValue()+"';";  
mysql\_query(&conn,sql\_one.c\_str());  
result=mysql\_store\_result(&conn);  
int i=0;  
while((row=mysql\_fetch\_row(result))){  
    i++;  
}  
if(i==1){  
    cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";  
    cout<<"<body><script> swal({ title: 'Already Register',text:'Please login',type: 'info',confirmButtonColor: '#DD6B55',confirmButtonText: 'login', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/login.html';}});</script></body></html>";  
    return 0;  
}

//检验验证码  
form\_iterator qqmail = cgi.getElement("qqmail");  
form\_iterator code = cgi.getElement("code");  
if(bypass.bypass\_code(code->getValue())==0||bypass.bypass\_qqmail(qqmail->getValue())==0){  
    cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";  
    cout<<"<body><script> swal({ title: 'Identifying Code Error',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/register.html';}});</script></body></html>";  
    return 0;  
}

string sql\_two="select code from qqmail\_code where qqmail='"+qqmail->getValue()+"';";  
mysql\_query(&conn,sql\_two.c\_str());  
result=mysql\_store\_result(&conn);  
i=0;  
while((row=mysql\_fetch\_row(result))){  
    if(row\[0\]==code->getValue()){  
        i++;  
        break;  
    }  
}  
if(i==0){  
    cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";  
    cout<<"<body><script> swal({ title: 'Identifying Code Error',type: 'error',confirmButtonColor: '#DD6B55',confirmButtonText: 'Retry', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/register.html';}});</script></body></html>";  
    return 0;  
}

//插入用户密码  
string sql\_three="insert into account(username,password,qqmail)values('"+username->getValue()+"','"+password->getValue()+"','"+qqmail->getValue()+"');";  
mysql\_query(&conn,sql\_three.c\_str());

cout<<"<!DOCTYPE html><html><head><link rel='stylesheet' type='text/css' href='http://www.huangwx.cn/css/sweetalert.css'> <script type='text/javascript' src='http://www.huangwx.cn/js/sweetalert-dev.js'></script></head>";  
cout<<"<body><script> swal({ title: 'Register Successful',type: 'success',confirmButtonColor: '#DD6B55',confirmButtonText: 'login', closeOnConfirm: false, closeOnCancel: false},function(isConfirm){ if (isConfirm){window.location.href='http://118.195.139.82/login.html';}});</script></body></html>";

return 0;

}

参考:

linux下c++编程基础:https://blog.csdn.net/qq_33750826/article/details/83868555

让apache支持cgi:https://www.txisfine.cn/archives/37d1a4ec.html#%E9%85%8D%E7%BD%AE%E8%BF%87%E7%A8%8B

c++ cgi 菜鸟教程:https://www.runoob.com/cplusplus/cpp-web-programming.html

开源C加加版本CGI库CGICC入门.pdf:

https://www.cnblogs.com/aquester/archive/2018/12/04/10064335.html

https://files-cdn.cnblogs.com/files/aquester/%E5%BC%80%E6%BA%90C%E5%8A%A0%E5%8A%A0%E7%89%88%E6%9C%ACCGI%E5%BA%93CGICC%E5%85%A5%E9%97%A8.pdf

cgicc库官方开发文档:http://www.gnu.org/software/cgicc/doc/lib_overview.html

c++ char* , const char* , string 的相互转换:https://www.cnblogs.com/wuyepeng/p/9729943.html

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章