sql与html

发布于:2025-03-20 ⋅ 阅读:(16) ⋅ 点赞:(0)

sqlite3

sql

// sqlite3_open
// sqlite3_exec
// sqlite3_close

// int sqlite3_open(const char *filename,sqlite3 **ppDb);
// const char *filename,   /* 数据库文件名 */
//  sqlite3 **ppDb /* 指向 sqlite3 对象的指针 */
// 函数成功打开或创建数据库时,会将指向 sqlite3 对象的指针存储在 *ppDb 中
//  return SQLITE_OK(值为0)表示成功

// int sqlite3_exec(sqlite3* db,const char *sql,int (*callback)(void*,int,char**,char**),void *data,char **errmsg);
//   sqlite3* db    /* 数据库连接句柄 */
//   const char *sql   /* 要执行的 SQL 语句 */
// int (*callback)(void*,int,char**,char**),  /* 回调函数 */
// 这是一个回调函数指针,当执行的 SQL 语句是查询语句时,
// 每查询到一行数据,SQLite 就会调用一次这个回调函数。
// void *data,      /* 传递给回调函数的参数 */
// 常用于在 sqlite3_exec 和回调函数之间传递上下文信息
// char **errmsg    /* 用于存储错误信息的指针 */
// 用于存储执行 SQL 语句时产生的错误信息
// return SQLITE_OK(值为0)表示成功

// int sqlite3_close(sqlite3 *db);
//   sqlite3* db    /* 数据库连接句柄 */
// return SQLITE_OK(值为0)表示成功
// return SQLITE_BUSY 表示处于忙碌状态,无法立即关闭

#include <stdio.h>
#include <sqlite3.h>

int main(int argc, char const *argv[])
{
    sqlite3 *db = NULL;
    int ret = sqlite3_open("/home/linux/sec5_sqlite3/1.db", &db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_open %s", sqlite3_errstr(ret));
        return 1;
    }
    const char buf[2024] = "insert into user values(12,'lisan',28);";
    char *errmsg = NULL;
    int ret2 = sqlite3_exec(db, buf, NULL, NULL, &errmsg);
    //当想使用select时,才会使用回调函数
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_exec %s", errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }
    int ret3 = sqlite3_close(db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_close %s", sqlite3_errstr(ret3));
        sqlite3_free(errmsg);
        return 1;
    }
    return 0;
}

sql_callback

// sqlite3_open
// sqlite3_exec
// sqlite3_close

// int sqlite3_open(const char *filename,sqlite3 **ppDb);
// const char *filename,   /* 数据库文件名 */
//  sqlite3 **ppDb /* 指向 sqlite3 对象的指针 */
// 函数成功打开或创建数据库时,会将指向 sqlite3 对象的指针存储在 *ppDb 中
//  return SQLITE_OK(值为0)表示成功

// int sqlite3_exec(sqlite3* db,const char *sql,int (*callback)(void*,int,char**,char**),void *data,char **errmsg);
//   sqlite3* db    /* 数据库连接句柄 */
//   const char *sql   /* 要执行的 SQL 语句 */
// int (*callback)(void*,int,char**,char**),  /* 回调函数 */
// 这是一个回调函数指针,当执行的 SQL 语句是查询语句时,
// 每查询到一行数据,SQLite 就会调用一次这个回调函数。
// void *data,      /* 传递给回调函数的参数 */
// 常用于在 sqlite3_exec 和回调函数之间传递上下文信息
// char **errmsg    /* 用于存储错误信息的指针 */
// 用于存储执行 SQL 语句时产生的错误信息
// return SQLITE_OK(值为0)表示成功

// int sqlite3_close(sqlite3 *db);
//   sqlite3* db    /* 数据库连接句柄 */
// return SQLITE_OK(值为0)表示成功
// return SQLITE_BUSY 表示处于忙碌状态,无法立即关闭

//int (*callback)(void *data, int argc, char **argv, char **azColName)
//void *data sqlite3_exec 的第 4 个参数,用于在 sqlite3_exec 和回调函数之间传递数据。
//int argc 你想查询的几列数据的列数
//char **argv 所返回的结果字符指针数组,每个元素指向当前查询结果行中对应列的数据
//char **azColName 也是一个字符指针数组,每个元素指向当前查询结果列的列名
//return 这里需要返回0,如果返回的不是0,就不会再调用回调函数

#include <stdio.h>
#include <sqlite3.h>

int callback(void *data,int lie,char **argv,char **titile)
{
    static int flag=0;
    if(flag==0)
    {
        for(int n=0;n<lie;n++)
        {
            printf("%s\t",titile[n]);
        }
        printf("\n");
        flag++;
    }
    for(int n=0;n<lie;n++)
    {
        printf("%s\t",argv[n]);
    }
    printf("\n");
    return 0;
}

int main(int argc, char const *argv[])
{
    sqlite3 *db = NULL;
    int ret = sqlite3_open("/home/linux/sec5_sqlite3/1.db", &db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_open %s", sqlite3_errstr(ret));
        return 1;
    }
    const char buf[2024] = "select * from user;";
    char *errmsg = NULL;
    int ret2 = sqlite3_exec(db, buf, callback, NULL, &errmsg);
    //当想使用select时,才会使用回调函数
    if (ret2 != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_exec %s", errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }
    int ret3 = sqlite3_close(db);
    if (ret3 != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_close %s", sqlite3_errstr(ret3));
        sqlite3_free(errmsg);
        return 1;
    }
    return 0;
}

sql_dict

// 代码要求:
// 使用数据库编程方式,把dict.txt的内容存储到数据库。
// 然后查询单词,如果找到对应的单词,显示意思,否则,显示单词输入错误。
// #quit ,退出程序。

// 遇到的问题:
// 1.od -t dict.txt 这里面有\r\n,\r会把光标返回这一行的开头,得去掉
// 2.dict.txt里面的单词和解释有'号,得在拼接的字符中用\"来规避,因为\'转义后还是'它本身
// 3.select *from user3 where word = "abandon";双引号就都要双引号

#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <strings.h>
#include <time.h>
char *return_buf(char *order2, char *str)
{
    // 确保 order2 数组足够大
    // char order2[256] = "insert into user3 values('";
    // char str[128] = "abandonment      n.  abandoning";

    // 找到第一个非空格字符的位置
    char *start = str;
    while (*start == ' ')
    {
        start++;
    }

    // 找到第一个连续空格区域的起始位置
    char *end = start;
    while (*end != '\0' && *end != ' ')
    {
        end++;
    }

    // 找到连续空格区域后的第一个非空格字符的位置
    char *next_start = end;
    while (*next_start != '\0' && *next_start == ' ')
    {
        next_start++;
    }

    // 提取第一部分
    *end = '\0';
    char *part1 = start;

    // 提取第二部分
    char *part2 = next_start;

    // 拼接第一部分
    strcat(order2, part1);
    // 拼接逗号和引号
    strcat(order2, "\", \"");
    // 拼接第二部分
    strcat(order2, part2);
    // 去掉换行符
    order2[strlen(order2) - 2] = '\0';
    // 拼接结尾的引号和分号
    strcat(order2, "\");");

    // printf("%s\n%s\n", part1, part2);
    // printf("%s\n", order2);
    // fflush(stdout);

    return order2;
}

// 只有满足条件where name = apple 才会进入callback回调函数中
// 然后才会返回0  不然返回1   
int callback(void *data, int lie, char **argv, char **titile)
{

    for (int n = 0; n < lie; n++)
    {
        printf("%s\t", argv[n]);
    }
    printf("\n");
    *(int *)data = 1;
    return 0;
}

int main(int argc, char const *argv[])
{
    
    sqlite3 *db = NULL;
    char *errmsg = NULL;
    int ret = sqlite3_open("/home/linux/sec5_sqlite3/2.db", &db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_open %s", sqlite3_errstr(ret));
        return 1;
    }
    //删除之前的表
    char sql_cmd[1024] = "drop table user3;";
    sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);





    char order1[256] = "create table user3(word char,explain char);";
    char order2[256] = "insert into user3 values(\"";
    // 文件操作
    FILE *fp = fopen("/home/linux/sec5_sqlite3/dict.txt", "r");
    char buf[1024] = {0};
    //char *errmsg = NULL;
    sqlite3_exec(db, order1, NULL, NULL, &errmsg);

    //char sql_cmd[1024] = "drop table dict;";
    time_t tm;
    time(&tm);
    // 开启事务 为了提速
    bzero(sql_cmd, sizeof(sql_cmd));
    strcpy(sql_cmd, "BEGIN TRANSACTION;");
    sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);

    while (1)
    {
        // fgets一行一行读
        char *str = fgets(buf, sizeof(buf), fp);
        char order2_2[1024] = {0};
        // 这里是为了将这个命令备份,不然就会一直复制在后面
        strcpy(order2_2, order2);
        if (str == NULL)
        {
            break;
        }
        // printf("%s\n",str);
        // 分割
        // abandonment      n.  abandoning
        char *order2_p = return_buf(order2_2, str);
        // printf("%s\n", order2_p);
        ret = sqlite3_exec(db, order2_p, NULL, NULL, &errmsg);
        if (ret != SQLITE_OK)
        {
            fprintf(stderr, "sqlite3_exec %s \n", errmsg);
            return 1;
        }
    }

    // 关闭事务
    bzero(sql_cmd, sizeof(sql_cmd));
    strcpy(sql_cmd, "COMMIT;");
    sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    time_t tm2;
    time(&tm2);
    printf("spend time %lu s\n", tm2 - tm);

    char *str2 = "#quit";
    while (1)
    {
        char str1[56] = {0};
        printf("input a word\n");
        fflush(stdout);
        fgets(str1, sizeof(str1), stdin);
        str1[strlen(str1) - 1] = '\0';
        if (strcmp(str1, str2) == 0)
        {
            break;
        }
        char str3[256] = {0};
        bzero(str3, sizeof(str3));
        // select *from user3 where word = "abandon";
        sprintf(str3, "select *from user3 where word = '%s';", str1);
        int flag = 0;
        int ret = sqlite3_exec(db, str3, callback, &flag, &errmsg);
        if (SQLITE_OK != ret)
        {
            fprintf(stderr, "sqlite3_exec [%s] [%s] \n", sql_cmd, errmsg);
            sqlite3_free(errmsg);
            sqlite3_close(db);
            return 1;
        }
        //判断flag
        if(flag==0)
        {
            printf("do not find a word\n");
        }
    }

    sqlite3_close(db);
    return 0;
}

html

html

01ser
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <unistd.h>

#include <netinet/in.h>
#include <netinet/ip.h>
#include <time.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>

#include <sqlite3.h>

typedef struct sockaddr *(SA);

//http回应头中有描述返回的东西是什么类型的
//所以定义一个enum枚举类型
typedef enum
{
    FILE_HTML,FILE_PNG,FILE_JPG
}FILE_TYPE;
// callback
int show(void *arg, int col, char **result, char **title)
{

    printf("%s %s\n", result[1], result[2]);
    *(int *)arg = 1;
    printf("show_arg=%d\n", *(int *)arg);
    return 0;
}

int send_head(int conn, char *filename,FILE_TYPE type)
{
    char *http_cmd[5] = {NULL};
    struct stat st;
    int ret = stat(filename, &st);
    if (-1 == ret)
    {
        fprintf(stderr, "send_head %s filename :%s\n", strerror(errno), filename);
        return 1;
    }
    char buf[512] = {0};
    http_cmd[0] = "HTTP/1.1 200 OK\r\n";
    http_cmd[1] = "Date: Sat, 08 Feb 2025 09:13:29 GMT\r\n";
    http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
    switch(type)
    {
        case FILE_HTML:
        http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
        break;
        case FILE_PNG:
        http_cmd[2] = "content-type: image/png\r\n";
        break;
        case FILE_JPG:
        http_cmd[2] = "content-type: image/jpeg\r\n";
        break;
        default:
        http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
        break;
    }
    http_cmd[3] = "Server: mywebser\r\n";
    // http_cmd[4]="Content-Length: 0\r\n\r\n";
    http_cmd[4] = buf;
    sprintf(http_cmd[4], "Content-Length: %lu\r\n\r\n", st.st_size);

    int i = 0;
    for (i = 0; i < 5; i++)
    {
        send(conn, http_cmd[i], strlen(http_cmd[i]), 0);
    }
    return 0;
}

int send_file(int conn, char *filename,FILE_TYPE type)
{
    send_head(conn, filename,type);
    int fd = open(filename, O_RDONLY);
    if (-1 == fd)
    {
        perror("open");
        return 1;
    }
    char buf[4096] = {0};
    while (1)
    {
        bzero(buf, sizeof(buf));
        int rd_ret = read(fd, buf, sizeof(buf));
        if (rd_ret <= 0)
        {
            break;
        }
        send(conn, buf, rd_ret, 0);
    }

    return 0;
}


int main(int argc, char **argv)
{
    // sqlite数据库部分
    sqlite3 *db = NULL;
    char *errmsg = NULL;
    int ret = sqlite3_open("/home/linux/sec5_html/1.db", &db);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_open %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }

    //-------------------------------------
    // 监听套接子
    int listfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == listfd)
    {

        perror("socket");
        exit(1);
    }
    // 更改套接字选项,使得套接字别进入冷却
    int on = 1;
    setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    setsockopt(listfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));

    // man 7 ip
    struct sockaddr_in ser, cli;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(80);
    ser.sin_addr.s_addr = INADDR_ANY;
    ret = bind(listfd, (SA)&ser, sizeof(ser));
    if (-1 == ret)
    {
        perror("bind");
        return 1;
    }

    listen(listfd, 3); // 建立链接的排队数
    socklen_t len = sizeof(cli);
    // 通信套接子

    while (1)
    {

        int conn = accept(listfd, (SA)&cli, &len);
        if (-1 == conn)
        {
            perror("accept");
            close(conn);
            continue;
        }
        char buf[2048] = {0};
        int rd_ret = recv(conn, buf, sizeof(buf), 0);
        if (rd_ret <= 0)
        {
            close(conn);
            continue;
        }
        printf("%s\n", buf);

        // GET / HTTP/1.1\r\n
        char *method = NULL;
        char *url = NULL;
        char *ver = NULL;

        method = strtok(buf, " ");
        url = strtok(NULL, " ");
        ver = strtok(NULL, "\r");
        if (0 == strcmp(url, "/"))
        {
            send_file(conn, "./03.html",FILE_HTML);
        }

        //  GET /login?username=zhangsan\0userpw=123 HTTP/1.1
        if (0 == strncmp(url, "/login", 6))
        {

            char *name = NULL;
            char *pw = NULL;
            char *end = NULL;
            name = strchr(url, '=');
            name += 1;
            end = strchr(name, '&');
            *end = '\0';
            pw = strchr(end + 1, '=');
            pw += 1;
            // char sql_cmd[1024] = {0};
            // sprintf(sql_cmd, "select * from dict ;");
            // sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
            // sqlite3数据库部分
            while (1)
            {
                int flag = 0;
                char sql_cmd[1024] = {0};
                sprintf(sql_cmd, "select * from dict where word=\"%s\" and passport=\"%s\";", name, pw);

                ret = sqlite3_exec(db, sql_cmd, show, &flag, &errmsg);
                printf("name= %s pw=%s",name,pw);
                printf("sql_cmd=%s\n",sql_cmd);
                fflush(stdout);
                if (SQLITE_OK != ret)
                {
                    fprintf(stderr, "sqlite3_exec [%s] [%s] \n", sql_cmd, errmsg);
                    sqlite3_free(errmsg);
                    sqlite3_close(db);
                    return 1;
                }
                // GET /login?username=zhangsan&userpw=123 HTTP/1.1
                printf("---------------flag=%d\n", flag);
                if (flag == 1)
                {
                    send_file(conn, "./01.html",FILE_HTML);
                    printf("flag=%d\n", flag);
                    fflush(stdout);
                    break;
                }
                if (flag == 0)
                {
                    send_file(conn, "./04.html",FILE_HTML);
                    printf("flag=%d\n", flag);
                    fflush(stdout);
                    break;
                }
                // if (0 == strcmp(name, "zhangsan") && 0 == strcmp(pw, "123"))
                // {
                //     send_file(conn, "./01.html");
                // }
                // else
                // {
                //     send_file(conn, "./04.html");
                // }
            }
        }
        // GET /03.html HTTP/1.1
        if (0 == strcmp(url, "/03.html"))
        {
            send_file(conn, "./03.html",FILE_HTML);
        }
        // // GET /jd.png HTTP/1.1
        // if (0 == strcmp(url, "/jd.png"))
        // {
        //     send_file(conn, "./jd.png");
        // }
        // // GET /1.png HTTP/1.1
        // if (0 == strcmp(url, "/1.png"))
        // {
        //     send_file(conn, "./1.png");
        // }
        // GET /favicon.ico HTTP/1.1
        if (0 == strcmp(url, "/favicon.ico"))
        {
            send_file(conn, "./jd.png",FILE_PNG);
        }
        //GET /x.png HTTP/1.1
        if(strlen(url)>=6&&strcmp(&url[strlen(url)-3],"png")==0)
        {
            //url+1就是指针往后移一位从取/x.png到取x.png
            send_file(conn,url+1,FILE_PNG);
        }
        //GET /x.jpg HTTP/1.1
        if(strlen(url)>=6&&strcmp(&url[strlen(url)-3],"jpg")==0)
        {
            //url+1就是指针往后移一位从取/x.png到取x.png
            send_file(conn,url+1,FILE_JPG);
        }

        // time_t tm;
        // time(&tm);
        // sprintf(buf, "%s %s", buf, ctime(&tm));
        // send(conn, buf, strlen(buf), 0);
        close(conn);
    }

    close(listfd);
    return 0;
}

02ser
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <unistd.h>

#include <netinet/in.h>
#include <netinet/ip.h>
#include <time.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>

#include<sqlite3.h>

typedef struct sockaddr *(SA);

//callback
int show(void *arg, int col, char **result, char **title) 
{
 
  printf("%s %s\n",result[1],result[2]);
  *(int*)arg = 1;
  return 0;
}

int send_head(int conn, char *filename)
{
    char *http_cmd[5] = {NULL};
    struct stat st;
    int ret = stat(filename, &st);
    if (-1 == ret)
    {
        fprintf(stderr, "send_head %s filename :%s\n", strerror(errno), filename);
        return 1;
    }
    char buf[512] = {0};
    http_cmd[0] = "HTTP/1.1 200 OK\r\n";
    http_cmd[1] = "Date: Sat, 08 Feb 2025 09:13:29 GMT\r\n";
    http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
    http_cmd[3] = "Server: mywebser\r\n";
    // http_cmd[4]="Content-Length: 0\r\n\r\n";
    http_cmd[4] = buf;
    sprintf(http_cmd[4], "Content-Length: %lu\r\n\r\n", st.st_size);

    int i = 0;
    for (i = 0; i < 5; i++)
    {
        send(conn, http_cmd[i], strlen(http_cmd[i]), 0);
    }
    return 0;
}

int send_file(int conn, char *filename)
{
    send_head(conn, filename);
    int fd = open(filename, O_RDONLY);
    if (-1 == fd)
    {
        perror("open");
        return 1;
    }
    char buf[4096] = {0};
    while (1)
    {
        bzero(buf, sizeof(buf));
        int rd_ret = read(fd, buf, sizeof(buf));
        if (rd_ret <= 0)
        {
            break;
        }
        send(conn, buf, rd_ret, 0);
    }

    return 0;
}
int main(int argc, char **argv)
{
    //sqlite数据库部分
    sqlite3 *db = NULL;
  char *errmsg = NULL;
  int ret = sqlite3_open("/home/linux/sec5_html/1.db", &db);
  if (SQLITE_OK != ret) 
  {
    fprintf(stderr, "sqlite3_open %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return 1;
  }






    //-------------------------------------
    // 监听套接子
    int listfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == listfd)
    {

        perror("socket");
        exit(1);
    }
    // 更改套接字选项,使得套接字别进入冷却
    int on = 1;
    setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    setsockopt(listfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));

    // man 7 ip
    struct sockaddr_in ser, cli;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(80);
    ser.sin_addr.s_addr = INADDR_ANY;
    int ret = bind(listfd, (SA)&ser, sizeof(ser));
    if (-1 == ret)
    {
        perror("bind");
        return 1;
    }

    listen(listfd, 3); // 建立链接的排队数
    socklen_t len = sizeof(cli);
    // 通信套接子

    while (1)
    {

        int conn = accept(listfd, (SA)&cli, &len);
        if (-1 == conn)
        {
            perror("accept");
            close(conn);
            continue;
        }
        char buf[2048] = {0};
        int rd_ret = recv(conn, buf, sizeof(buf), 0);
        if (rd_ret <= 0)
        {
            close(conn);
            continue;
        }
        printf("%s\n", buf);

        // GET / HTTP/1.1\r\n
        char *method = NULL;
        char *url = NULL;
        char *ver = NULL;

        method = strtok(buf, " ");
        url = strtok(NULL, " ");
        ver = strtok(NULL, "\r");
        if (0 == strcmp(url, "/"))
        {
            send_file(conn, "./03.html");
        }

        //  GET /login?username=zhangsan\0userpw=123 HTTP/1.1
        if (0 == strncmp(url, "/login", 6))
        {

            char *name = NULL;
            char *pw = NULL;
            char *end = NULL;
            name = strchr(url, '=');
            name += 1;
            end = strchr(name, '&');
            *end = '\0';
            pw = strchr(end + 1, '=');
            pw += 1;
            if (0 == strcmp(name, "zhangsan") && 0 == strcmp(pw, "123"))
            {
                send_file(conn, "./01.html");
            }
            else
            {
                send_file(conn, "./04.html");
            }
        }
        // GET /03.html HTTP/1.1
        if (0 == strcmp(url, "/03.html"))
        {
            send_file(conn, "./03.html");
        }
        //GET /jd.png HTTP/1.1
        // if (0 == strcmp(url, "/jd.png"))
        // {
        //     send_file(conn, "./jd.png");
        // }
        // //GET /1.png HTTP/1.1
        // if (0 == strcmp(url, "/1.png"))
        // {
        //     send_file(conn, "./1.png");
        // }
        //GET /x.png HTTP/1.1
        if(strlen(url)>=6&&strcmp(&url[strlen(url)-3],"png")==0)
        {
            //url+1就是指针往后移一位从取/x.png到取x.png
            send_file(conn,url+1);
        }
        //GET /x.jpg HTTP/1.1
        if(strlen(url)>=6&&strcmp(&url[strlen(url)-3],"jpg")==0)
        {
            //url+1就是指针往后移一位从取/x.png到取x.png
            send_file(conn,url+1);
        }
        // time_t tm;
        // time(&tm);
        // sprintf(buf, "%s %s", buf, ctime(&tm));
        // send(conn, buf, strlen(buf), 0);
        close(conn);
    }

    close(listfd);
    return 0;
}

sql_work
#include <sqlite3.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
int show(void *arg, int col, char **result, char **title) 
{
 
  printf("%s %s\n",result[1],result[2]);
  *(int*)arg = 1;
  return 0;
}
int main(int argc, char **argv) {
  sqlite3 *db = NULL;
  char *errmsg = NULL;
  int ret = sqlite3_open("/home/linux/20241230cd/sec5_db/1.db", &db);
  if (SQLITE_OK != ret) {
    fprintf(stderr, "sqlite3_open %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return 1;
  }

  // drop table
  char sql_cmd[1024] = "drop table dict;";
  sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);

  // create table
  bzero(sql_cmd, sizeof(sql_cmd));
  strcpy(sql_cmd,
         "create table dict(id INTEGER PRIMARY KEY ASC,word char ,mean text);");
  sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);

  time_t tm;
  time(&tm);
  // 开启事务 为了提速
   bzero(sql_cmd, sizeof(sql_cmd));
  strcpy(sql_cmd,
         "BEGIN TRANSACTION;");
  sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
  FILE *fp = fopen("/home/linux/dict.txt", "r");
  if (NULL == fp) {
    perror("fopen");
    return 1;
  }
  
  while (1) 
  {
    char linebuf[1024] = {0};
    if (NULL == fgets(linebuf, sizeof(linebuf), fp)) 
    {
      break;
    }
    char *word = strtok(linebuf, " ");
    char *mean = strtok(NULL, "\r");

    bzero(sql_cmd, sizeof(sql_cmd));
    sprintf(sql_cmd, "insert into dict values(NULL,\"%s\",\"%s\");", word,
            mean);
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret) {
      fprintf(stderr, "sqlite3_exec [%s] [%s] \n", sql_cmd, errmsg);
      sqlite3_free(errmsg);
      sqlite3_close(db);
      return 1;
    }
  }
  
  
   // 关闭事务 
   bzero(sql_cmd, sizeof(sql_cmd));
  strcpy(sql_cmd,
         "COMMIT;");
  sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
  time_t tm2;
  time(&tm2);
  printf("spend time %lu s\n",tm2-tm);
  
  while(1)
  {

    printf("input word:\n");
    char want_word[50]={0};
    fgets(want_word,sizeof(want_word),stdin); //zoo\n
    want_word[strlen(want_word)-1]='\0';
    if(0==strcmp(want_word,"#quit"))
    {
      break;
    }
    bzero(sql_cmd, sizeof(sql_cmd));
    //strcpy(sql_cmd, "select * from user;");
    sprintf(sql_cmd, "select * from dict where word=\"%s\";",want_word);
    int flag = 0 ;
  ret = sqlite3_exec(db, sql_cmd, show, &flag, &errmsg);
  if (SQLITE_OK != ret) {
    fprintf(stderr, "sqlite3_exec [%s] [%s] \n", sql_cmd, errmsg);
    sqlite3_free(errmsg);
    sqlite3_close(db);
    return 1;
  }
  if(0 == flag)
  {
    printf("cant find word, %s\n",want_word);
  }
}
  sqlite3_close(db);

  return 0;
}

html_ser
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <unistd.h>

#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/stat.h>
#include <time.h>
typedef struct sockaddr *(SA);
typedef enum {FILE_HTML,FILE_PNG,FILE_JPG}FILE_TYPE;
int send_head(int conn, char *filename,FILE_TYPE type) {
  char *http_cmd[5] = {NULL};
  struct stat st;
  int ret = stat(filename, &st);
  if (-1 == ret) {
    fprintf(stderr, "send_head %s filename :%s\n", strerror(errno), filename);
    return 1;
  }
  char buf[512] = {0};
  http_cmd[0] = "HTTP/1.1 200 OK\r\n";
  http_cmd[1] = "Date: Sat, 08 Feb 2025 09:13:29 GMT\r\n";
  // image/png
  switch (type)
  {
    case FILE_HTML:
    http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
    break;
    case FILE_JPG:
    http_cmd[2] = "content-type: image/jpeg\r\n";
    break;
    case FILE_PNG:
    http_cmd[2] = "content-type: image/png\r\n";
    break;
  default:
  http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
    break;
  }
  
  http_cmd[3] = "Server: mywebser\r\n";
  // http_cmd[4]="Content-Length: 0\r\n\r\n";
  http_cmd[4] = buf;
  sprintf(http_cmd[4], "Content-Length: %lu\r\n\r\n", st.st_size);

  int i = 0;
  for (i = 0; i < 5; i++) {
    send(conn, http_cmd[i], strlen(http_cmd[i]), 0);
  }
  return 0;
}

int send_file(int conn, char *filename,FILE_TYPE type) {
  send_head(conn, filename,type);
  int fd = open(filename, O_RDONLY);
  if (-1 == fd) {
    perror("open");
    return 1;
  }
  char buf[4096] = {0};
  while (1) {
    bzero(buf, sizeof(buf));
    int rd_ret = read(fd, buf, sizeof(buf));
    if (rd_ret <= 0) {
      break;
    }
    send(conn, buf, rd_ret, 0);
  }

  return 0;
}
int main(int argc, char **argv) {

  //监听套接子
  int listfd = socket(AF_INET, SOCK_STREAM, 0);
  if (-1 == listfd) {

    perror("socket");
    exit(1);
  }
  // man 7 ip
  struct sockaddr_in ser, cli;
  ser.sin_family = AF_INET;
  ser.sin_port = htons(80);
  ser.sin_addr.s_addr = INADDR_ANY;
  int on = 1;
  setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
  setsockopt(listfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));
  int ret = bind(listfd, (SA)&ser, sizeof(ser));
  if (-1 == ret) {
    perror("bind");
    return 1;
  }

  listen(listfd, 3); // 建立链接的排队数
  socklen_t len = sizeof(cli);
  //通信套接子

  while (1) {

    int conn = accept(listfd, (SA)&cli, &len);
    if (-1 == conn) {
      perror("accept");
      close(conn);
      continue;
    }
    char buf[2048] = {0};
    int rd_ret = recv(conn, buf, sizeof(buf), 0);
    if (rd_ret <= 0) {
      close(conn);
      continue;
    }
    printf("%s\n", buf);

    // GET / HTTP/1.1\r\n
    char *method = NULL;
    char *url = NULL;
    char *ver = NULL;

    method = strtok(buf, " ");
    url = strtok(NULL, " ");
    ver = strtok(NULL, "\r");
    if (0 == strcmp(url, "/")) {
      send_file(conn, "./03.html",FILE_HTML);
    }

    //  GET /login?username=zhangsan\0userpw=123 HTTP/1.1
    else if (0 == strncmp(url, "/login", 6)) {

      char *name = NULL;
      char *pw = NULL;
      char *end = NULL;
      name = strchr(url, '=');
      name += 1;
      end = strchr(name, '&');
      *end = '\0';
      pw = strchr(end + 1, '=');
      pw += 1;
      if (0 == strcmp(name, "zhangsan") && 0 == strcmp(pw, "123")) {
        send_file(conn, "./01.html",FILE_HTML);
      } else {
        send_file(conn, "./04.html",FILE_HTML);
      }
    }
    // /1.jpg  /2
    else if (strlen(url)>=6 && 0 == strcmp(&url[strlen(url)-3], "jpg") )
    {
        send_file(conn, url+1,FILE_JPG);
    }
    else if (strlen(url)>=6 && 0 == strcmp(&url[strlen(url)-3], "png") )
    {
        send_file(conn, url+1,FILE_PNG);
    }
    // time_t tm;
    // time(&tm);
    // sprintf(buf, "%s %s", buf, ctime(&tm));
    // send(conn, buf, strlen(buf), 0);
    close(conn);
  }

  close(listfd);
  return 0;
}
03.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
		<title>登录页面</title>
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	<form action='http://www.baidu.com'>
		用户名:<input  type='text'  name='username' required='required' placeholder='请输入qq的账号'>
		密码: <input  type='password' name='userpw' required='required' placeholder='请输入qq的密码'>
		<input type='submit'>
	</form>
	</body> 
</html>

webser

06ser

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <unistd.h>

#include <netinet/in.h>
#include <netinet/ip.h>
#include <time.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <strings.h>

#include <sqlite3.h>
#define BURSIZE 2048
int hex2dec(char c);
char dec2hex(short int c);
void urlencode(char url[]);
void urldecode(char url[]);

typedef struct sockaddr *(SA);

// http回应头中有描述返回的东西是什么类型的
// 所以定义一个enum枚举类型
typedef enum
{
    FILE_HTML,
    FILE_PNG,
    FILE_JPG
} FILE_TYPE;
// callback
int show(void *arg, int col, char **result, char **title)
{

    printf("%s %s\n", result[1], result[2]);
    *(int *)arg = 1;
    printf("show_arg=%d\n", *(int *)arg);
    return 0;
}

int show2(void *arg, int col, char **result, char **title)
{
    // 这里arg不是标志,而是我传的开在堆上的数组
    // printf("%s \n", result[0]);
    // fflush(stdout);
    strcat(arg, result[0]);
    ((char *)arg)[strlen(arg)] = '\n';
    return 0;
}

int show3(void *arg, int col, char **result, char **title)
{
    // 这里arg不是标志,而是我传的开在堆上的数组
    // printf("%s \n", result[0]);
    // fflush(stdout);
    // 这个result传递的是一行数据
    //**result这样*result就是一个字符串
    int n = 0;
    for (n = 0; n < col; n++)
    {
        char buf[128] = {0};
        sprintf(buf, "%s:%s", title[n], result[n]);
        strcat(arg, buf);
        strcat(arg, "\n");
    }
    return 0;
}

int show5(void *arg, int col, char **result, char **title)
{

    strcat(arg, result[0]);

    return 0;
}

int show6(void *arg, int col, char **result, char **title)
{
    // 这里arg不是标志,而是我传的开在堆上的数组
    // printf("%s \n", result[0]);
    // fflush(stdout);
    for (int n = 0; n < col; n++)
    {
        strcat(arg, result[0]);
        ((char *)arg)[strlen(arg)] = '\n';
    }
    //((char *)arg)[strlen(arg) - 1] = '\0';
    printf("----------------\n");
    return 0;
}

int send_head(int conn, char *filename, FILE_TYPE type)
{
    char *http_cmd[5] = {NULL};
    struct stat st;
    int ret = stat(filename, &st);
    if (-1 == ret)
    {
        fprintf(stderr, "send_head %s filename :%s\n", strerror(errno), filename);
        return 1;
    }
    char buf[512] = {0};
    http_cmd[0] = "HTTP/1.1 200 OK\r\n";
    http_cmd[1] = "Date: Sat, 08 Feb 2025 09:13:29 GMT\r\n";
    http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
    switch (type)
    {
    case FILE_HTML:
        http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
        break;
    case FILE_PNG:
        http_cmd[2] = "content-type: image/png\r\n";
        break;
    case FILE_JPG:
        http_cmd[2] = "content-type: image/jpeg\r\n";
        break;
    default:
        http_cmd[2] = "Content-Type: text/html;charset=utf-8\r\n";
        break;
    }
    http_cmd[3] = "Server: mywebser\r\n";
    // http_cmd[4]="Content-Length: 0\r\n\r\n";
    http_cmd[4] = buf;
    sprintf(http_cmd[4], "Content-Length: %lu\r\n\r\n", st.st_size);

    int i = 0;
    for (i = 0; i < 5; i++)
    {
        send(conn, http_cmd[i], strlen(http_cmd[i]), 0);
    }
    return 0;
}

int send_file(int conn, char *filename, FILE_TYPE type)
{
    send_head(conn, filename, type);
    int fd = open(filename, O_RDONLY);
    if (-1 == fd)
    {
        perror("open");
        return 1;
    }
    char buf[4096] = {0};
    while (1)
    {
        bzero(buf, sizeof(buf));
        int rd_ret = read(fd, buf, sizeof(buf));
        if (rd_ret <= 0)
        {
            break;
        }
        send(conn, buf, rd_ret, 0);
    }

    return 0;
}

int main(int argc, char **argv)
{
    // sqlite数据库部分
    sqlite3 *db = NULL;
    char *errmsg = NULL;
    int ret = sqlite3_open("/home/linux/sec5_webser/1.db", &db);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_open %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }

    // 打开第二个数据库,开一个堆,然后写html文件
    // 把照片批量添加进去
    sqlite3 *db2 = NULL;
    char *errmsg2 = NULL;
    int ret2 = sqlite3_open("/home/linux/sec5_webser/componet.db", &db2);
    if (SQLITE_OK != ret2)
    {
        fprintf(stderr, "sqlite3_open %s\n", sqlite3_errmsg(db2));
        sqlite3_close(db2);
        return 1;
    }
    
    int flag2 = 0;
    char sql_cmd2[1024] = {0};
    sprintf(sql_cmd2, "select goods_img from goods ;");
    char *p_buf = (char *)malloc(1024 * 1024);
    memset(p_buf, 0, sizeof(p_buf));
    ret2 = sqlite3_exec(db2, sql_cmd2, show2, p_buf, &errmsg);
    const char *pathbuf = "/home/linux/sec5_webser/picture.txt";
    int fd_buf = open(pathbuf, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    write(fd_buf, p_buf, strlen(p_buf));
    printf("%s\n", p_buf);
    // close(fd_buf);
    // 对得到的图片名称载入html文件格式中
    const char *pathbuf_html12 = "/home/linux/sec5_webser/012.html";
    int fd_012html = open(pathbuf_html12, O_RDONLY | O_CREAT, 0666);
    const char *pathbuf_html11 = "/home/linux/sec5_webser/011.html";
    int fd_011html = open(pathbuf_html11, O_WRONLY | O_CREAT | O_TRUNC, 0666);

    // const char *pathbuf_html13 = "/home/linux/sec5_webser/013.html";
    // int fd_013html = open(pathbuf_html13, O_WRONLY | O_CREAT | O_TRUNC, 0666);

    char *p_buf011html = (char *)malloc(1024 * 1024);
    memset(p_buf011html, 0, sizeof(p_buf011html));
    // 把html2的内容复制到html上
    while (1)
    {
        int longsize = read(fd_012html, p_buf011html, sizeof(p_buf011html));
        // printf("%s\n", p_buf011html);
        // fflush(stdout);
        write(fd_011html, p_buf011html, longsize);
        // write(fd_013html, p_buf011html, longsize);
        if (longsize <= 0)
        {
            break;
        }
    }
    memset(p_buf011html, 0, sizeof(p_buf011html));
    // 写入固定部分  写完关掉
    // close(pathbuf_html13);
    // read(fd_012html,p_buf011html,sizeof(p_buf011html));

    char *p_picture = strtok(p_buf, "\n");
    int n = 0;
    // char p_html="03.html";
    // 将图片名字和数组下标关联起来的数组
    char buf_picture[50][256] = {0};
    while (1)
    {
        // 将照片名字存入数组
        sprintf(buf_picture[n], "%s", p_picture);
        // printf("%d------%s\n",n,buf_picture[n]);

        //------------------
        char buf1[128] = {0};
        int t = n + 1;
        char buf2[128] = {0};
        // 向html加入标示下标
        sprintf(buf2, "06_%d.html", t);
        if (n % 4 == 0)
        {
            sprintf(buf1, "<tr><td><a href=\"%s\"><img src=\"%s\" width=\"30%%\" height=\"30%%\"></a></td>", buf2, p_picture);
        }
        else if (n % 4 == 3)
        {
            sprintf(buf1, "<td><a href=\"%s\"><img src=\"%s\" width=\"30%%\" height=\"30%%\"></a></td></tr>", buf2, p_picture);
            buf1[strlen(buf1)] = '\n';
        }
        else
        {
            sprintf(buf1, "<td><a href=\"%s\"><img src=\"%s\" width=\"30%%\" height=\"30%%\"></a></td>", buf2, p_picture);
        }
        p_picture = strtok(NULL, "\n");
        if (p_picture == NULL && n % 4 != 3)
        {
            strcat(buf1, "</tr>");
            write(fd_011html, buf1, strlen(buf1));
        }
        if (p_picture == NULL)
        {
            break;
        }
        strcat(p_buf011html, buf1);
        write(fd_011html, buf1, strlen(buf1));
        n++;
    }
    char *buf2 = "</table></body></html>";
    write(fd_011html, buf2, strlen(buf2));
    // close(fd_011html);
    // free(p_buf011html);
    //-------------------------------------
    //  监听套接子
    int listfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == listfd)
    {

        perror("socket");
        exit(1);
    }
    // 更改套接字选项,使得套接字别进入冷却
    int on = 1;
    setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    setsockopt(listfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));

    // man 7 ip
    struct sockaddr_in ser, cli;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(80);
    ser.sin_addr.s_addr = INADDR_ANY;
    ret = bind(listfd, (SA)&ser, sizeof(ser));
    if (-1 == ret)
    {
        perror("bind");
        return 1;
    }

    listen(listfd, 3); // 建立链接的排队数
    socklen_t len = sizeof(cli);
    // 通信套接子

    while (1)
    {

        int conn = accept(listfd, (SA)&cli, &len);
        if (-1 == conn)
        {
            perror("accept");
            close(conn);
            continue;
        }
        char buf[2048] = {0};
        int rd_ret = recv(conn, buf, sizeof(buf), 0);
        if (rd_ret <= 0)
        {
            close(conn);
            continue;
        }
        printf("%s\n", buf);

        // GET / HTTP/1.1\r\n
        char *method = NULL;
        char *url = NULL;
        char *ver = NULL;

        method = strtok(buf, " ");
        url = strtok(NULL, " ");
        ver = strtok(NULL, "\r");
        if (0 == strcmp(url, "/"))
        {
            send_file(conn, "./03.html", FILE_HTML);
        }

        //  GET /login?username=zhangsan\0userpw=123 HTTP/1.1
        if (0 == strncmp(url, "/login", 6))
        {

            char *name = NULL;
            char *pw = NULL;
            char *end = NULL;
            name = strchr(url, '=');
            name += 1;
            end = strchr(name, '&');
            *end = '\0';
            pw = strchr(end + 1, '=');
            pw += 1;
            // char sql_cmd[1024] = {0};
            // sprintf(sql_cmd, "select * from dict ;");
            // sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
            // sqlite3数据库部分
            while (1)
            {
                int flag = 0;
                char sql_cmd[1024] = {0};
                sprintf(sql_cmd, "select * from dict where word=\"%s\" and passport=\"%s\";", name, pw);

                ret = sqlite3_exec(db, sql_cmd, show, &flag, &errmsg);
                printf("name= %s pw=%s", name, pw);
                printf("sql_cmd=%s\n", sql_cmd);
                fflush(stdout);
                if (SQLITE_OK != ret)
                {
                    fprintf(stderr, "sqlite3_exec [%s] [%s] \n", sql_cmd, errmsg);
                    sqlite3_free(errmsg);
                    sqlite3_close(db);
                    return 1;
                }
                // GET /login?username=zhangsan&userpw=123 HTTP/1.1
                printf("---------------flag=%d\n", flag);
                if (flag == 1)
                {
                    send_file(conn, "./011.html", FILE_HTML);
                    printf("flag=%d\n", flag);
                    fflush(stdout);
                    break;
                }
                if (flag == 0)
                {
                    send_file(conn, "./04.html", FILE_HTML);
                    printf("flag=%d\n", flag);
                    fflush(stdout);
                    break;
                }
                // if (0 == strcmp(name, "zhangsan") && 0 == strcmp(pw, "123"))
                // {
                //     send_file(conn, "./01.html");
                // }
                // else
                // {
                //     send_file(conn, "./04.html");
                // }
            }
        }
        // GET /zhuce?username=1&userpw=1 HTTP/1.1
        // 注册用户
        if (0 == strncmp(url, "/zhuce", 6))
        {
            char *name = NULL;
            char *pw = NULL;
            char *end = NULL;
            name = strchr(url, '=');
            name += 1;
            end = strchr(name, '&');
            *end = '\0';
            pw = strchr(end + 1, '=');
            pw += 1;
            char sql_cmd[1024] = {0};
            // insert into dict values("aaa","123");
            sprintf(sql_cmd, "insert into dict values(\"%s\",\"%s\");", name, pw);
            ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
            send_file(conn, "./03.html", FILE_HTML);
        }
        // GET /03.html HTTP/1.1
        if (0 == strcmp(url, "/03.html"))
        {
            send_file(conn, "./03.html", FILE_HTML);
        }
        // GET /05.html HTTP/1.1
        if (0 == strcmp(url, "/05.html"))
        {
            send_file(conn, "./05.html", FILE_HTML);
        }
        // GET /011.html HTTP/1.1
        if (0 == strcmp(url, "/011.html"))
        {
            send_file(conn, "./011.html", FILE_HTML);
        }
        // GET /011.html HTTP/1.1
        if (0 == strcmp(url, "/06.html"))
        {
            send_file(conn, "./06.html", FILE_HTML);
        }
        // 回应这一类06_x.html的操作
        // GET /06_14.html HTTP/1.1
        if (strlen(url) >= 10 && strcmp(&url[strlen(url) - 4], "html") == 0 && url[3] == '_')
        {
            // 写入固定文件
            const char *pathbuf_html12 = "/home/linux/sec5_webser/012.html";
            int fd_012html = open(pathbuf_html12, O_RDONLY | O_CREAT, 0666);
            const char *pathbuf_html13 = "/home/linux/sec5_webser/013.html";
            int fd_013html = open(pathbuf_html13, O_WRONLY | O_CREAT | O_TRUNC, 0666);
            char *p_buf013html = (char *)malloc(1024 * 1024);
            memset(p_buf013html, 0, sizeof(p_buf013html));
            // 把html2的内容复制到html上
            while (1)
            {
                int longsize = read(fd_012html, p_buf013html, sizeof(p_buf013html));
                // printf("%s\n", p_buf011html);
                // fflush(stdout);
                write(fd_013html, p_buf013html, longsize);
                if (longsize <= 0)
                {
                    break;
                }
            }
            //--------------------------------
            char *p_num1 = strtok(url, "_");
            char *p_num2 = strtok(NULL, ".");
            int num = atoi(p_num2) - 1; // 和数组统一下标
            printf("num=%d---------\n", num);
            // 将图片名字和数组下标关联起来的数组
            // buf_picture[50][256]
            bzero(sql_cmd2, sizeof(sql_cmd2));
            sprintf(sql_cmd2, "select * from goods where goods_img=\"%s\";", buf_picture[num]);
            printf("%s\n", sql_cmd2);
            sqlite3 *db2 = NULL;
            char *errmsg2 = NULL;
            int ret2 = sqlite3_open("/home/linux/sec5_webser/componet.db", &db2);
            if (SQLITE_OK != ret)
            {
                fprintf(stderr, "sqlite3_open %s\n", sqlite3_errmsg(db));
                sqlite3_close(db);
                return 1;
            }
            char *p_buf3 = (char *)malloc(1024 * 1024);
            memset(p_buf3, 0, 1024 * 1024);
            // 让p_buf3接住详细信息
            sqlite3_exec(db2, sql_cmd2, show3, p_buf3, &errmsg);
            printf("%s\n", p_buf3);
            // 对得到的图片名称载入html文件格式中
            // 直接拿htm11的壳套上htm13
            // const char *pathbuf_html13 = "/home/linux/sec5_webser/013.html";
            // int fd_013html = open(pathbuf_html13, O_WRONLY | O_CREAT | O_TRUNC, 0666);
            // 插入详细信息  数据从p_buf3来 以\n为分隔符
            char *p_content = strtok(p_buf3, "\n");
            while (1)
            {
                char buf1[158] = {0};
                sprintf(buf1, "<tr><td>%s</td></tr>", p_content);
                write(fd_013html, buf1, strlen(buf1));
                p_content = strtok(NULL, "\n");
                if (p_content == NULL)
                {
                    break;
                }
            }

            char *buf2 = "</table></body></html>";
            write(fd_013html, buf2, strlen(buf2));
            send_file(conn, "./013.html", FILE_HTML);
            free(p_buf3);
            close(fd_013html);
            // close(db2);
        }

        // GET /sousuo?username=1 HTTP/1.1
        if (0 == strncmp(url, "/sousuo", 7))
        {
            const char *pathbuf_html12 = "/home/linux/sec5_webser/012.html";
            int fd_012html = open(pathbuf_html12, O_RDONLY | O_CREAT, 0666);
            const char *pathbuf_html11 = "/home/linux/sec5_webser/015.html";
            int fd_011html = open(pathbuf_html11, O_WRONLY | O_CREAT | O_TRUNC, 0666);

            memset(p_buf011html, 0, sizeof(p_buf011html));
            while (1)
            {
                int longsize = read(fd_012html, p_buf011html, sizeof(p_buf011html));
                // printf("%s\n", p_buf011html);
                // fflush(stdout);
                write(fd_011html, p_buf011html, longsize);
                // write(fd_013html, p_buf011html, longsize);
                if (longsize <= 0)
                {
                    break;
                }
            }

            //-------------
            char *name = NULL;
            name = strchr(url, '=');
            name += 1;
            char char_buf[56] = {0};
            sprintf(char_buf, "%s", name);
            urldecode(name);
            printf("%s\n", name);
            char sql_cmd[1024] = {0};
            sprintf(sql_cmd2, "select goods_img from goods where goods_name=\"%s\";", name);
            printf("%s\n",sql_cmd2);
            char *p_buf = (char *)malloc(1024 * 1024);
            memset(p_buf, 0, 1024 * 1024);
            ret2 = sqlite3_exec(db2, sql_cmd2, show6, p_buf, &errmsg);
            
            char *p = strtok(p_buf, "\n");
            for (int n = 0; n < 10; n++)
            {
                printf("%s\n", buf_picture[n]);
            }
            while (1)
            {
                char buf1[128]={0};
                char buf2[128]={0};
                char buf3[128]={0};
                int n = 0;
                while (1)
                {
                    if (strcmp(buf_picture[n], p)==0)
                    {
                        break;
                    }
                    n++;
                    if(n>=50)
                    {
                        break;
                    }
                }
                if(n<50)
                {
                sprintf(buf2,"06_%d.html",n);
                sprintf(buf1, "<tr><td><a href=\"%s\"><img src=\"%s\" width=\"30%%\" height=\"30%%\"></a></td>", buf2, p);
                write(fd_011html, buf1, strlen(buf1));
                }
                p = strtok(NULL, "\n");
                if (p == NULL)
                {
                    break;
                }
            }
            char *buf4 = "</table></body></html>";
            write(fd_011html, buf4, strlen(buf4));
            send_file(conn, "./015.html", FILE_HTML);

            free(p_buf);
        }
        // // GET /jd.png HTTP/1.1
        // if (0 == strcmp(url, "/jd.png"))
        // {
        //     send_file(conn, "./jd.png");
        // }
        // // GET /1.png HTTP/1.1
        // if (0 == strcmp(url, "/1.png"))
        // {
        //     send_file(conn, "./1.png");
        // }
        // GET /favicon.ico HTTP/1.1
        if (0 == strcmp(url, "/favicon.ico"))
        {
            send_file(conn, "./jd.png", FILE_PNG);
        }
        // GET /x.png HTTP/1.1
        if (strlen(url) >= 6 && strcmp(&url[strlen(url) - 3], "png") == 0)
        {
            // url+1就是指针往后移一位从取/x.png到取x.png

            send_file(conn, url + 1, FILE_PNG);
        }
        // GET /x.jpg HTTP/1.1
        if (strlen(url) >= 6 && strcmp(&url[strlen(url) - 3], "jpg") == 0)
        {
            // url+1就是指针往后移一位从取/x.png到取x.png
            char buf5[56] = "./img";
            buf5[strlen(buf5)] = '/';
            strcat(buf5, url + 1);
            printf("%s\n", buf5);
            // send_file(conn, url + 1, FILE_JPG);
            send_file(conn, buf5, FILE_JPG);
        }

        // time_t tm;
        // time(&tm);
        // sprintf(buf, "%s %s", buf, ctime(&tm));
        // send(conn, buf, strlen(buf), 0);
        close(conn);
    }

    free(p_buf);
    close(listfd);
    return 0;
}

int hex2dec(char c)
{
    if ('0' <= c && c <= '9')
    {
        return c - '0';
    }
    else if ('a' <= c && c <= 'f')
    {
        return c - 'a' + 10;
    }
    else if ('A' <= c && c <= 'F')
    {
        return c - 'A' + 10;
    }
    else
    {
        return -1;
    }
}

char dec2hex(short int c)
{
    if (0 <= c && c <= 9)
    {
        return c + '0';
    }
    else if (10 <= c && c <= 15)
    {
        return c + 'A' - 10;
    }
    else
    {
        return -1;
    }
}

// 编码一个url
void urlencode(char url[])
{
    int i = 0;
    int len = strlen(url);
    int res_len = 0;
    char res[BURSIZE];
    for (i = 0; i < len; ++i)
    {
        char c = url[i];
        if (('0' <= c && c <= '9') ||
            ('a' <= c && c <= 'z') ||
            ('A' <= c && c <= 'Z') ||
            c == '/' || c == '.')
        {
            res[res_len++] = c;
        }
        else
        {
            int j = (short int)c;
            if (j < 0)
                j += 256;
            int i1, i0;
            i1 = j / 16;
            i0 = j - i1 * 16;
            res[res_len++] = '%';
            res[res_len++] = dec2hex(i1);
            res[res_len++] = dec2hex(i0);
        }
    }
    res[res_len] = '\0';
    strcpy(url, res);
}

// 解码url
void urldecode(char url[])
{
    int i = 0;
    int len = strlen(url);
    int res_len = 0;
    char res[BURSIZE];
    for (i = 0; i < len; ++i)
    {
        char c = url[i];
        if (c != '%')
        {
            res[res_len++] = c;
        }
        else
        {
            char c1 = url[++i];
            char c0 = url[++i];
            int num = 0;
            num = hex2dec(c1) * 16 + hex2dec(c0);
            res[res_len++] = num;
        }
    }
    res[res_len] = '\0';
    strcpy(url, res);
}

012.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
		<title>登录页面</title>
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	<form action='/sousuo'>
		搜索:<input  type='text'  name='username' required='required' placeholder='请输入你想找的东西'>
		<input type='submit'>
	</form>
	
	<table>
	<tr><td><a href="03.html"><img src="jd.png"></a></td><td><a href="03.html"><img src="jd.png"></a></td><td><a href="03.html"><img src="jd.png"></a></td></tr>

011.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
		<title>登录页面</title>
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	<form action='/sousuo'>
		搜索:<input  type='text'  name='username' required='required' placeholder='请输入你想找的东西'>
		<input type='submit'>
	</form>
	
	<table>
	<tr><td><a href="03.html"><img src="jd.png"></a></td><td><a href="03.html"><img src="jd.png"></a></td><td><a href="03.html"><img src="jd.png"></a></td></tr>
	
<tr><td><a href="06_1.html"><img src="EE69FB1398EECEEAF563D056C354584B.jpg" width="30%" height="30%"></a></td><td><a href="06_2.html"><img src="AF9D715B6FD6C4AF49E9A7B67DCDC457.jpg" width="30%" height="30%"></a></td><td><a href="06_3.html"><img src="0625E70AB256CA970EDA9B88FF38BB43.jpg" width="30%" height="30%"></a></td><td><a href="06_4.html"><img src="2761299595A268039EEDD14AEF6FECCF.jpg" width="30%" height="30%"></a></td></tr>
<tr><td><a href="06_5.html"><img src="74FA83969A438990B07FA0986BBCEA93.jpg" width="30%" height="30%"></a></td><td><a href="06_6.html"><img src="3760AFA1A19FA9E6EAF700E3B0C69C26.jpg" width="30%" height="30%"></a></td><td><a href="06_7.html"><img src="D04158E585B9DED4D1112DD363755F84.jpg" width="30%" height="30%"></a></td><td><a href="06_8.html"><img src="D0D2B72ACF1C48D7772427D35EB3125D.jpg" width="30%" height="30%"></a></td></tr>
<tr><td><a href="06_9.html"><img src="1EB4D9C2547FDCC160797998C2DC26A2.jpg" width="30%" height="30%"></a></td><td><a href="06_10.html"><img src="1A4405F7B988E42522DDCE882CB9BDDF.jpg" width="30%" height="30%"></a></td><td><a href="06_11.html"><img src="BC40F98482E97BA19A4574013DBE1A12.jpg" width="30%" height="30%"></a></td><td><a href="06_12.html"><img src="933168405AFD2AC717EA522CDDF3C2B0.jpg" width="30%" height="30%"></a></td></tr>
<tr><td><a href="06_13.html"><img src="7D869745A3AE2C0669E421CDC4E67FF7.jpg" width="30%" height="30%"></a></td><td><a href="06_14.html"><img src="0640573D31428DCEBE8F7BEC33F1F557.jpg" width="30%" height="30%"></a></td><td><a href="06_15.html"><img src="F3868D33D8461C614059112042ADDB88.jpg" width="30%" height="30%"></a></td><td><a href="06_16.html"><img src="F1C066E112046940148D873DF2785F53.jpg" width="30%" height="30%"></a></td></tr>
<tr><td><a href="06_17.html"><img src="D3008A398FA06367EA3460DD1D7FAEF0.jpg" width="30%" height="30%"></a></td><td><a href="06_18.html"><img src="B9E47B39A8EA28C91590723E749C4A7E.jpg" width="30%" height="30%"></a></td></tr></table></body></html>
013.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
		<title>登录页面</title>
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	<form action='/sousuo'>
		搜索:<input  type='text'  name='username' required='required' placeholder='请输入你想找的东西'>
		<input type='submit'>
	</form>
	
	<table>
	<tr><td><a href="03.html"><img src="jd.png"></a></td><td><a href="03.html"><img src="jd.png"></a></td><td><a href="03.html"><img src="jd.png"></a></td></tr>
	
<tr><td>goods_id:2</td></tr><tr><td>cat_id:1</td></tr><tr><td>goods_sn:C7493865</td></tr><tr><td>goods_name:铝电解电容器</td></tr><tr><td>good_spec:25V1000uF</td></tr><tr><td>goods_number:20</td></tr><tr><td>goods_weight:2.0158(g)</td></tr><tr><td>market_price:0.375535</td></tr><tr><td>shop_price:0.475095</td></tr><tr><td>keywords:HRK(鸿瑞凯)</td></tr><tr><td>goods_desc:插件,D10xL17mm</td></tr><tr><td>goods_img:AF9D715B6FD6C4AF49E9A7B67DCDC457.jpg</td></tr></table></body></html>
015.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
		<title>登录页面</title>
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	<form action='/sousuo'>
		搜索:<input  type='text'  name='username' required='required' placeholder='请输入你想找的东西'>
		<input type='submit'>
	</form>
	
	<table>
	<tr><td><a href="03.html"><img src="jd.png"></a></td><td><a href="03.html"><img src="jd.png"></a></td><td><a href="03.html"><img src="jd.png"></a></td></tr>
	
<tr><td><a href="06_4.html"><img src="74FA83969A438990B07FA0986BBCEA93.jpg" width="30%" height="30%"></a></td><tr><td><a href="06_5.html"><img src="3760AFA1A19FA9E6EAF700E3B0C69C26.jpg" width="30%" height="30%"></a></td></table></body></html>
03.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
		<title>登录页面</title>
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	
	<form action='/login'>
		用户名:<input  type='text'  name='username' required='required' placeholder='请输入qq的账号'>
		密码: <input  type='password' name='userpw' required='required' placeholder='请输入qq的密码'>
		<input type='submit'>
		<br><a href="05.html">注册</a>
	</form>
	</body> 
</html>
04.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	<br><h1 align="center">input error</h1>
	<!----<br><a href="/">return</a>--->
	<br><a href="03.html">return</a>
	</body> 
</html>
05.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	<form action='/zhuce'>
		注册用户名:<input  type='text'  name='username' required='required' placeholder='请输入qq的账号'>
		注册密码: <input  type='password' name='userpw' required='required' placeholder='请输入qq的密码'>
		<input type='submit'>
	</form>
	</body> 
</html>
06.html
<!DOCTYPE html>
<html >
	<head>
		<meta charset="utf-8">   <!--  设置字符集防止乱码  -->
<style>
body {
  background-color: #E6E6FA;
}
</style>
	</head>
	<body>
	<br><h1 align="center">input error</h1>
	<!----<br><a href="/">return</a>--->
	<br><a href="03.html">return</a>
	</body> 
</html>