变量定义
-
DEALSHAREFILE_LOG_MODULE—日志模块的输出到该模块
-
DEALSHAREFILE_LOG_PROC —该日志模块输出的具体目录
-
定义三个static静态字符数组存放MySQL登录用户名密码和具体使用的数据库
-
定义两个static静态数组存放Redis的ip+port
-
根据以上定义判断MySQL采用本地连接,Redis采用远程连接
#define DEALSHAREFILE_LOG_MODULE "cgi" #define DEALSHAREFILE_LOG_PROC "dealsharefile" //mysql 数据库配置信息 用户名, 密码, 数据库名称 static char mysql_user[128] = {0}; static char mysql_pwd[128] = {0}; static char mysql_db[128] = {0}; //redis 服务器ip、端口 static char redis_ip[30] = {0}; static char redis_port[10] = {0};
读取配置文件
-
定义该函数用于读取配置文件中的参数包括MySQL和Redis已经做日志输出
void read_cfg() { //读取mysql数据库配置信息 get_cfg_value(CFG_PATH, "mysql", "user", mysql_user); get_cfg_value(CFG_PATH, "mysql", "password", mysql_pwd); get_cfg_value(CFG_PATH, "mysql", "database", mysql_db); LOG(DEALSHAREFILE_LOG_MODULE, DEALSHAREFILE_LOG_PROC, "mysql:[user=%s,pwd=%s,database=%s]", mysql_user, mysql_pwd, mysql_db); //读取redis配置信息 get_cfg_value(CFG_PATH, "redis", "ip", redis_ip); get_cfg_value(CFG_PATH, "redis", "port", redis_port); LOG(DEALSHAREFILE_LOG_MODULE, DEALSHAREFILE_LOG_PROC, "redis:[ip=%s,port=%s]\n", redis_ip, redis_port); }
cfg.h
-
#define CFG_PATH “./conf/cfg.json” //配置文件路径,说明MySQL和Redis的配置信息放放到当前目录上一级下的conf/cfg.json中
#ifndef _CFG_H_ #define _CFG_H_ #define CFG_PATH "./conf/cfg.json" //配置文件路径 #define CFG_LOG_MODULE "cgi" #define CFG_LOG_PROC "cfg" /* -------------------------------------------*/ /** * @brief 从配置文件中得到相对应的参数 * * @param profile 配置文件路径 * @param tile 配置文件title名称[title] * @param key key * @param value (out) 得到的value * * @returns * 0 succ, -1 fail */ /* -------------------------------------------*/ extern int get_cfg_value(const char *profile, char *tile, char *key, char *value); //获取数据库用户名、用户密码、数据库标示等信息 extern int get_mysql_info(char *mysql_user, char *mysql_pwd, char *mysql_db); #endif
-
extern关键字可以用来声明变量和函数作为外部变量或者函数供其它文件使用
-
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的
cfg.c
#include <stdlib.h>
#include <string.h>
#include "make_log.h"
#include "cfg.h"
#include "cJSON.h"
/* -------------------------------------------*/
/**
* @brief 从配置文件中得到相对应的参数
*
* @param profile 配置文件路径
* @param title 配置文件title名称[title]
* @param key key
* @param value (out) 得到的value
*
* @returns
* 0 succ, -1 fail
*/
/* -------------------------------------------*/
int get_cfg_value(const char *profile, char *title, char *key, char *value)
{
int ret = 0;
char *buf = NULL;
FILE *fp = NULL;
//异常处理
if(profile == NULL || title == NULL || key == NULL || value == NULL)
{
return -1;
}
//只读方式打开文件
fp = fopen(profile, "rb");
if(fp == NULL) //打开失败
{
perror("fopen");
LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "fopen err\n");
ret = -1;
goto END;
}
fseek(fp, 0, SEEK_END);//光标移动到末尾
long size = ftell(fp); //获取文件大小
fseek(fp, 0, SEEK_SET);//光标移动到开头
buf = (char *)calloc(1, size+1); //动态分配空间
if(buf == NULL)
{
perror("calloc");
LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "calloc err\n");
ret = -1;
goto END;
}
//读取文件内容
fread(buf, 1, size, fp);
//解析一个json字符串为cJSON对象
cJSON * root = cJSON_Parse(buf);
if(NULL == root)
{
LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "root err\n");
ret = -1;
goto END;
}
//返回指定字符串对应的json对象
cJSON * father = cJSON_GetObjectItem(root, title);
if(NULL == father)
{
LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "father err\n");
ret = -1;
goto END;
}
cJSON * son = cJSON_GetObjectItem(father, key);
if(NULL == son)
{
LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "son err\n");
ret = -1;
goto END;
}
//LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "son->valuestring = %s\n", son->valuestring);
strcpy(value, son->valuestring); //拷贝内容
cJSON_Delete(root);//删除json对象
END:
if(fp != NULL)
{
fclose(fp);
}
if(buf != NULL)
{
free(buf);
}
return ret;
}
//获取数据库用户名、用户密码、数据库标示等信息
int get_mysql_info(char *mysql_user, char *mysql_pwd, char *mysql_db)
{
if( -1 == get_cfg_value(CFG_PATH, "mysql", "user", mysql_user) )
{
LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "mysql_user err\n");
return -1;
}
if( -1 == get_cfg_value(CFG_PATH, "mysql", "password", mysql_pwd) )
{
LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "mysql_pwd err\n");
return -1;
}
if( -1 == get_cfg_value(CFG_PATH, "mysql", "database", mysql_db) )
{
LOG(CFG_LOG_MODULE, CFG_LOG_PROC, "mysql_db err\n");
return -1;
}
return 0;
}
/conf
-
/conf目录如下所示,其中redis.conf是配合redis使用的文件而没有具体的ip+port
-
项目部署时,需要先将MySQL和Redis的连接配置信息写入cfg.json中
解析前端Json
-
前端QT点击共享文件,则会显示共享文件列表
-
解析json包(user,md5,filename),拿到用户名,文件md5码,文件名字
//解析的json包 int get_json_info(char *buf, char *user, char *md5, char *filename) { int ret = 0; /*json数据如下 { "user": "yoyo", "md5": "xxx", "filename": "xxx" } */ //解析json包 //解析一个json字符串为cJSON对象 cJSON * root = cJSON_Parse(buf); if(NULL == root) { LOG(DEALSHAREFILE_LOG_MODULE, DEALSHAREFILE_LOG_PROC, "cJSON_Parse err\n"); ret