首页 > 其他分享 >c语言通过cgi做网站

c语言通过cgi做网站

时间:2024-04-11 15:11:18浏览次数:26  
标签:cgi 语言 pagesize 网站 char printf action memcached strcmp

效果图:

 

 

 

 

 

 

 

主代码如下:

#include <stdlib.h>
#include <stdio.h>
#include "hiredis/hiredis.h"
#include "mysql/mysql.h"
#pragma comment(lib,"libmysql")
#include <libmemcached/memcached.h>
#include <string.h>
#include <unistd.h>

//gcc -g hello.c -o hello_c.cgi -I"D:\software\mysql-8.0.16-winx64\include" -L"D:\software\mysql-8.0.16-winx64\lib" -I"D:\software\Apache2.2\cgi-bin\libmemcached-win32\include" -L"D:\software\Apache2.2\cgi-bin" -llibmysql -lhiredis -lmemcached

void commonInfo(char *argv[])
{
    printf("编译命令:gcc -g hello.c -o hello_c.cgi -I\"D:\\software\\mysql-8.0.16-winx64\\include\" -L\"D:\\software\\mysql-8.0.16-winx64\\lib\" -I\"D:\\software\\Apache2.2\\cgi-bin\\libmemcached-win32\\include\" -L\"D:\\software\\Apache2.2\\cgi-bin\" -llibmysql -lhiredis -lmemcached<br />\n");
    printf("程序位置:%s<br />\n", argv[0]);
    printf("客户端信息1:%s<br />\n", getenv("HTTP_USER_AGENT"));
}

char *getparam(char *url, char *word)
{
    char url1[256];
    strcpy(url1, url);

    char * p1 = strtok(url1, "&");
    while(p1 != NULL){
        char urlpart1[256], urlpart2[256];
        strcpy(urlpart1, p1);
        strcpy(urlpart2, p1);
        p1 = strtok(NULL, "&");

        char * valstr = strstr(urlpart1, "=");
        valstr++;

        char * p2 = strrev(urlpart2);
        char * keystr1 = strstr(p2, "=");
        keystr1++;

        char * keystr = strrev(keystr1);

        if(strcmp(keystr, word) == 0){
            return valstr;
        }
    }

    char * defaultvalue = "";
    return defaultvalue;
}

void indexpage()
{
    char * qs = getenv("QUERY_STRING");
    char * actionkey = "action";
    char * pagekey = "page";
    char * pagesizekey = "pagesize";
    char * defaultaction = "index";

    char * actionval = getparam(qs, actionkey);
    char action[256];
    strcpy(action, actionval);
    if(strcmp(action, "") == 0){
        strcpy(action, defaultaction);
    }

    char * pageval = getparam(qs, pagekey);
    char pagestr[256];
    strcpy(pagestr, pageval);
    int page = 0;
    if(strcmp(pagestr, "") == 0){
        page = 1;
    }
    else{
        page = atoi(pagestr);
        if(page < 1){
            page = 1;
        }
    }

    char * pagesizeval = getparam(qs, pagesizekey);
    char pagesizestr[256];
    strcpy(pagesizestr, pagesizeval);
    int pagesize = 0;
    if(strcmp(pagesizestr, "") == 0){
        pagesize = 20;
    }
    else{
        pagesize = atoi(pagesizestr);
        if(pagesize < 1){
            pagesize = 20;
        }
    }

    //printf("indexpage::query_string: %s<br />\n", qs);
    //printf("indexpage::action: %s<br />\n", action);
    //printf("indexpage::page: %d<br />\n", page);
    //printf("indexpage::pagesize: %d<br />\n", pagesize);

    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;
    char* server = "127.0.0.1";//本地连接
    char* user = "root";//
    char* password = "123456";//mysql密码
    char* database = "oa2_kings";//数据库名

    conn = mysql_init(NULL);
    if(!mysql_real_connect(conn, server, user, password, database, 3306, NULL, 0)){
        printf("Error connecting to database:%s\n",mysql_error(conn));
        return ;
    }

    mysql_set_character_set(conn, "utf8mb4");

    int start = (page - 1) * pagesize;
    char query[1024];
    sprintf(query, "select id,staffName,staffNo,workEmail,workMobile from staff_baseinfo order by id desc limit %d,%d", start, pagesize);//需要查询的语句
    int t,r;

    //printf("pagesize:%ds<br />\n", pagesize);
    //printf("%s\n", query);

    t = mysql_query(conn, query);
    res = mysql_use_result(conn);
    if(res){
        printf("<table border=\"1\" bordercolor=\"#003366\" style=\"border-collapse:collapse;\">\n");
        printf("<tr><td width=\"70px\">ID</td>\n<td width=\"120px\">姓名</td>\n<td width=\"120px\">员工号</td>\n<td width=\"190px\">邮件</td>\n<td width=\"100px\">手机</td>\n</tr>\n");
        while((row = mysql_fetch_row(res)) != NULL){
            printf("<tr>\n");
            for(t = 0; t < mysql_num_fields(res); t++){
                printf("<td>%8s</td>\n", row[t]);
            }
            printf("</tr>\n");
        }
        printf("</table>\n\n");
    }
    mysql_free_result(res);
    mysql_close(conn);

    char prepage[1024];
    char netpage[1024];
    sprintf(prepage, "<a href='?action=%s&page=%d&pagesize=%d'>上一页</a>&nbsp;", action, page-1, pagesize);
    sprintf(netpage, "<a href='?action=%s&page=%d&pagesize=%d'>下一页</a>&nbsp;", action, page+1, pagesize);
    printf(prepage);
    printf(netpage);

    printf("\n\n");
}

void test1page()
{
    printf("<h1>这是一个测试页面</h1><br />");
    printf("<h2>这是一个测试页面</h2><br />");
    printf("<h3>这是一个测试页面</h3><br />");
    printf("<h4>这是一个测试页面</h4><br />");
}

void test2page()
{
    printf("<h4>这是一个打招呼页面</h4><br />");
    printf("<h3>这是一个打招呼页面</h3><br />");
    printf("<h2>这是一个打招呼页面</h2><br />");
    printf("<h1>这是一个打招呼页面</h1><br />");
}

//【Redis】Redis在Windows下的使用(hiredis+Qt5.7.0+mingw5.3.0)
//https://blog.csdn.net/github_38647413/article/details/124106927
/**
 * cd hiredis
 * mkdir build
 * cd build
 * cmake ..
 * cmake --build . --target hiredis --config Release
 */
void redispage()
{
    // 创建一个Redis连接上下文
    redisContext *c = redisConnect("127.0.0.1", 6379);
    if (c == NULL) {
        printf("Can't allocate redis context");
        return ;
    }

    if (c->err) {
        printf("Connection error: %s", c->errstr);
        return ;
    }

    // 执行PING命令
    redisReply *reply = redisCommand(c, "PING");
    printf("Redis-PING: %s<br />\n", reply->str);
    freeReplyObject(reply);

    reply = redisCommand(c, "SET key1 ceshi19820829");
    printf("Redis-SET(key1): %s<br />\n", reply->str);
    freeReplyObject(reply);

    reply = redisCommand(c, "GET key1");
    printf("Redis-GET(key1): %s<br />\n", reply->str);
    freeReplyObject(reply);

    // 断开连接
    redisFree(c);
}

void memcachepage()
{
    memcached_st *memc = NULL;
    memcached_return rc;
    memcached_server_st *server  = NULL;// = memcached_servers_parse(NULL);

    time_t expiration = 3;
    uint32_t flags = 0;

    char *memcacheIp = "127.0.0.1";
    char memcacheIpArr[256];
    strcpy(memcacheIpArr, memcacheIp);
    int memcachePort1 = 11211;
    int memcachePort2 = 11212;

    //printf("IP地址: %s<br />\n", memcacheIp);
    //printf("端口: %d, %d<br />\n", memcachePort1, memcachePort2);

    char *key = "key2";
    char *value = "ceshi19810909";
    //char key[] = "key2";
    //char value[] = "ceshi19810909";
    size_t keylen = strlen(key);
    size_t valuelen = strlen(value);

    //printf("测试键: %s<br />\n", key);
    //printf("测试值: %s<br />\n", value);
    //printf("<br />\n");

    memc = memcached_create(NULL);
    server = memcached_server_list_append(server, memcacheIpArr, memcachePort1, &rc);
    server = memcached_server_list_append(server, memcacheIpArr, memcachePort2, &rc);
    if(MEMCACHED_SUCCESS == rc){
        //printf("memcached_server_list_append successfully<br />\n");
    }
    else{
        //printf("memcached_server_list_append failed[%s]<br />\n", memcached_strerror(memc, rc));
    }

    //一致性哈希
    //memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA, 1);
    //memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, 1);
    //memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1);
    //memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, 0); //// 设置连接超时为0,禁用连接超时
    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);

    rc = memcached_server_push(memc, server);
    if(MEMCACHED_SUCCESS == rc){
        //printf("memcached_server_push successfully<br />\n");
    }
    else{
        //printf("memcached_server_push failed[%s]<br />\n", memcached_strerror(memc, rc));
    }
    //printf("<br />\n");

    //数据操作
    rc = memcached_set(memc, key, keylen, value, valuelen, expiration, flags);
    if(MEMCACHED_SUCCESS == rc){
        printf("Memcache-SET(%s): OK<br />\n", key);
    }
    else{
        printf("Memcache-SET(%s): Failed[%s]<br />\n", key, memcached_strerror(memc, rc));
    }

    char *result = memcached_get(memc, key, keylen, &valuelen, &flags, &rc);
    if(MEMCACHED_SUCCESS == rc){
        printf("Memcache-GET(%s): %s<br />\n", key, result);
    }
    else{
        printf("Memcache-GET(%s): Failed[%s]<br />\n", key, memcached_strerror(memc, rc));
    }

    // 断开连接
    memcached_server_list_free(server);
    memcached_free(memc);
}

void filepage()
{
    char * qs = getenv("QUERY_STRING");
    char * filekey = "file";
    char * fileval = getparam(qs, filekey);
    char file[256];
    strcpy(file, fileval);

    FILE *fp;
    char line[100];
    char filename[256];
    if(strcmp(file, "") == 0){
        strcpy(filename, "./package.json");
    }
    else{
        sprintf(filename, "./%s", file);
    }

    fp = fopen(filename, "r");
    printf("<b>文件名</b>:%s<br />\n", filename);
    printf("<b>文件内容</b>:<br />\n");
    printf("<pre>\n");
    while (fgets(line, sizeof(line), fp) != NULL) {
        printf("%s", line);
    }
    printf("</pre>\n");
    fclose(fp);
}

//gcc -g hello.c -o hello_c.cgi -I"D:\software\mysql-8.0.16-winx64\include" -L"D:\software\mysql-8.0.16-winx64\lib" -llibmysql
int main(int argc, char *argv[])
{
    printf("Content-type:text/html; charset=utf-8\r\n\r\n");
    printf("<title>C语言,mysql</title>\n\n");
    printf("<b>你好啊,屌毛</b><br /><br />\n\n");
    commonInfo(argv);

    char * qs = getenv("QUERY_STRING");
    char * actionkey = "action";
    char * pagekey = "page";
    char * pagesizekey = "pagesize";
    char * defaultaction = "index";

    char * actionval = getparam(qs, actionkey);
    char action[256];
    strcpy(action, actionval);
    if(strcmp(action, "") == 0){
        strcpy(action, defaultaction);
    }

    char * pageval = getparam(qs, pagekey);
    char pagestr[256];
    strcpy(pagestr, pageval);
    int page = 0;
    if(strcmp(pagestr, "") == 0){
        page = 1;
    }
    else{
        page = atoi(pagestr);
        if(page < 1){
            page = 1;
        }
    }

    char * pagesizeval = getparam(qs, pagesizekey);
    char pagesizestr[256];
    strcpy(pagesizestr, pagesizeval);
    int pagesize = 0;
    if(strcmp(pagesizestr, "") == 0){
        pagesize = 20;
    }
    else{
        pagesize = atoi(pagesizestr);
        if(pagesize < 1){
            pagesize = 20;
        }
    }

    //printf("main::query_string: %s<br />\n", qs);
    //printf("main::action: %s<br />\n", action);
    //printf("main::page: %d<br />\n", page);
    //printf("main::pagesize: %d<br />\n", pagesize);

    printf("页面:\n");
    if(strcmp(action, "") == 0 || strcmp(action, "index") == 0){
        printf("<a href='?action=index'><font color=red>首页1</font></a>\n");
    }
    else{
        printf("<a href='?action=index'><font>首页1</font></a>\n");
    }

    if(strcmp(action, "test1") == 0){
        printf("<a href='?action=test1'><font color=red>测试页1</font></a>\n");
    }
    else{
        printf("<a href='?action=test1'><font>测试页1</font></a>\n");
    }

    if(strcmp(action, "test2") == 0){
        printf("<a href='?action=test2'><font color=red>测试页2</font></a>\n");
    }
    else{
        printf("<a href='?action=test2'><font>测试页2</font></a>\n");
    }

    if(strcmp(action, "redis") == 0){
        printf("<a href='?action=redis'><font color=red>Redis</font></a>\n");
    }
    else{
        printf("<a href='?action=redis'><font>Redis</font></a>\n");
    }

    if(strcmp(action, "memcache") == 0){
        printf("<a href='?action=memcache'><font color=red>Memcache</font></a>\n");
    }
    else{
        printf("<a href='?action=memcache'><font>Memcache</font></a>\n");
    }

    if(strcmp(action, "file") == 0){
        printf("<a href='?action=file&file=go.sum'><font color=red>文件读取</font></a>\n");
    }
    else{
        printf("<a href='?action=file&file=go.sum'><font>文件读取</font></a>\n");
    }

    printf("<a href='?action=test3'><font>不存在的页面</font></a>\n");
    printf("<br /><br />\n\n");


    if(strcmp(action, "") == 0 || strcmp(action, "index") == 0){
        indexpage();
    }
    else if(strcmp(action, "test1") == 0){
        test1page();
    }
    else if(strcmp(action, "test2") == 0){
        test2page();
    }
    else if(strcmp(action, "redis") == 0){
        redispage();
    }
    else if(strcmp(action, "memcache") == 0){
        memcachepage();
    }
    else if(strcmp(action, "file") == 0){
        filepage();
    }
    else{
        printf("<h1>404, page not find.</h1>\n");
    }

    return 0;
}

 

相关lib:

 libmemcached 需要自己用Visual Studio 2019 编译

标签:cgi,语言,pagesize,网站,char,printf,action,memcached,strcmp
From: https://www.cnblogs.com/xuxiaobo/p/18129266

相关文章

  • C语言程序设计(第四版)第五章主要内容
    本章主要讲述<选择控制结构>一、关系运算符与表达式1.既不能在<=、>=、==、!=的符号中间插入空格,也不能将!=、<=、>=的两个符号写反,更不能以相应的数学运算符相混淆。2.不要将==误写为=。3.用非0值表示"真",用0值表示"假"。二、用于单分支控制的条件语句if(表达式p) 语......
  • C语言 位域
    C语言的位域(bit-field)是一种特殊的结构体成员,允许我们按位对成员进行定义,指定其占用的位数。如果程序的结构中包含多个开关的变量,即变量值为TRUE/FALSE,如下:struct{unsignedintwidthValidated;unsignedintheightValidated;}status;这种结构需要8字节的......
  • Battleship程序设计语言与技术
    程序设计语言与技术课业10:战舰截止日期以画布为准)对于HW10,你可以作为一个小组(不超过2名学生)工作。请提及您的每个代码文件顶部的合作者姓名。这个家庭课业比以前的课业更详细,所以请尽早开始它涉及以下主题:●继承和覆盖●访问修饰符●抽象课程(我们将在下一堂课中了解这些内容)●......
  • 网站使用nginx部署ssl证书开启https(开启http2)
    目录网站部署ssl证书就是将网站的http协议转换为更加安全的https协议1、腾讯云申请ssl证书2、下载证书3、xftp将下载的证书上传到服务器指定的目录下4、nginx配置对应域名的443端口,开启ssl5、nginx监听对应域名的80端口返回301强制重定向到该域名下的ssl443端口测试HTTP......
  • Java程序设计教程(第九版)1.4Java编程语言
    目录1.4Java编程语言Java程序注释标识符和保留字空白符1.4Java编程语言ava是第一种能够将编写的程序在Web浏览器中执行的语言Java程序基本结构:注释类(class)的定义方法注释注释应当揭示程序的初衷或意图,注释将被计算机忽略,并不影响程序执行两种注释形式://……(被......
  • 从零开始学习C语言 第一篇如何学习C语言
    想必大家和我一样,都是在B站上大学,或者报一些网课,我自己学习下来发现“鹏哥C语言”(B站上搜鹏哥C语言)是一个很不错的网课,里面有专属于你的问答群,四五个老师服务你一个人,并且有问必答,除了编程方面的,学习、生活方面的问题都可以和他们沟通,他们会像长者一样毫无保留地为你传道授业解......
  • 数据结构之顺序表(java语言版)
    顺序表是最简单的线性表,也就是数组。很多语言都把把它当做内置的基本数据类型,这里的数组没有对应数据结构的操作。数组是顺序存储的结构,连续分配一段内存用于存储数据。在逻辑结构和物理结构上都是连续的。顺序表建立在java内置的数组上建立顺序表。publicclassArray{ pri......
  • 数据结构之栈(java语言版)
    栈(stack):在逻辑上是一种线性存储结构,它有以下几个特点:1、栈中数据是按照"后进先出(LIFO,LastInFirstOut)"方式进出栈的。2、向栈中添加/删除数据时,只能从栈顶进行操作。栈通常包括的三种操作:push、peek、pop。push--向栈中添加元素。peek--返回栈顶元素。pop--返......
  • 数据结构之队列(java语言版)
    队列(Queue):在逻辑上是一种线性存储结构。它有以下几个特点:1、队列中数据是按照"先进先出(FIFO,First-In-First-Out)"方式进出队列的。2、队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。队列通常包括的两种操作:入队列和出队列。队列的种类也很多,单向队列,双向队列,循......
  • 数据结构之二叉树(java语言版)
    之前的都是线性结构,而树结构在计算机应用中的应用更加广泛。linux中的目录结构,某些数据库的底层存储等,都是采用树结构进行构架的。树的概念线性表是一对一的关系,而树是一对多的关系。树的结点:包含一个数据元素及若干指向子树的分支;孩子结点:结点的子树的根称为该结点的孩子;双......