文章目录
向文件信息表md5table中插入文件信息
#include "user.h"
#define SUCCESS 1
#define FAIL 0
#define ERROR -1
unsigned int timeout = 7; //超时时间7秒
向服务器端的数据库插入新的文件信息
int insertMd5Info(char* filename, char* md5value, char* username)//文件名,md5值,文件属主
{
MYSQL* mysql;
MYSQL_RES* result;//一次性提取所有的数据
MYSQL_ROW row;
int ret = 0;
//对数据库进行初始化
//设置超时选项
//连接数据库
mysql = mysql_real_connect(mysql, "localhost", "root",
"123456", "md5", 0, NULL, 0);//连接MySQL testdb数据库
if (mysql)
{
char buffer[128] = { 0 };
sprintf(buffer, "select md5Value from md5table where filename='%s'", filename);
//查询客户端发来的文件名为filename,服务器数据库中也有的同名文件的md5value。
ret = mysql_query(mysql, buffer);//执行sql语句,成功返回0
if (!ret)
{
//获取服务器中文件名为filename的md5Value
result = mysql_store_result(mysql);
int num = mysql_num_rows(result);//获取其行数
if (num == 1)
{ //如果有则删掉。
deleteMd5Info(filename);
}
mysql_free_result(result);//执行完sql,得到返回的结果集,处理完数据,释放存放结果集的内存空间。
}
//用来存储插入数据库的文件信息
char sql_insert[200];
char* intact = "0";//文件完整性标识为0,即默认为不完整
sprintf(sql_insert, "INSERT INTO md5table(filename,md5Value,username,intact) VALUES('%s','%s','%s', '%s');", filename, md5value, username, intact);
//往md5table表中插入新文件信息
ret = mysql_query(mysql, sql_insert); //执行SQL语句
if (!ret)
{
return SUCCESS;/插入成功
}
else
{
printf("Connect Erro:%d %s\n",
mysql_errno(mysql), mysql_error(mysql));//返回错误代码、错误消息
return ERROR;
}
mysql_close(mysql);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if (mysql_errno(mysql))
{
printf("Connect Erro:%d %s\n",
mysql_errno(mysql), mysql_error(mysql));//返回错误代码、错误消息
}
return ERROR;
}
return FAIL;
}
在文件信息表md5table删除指定文件信息
int deleteMd5Info(char* filename)
{
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
int ret = 0;
mysql = mysql_real_connect(mysql, "localhost",
"root", "123456", "md5", 0, NULL, 0);//连接MySQL testdb数据库
char buffer[128] = { 0 };
sprintf(buffer, "select md5Value from md5table where filename='%s'", filename);
//查询客户端发来的文件名为filename,服务器数据库中也有的同名文件的md5value。
ret = mysql_query(mysql, buffer);
if (!ret)
{
result = mysql_store_result(mysql); //获取服务器中文件名为filename的md5Value
int num = mysql_num_rows(result);//获取md5Value的行数
if (num == 1)
{ //如果为1,则说明找到了该文件
sprintf(buffer, "delete from md5table where filename='%s'", filename); //删除该文件信息从表中
if (mysql_query(mysql, buffer))
{
fprintf(stderr, "%d: %s\n",
mysql_errno(mysql), mysql_errno(mysql));
}
else
{
printf("删除成功\n");
return SUCCESS;
}
}
mysql_free_result(result);
}
mysql_close(mysql);
return FAIL;
}
}
在初次启动服务器时,将服务器中的文件信息添加到文件信息表中,先判断是不是第一次,在初始化
int initStart()
{
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
int ret = 0;
mysql = mysql_real_connect(mysql, "localhost",
"root", "123456", "serverLog", 0, NULL, 0);//连接MySQL testdb数据库
char buffer[128] = { 0 };
strcpy(buffer, "select * from serverStartInfo");
//从日志记录表中获取登录的次数
if (mysql_query(mysql, buffer))
{
fprintf(stderr, "%d: %s\n",
mysql_errno(mysql), mysql_errno(mysql));
}
else
{
result = mysql_store_result(mysql);//获取登录记录
int fields = mysql_num_fields(result);
int count = 0;
while (row = mysql_fetch_row(result))
{
++count;
};
//如果登录次数为1,则初始化
if (count == 1)
{
printf("need Init\n");
return SUCCESS;
}
//大于1,则不需要初始化
else if (count > 1)
{
printf("Not Init\n");
return FAIL;
}
mysql_free_result(result);
}
mysql_close(mysql);
return FAIL;
}
}
用户登陆的用户名和密码启动
int Match(char* username, char* password)
{
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
int ret = 0;
mysql = mysql_init(NULL);//初始化
if (!mysql)
{
printf("mysql_init failed!\n");
return ERROR;
}
ret = mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT,
(const char*)& timeout);//设置超时选项
if (ret)
{
printf("Options Set ERRO!\n");
}
mysql = mysql_real_connect(mysql, "localhost",
"root", "123456", "loginUser", 0, NULL, 0);//连接MySQL testdb数据库
if (mysql)
{
if (!mysql_real_connect(mysql, "localhost", "root",
"123456", "loginUser", 0, NULL, 0))
{
fprintf(stderr, "%d: %s \n",
mysql_errno(mysql), mysql_error(mysql));
return FAIL;
}
//printf("连接成功\n");
char buffer[128] = { 0 };
sprintf(buffer, "select passwd from user where name='%s'", username);
if (mysql_query(mysql, buffer))
{
fprintf(stderr, "%d: %s\n",
mysql_errno(mysql), mysql_errno(mysql));
}
else
{
result = mysql_store_result(mysql);
while (row = mysql_fetch_row(result))
{
// printf("\%s - \%s \n", row[0], row[1]);
if (strcmp(row[0], password) == 0)
{
mysql_free_result(result);
mysql_close(mysql);
return SUCCESS;
}
}
mysql_free_result(result);
}
mysql_close(mysql);
return FAIL;
}
}
用户注册,判断注册名是否有效,成功则插入到用户表user中
int Register(char* username, char* password)
{
int ret = 0;
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
if (mysql)
{
//printf("Connection Succeed!\n");
char buffer[128] = { 0 };
sprintf(buffer, "select passwd from user where name='%s'", username); //查找用户名等于username的密码
ret = mysql_query(mysql, buffer); //执行sql
// printf("ret = %d\n", ret);
if (!ret)
{ //一次获取所有的查询的结果集
result = mysql_store_result(mysql);
int num = mysql_num_rows(result); //返回查到的结果集的行数
//printf("judge num = %d\n", num);
if (num == 1) //如果等于1,说明user表中已经有该用户名了
{
printf("%s已存在,请更换用户名\n", username);
return 2;
}
mysql_free_result(result);
}
//否则,进行注册
char sql_insert[200];
sprintf(sql_insert, "INSERT INTO user(name,passwd) VALUES('%s','%s');", username, password);
//插入新的用户名和密码
ret = mysql_query(mysql, sql_insert); //执行SQL语句
if (!ret)
{
return SUCCESS;
}
else
{
printf("Connect Erro:%d %s\n",
mysql_errno(mysql), mysql_error(mysql));//返回错误代码、错误消息
return ERROR;
}
mysql_close(mysql);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if (mysql_errno(mysql))
{
printf("Connect Erro:%d %s\n",
mysql_errno(mysql), mysql_error(mysql));//返回错误代码、错误消息
}
return ERROR;
}
return FAIL;
}
实现秒传功能,判断md5值是否和数据库中的同名文件md5值匹配
int matchMd5(char* filename, char* md5value)
{
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
int ret = 0;
mysql = mysql_real_connect(mysql, "localhost",
"root", "123456", "md5", 0, NULL, 0);//连接MySQL testdb数据库
char buffer[128] = { 0 };
sprintf(buffer, "select md5Value from md5table where filename='%s'", filename);
//从md5table表中获取文件名为filename的 md5value。判断数据库是否已经存在和上传的文件是同一个。如果是直接秒传。
if (mysql_query(mysql, buffer))
{
fprintf(stderr, "%d: %s\n",
mysql_errno(mysql), mysql_errno(mysql));
}
else
{
result = mysql_store_result(mysql); //获取md5value
while (row = mysql_fetch_row(result))//获取该值的行数
{
// printf("\%s - \%s \n", row[0], row[1]);
if (strcmp(row[0], md5value) == 0) //和客户端发过来的文件md5value比较,=0,则相同,返回1
{
mysql_free_result(result);
mysql_close(mysql);
return SUCCESS;
}
}
mysql_free_result(result);
}
mysql_close(mysql);
return FAIL;
}
}
设置文件信息表中文件的完整标志位,为0不完整,为1完整。
int setIntact(char* filename, char* intact)
{
int ret = 0;
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
mysql = mysql_init(NULL);//初始化
if (!mysql)
{
printf("mysql_init failed!\n");
return ERROR;
}
ret = mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT,
(const char*)& timeout);//设置超时选项
if (ret)
{
printf("Options Set ERRO!\n");
}
mysql = mysql_real_connect(mysql, "localhost", "root",
"123456", "md5", 0, NULL, 0);//连接MySQL testdb数据库
if (mysql)
{
char sql_alter[200];
sprintf(sql_alter, "UPDATE md5table SET intact='%s' where filename='%s';", intact, filename);
ret = mysql_query(mysql, sql_alter); //执行SQL语句
if (!ret)
{
return SUCCESS;
}
else
{
printf("Connect Erro:%d %s\n",
mysql_errno(mysql), mysql_error(mysql));//返回错误代码、错误消息
return ERROR;
}
mysql_close(mysql);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if (mysql_errno(mysql))
{
printf("Connect Erro:%d %s\n",
mysql_errno(mysql), mysql_error(mysql));//返回错误代码、错误消息
}
return ERROR;
}
return FAIL;
}
判断用户是否是该文件的所属
- 如果客户端发来的需要传输文件的用户名和服务器中已存在不完整的文件用户名相同,则可以进行断点续传。
- 如果用户名不同,则进行断点续传。
int isVaildUser(char* filename, char* username)
{
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
int ret = 0;
mysql = mysql_real_connect(mysql, "localhost",
"root", "123456", "md5", 0, NULL, 0);//连接MySQL testdb数据库
char buffer[128] = { 0 };
sprintf(buffer, "select username from md5table where filename='%s'", filename);
//查询md5table表中文件名为filename的用户名。
if (mysql_query(mysql, buffer))
{
fprintf(stderr, "%d: %s\n",
mysql_errno(mysql), mysql_errno(mysql));
}
else
{
result = mysql_store_result(mysql); //获取用户名
while (row = mysql_fetch_row(result))//获取该结果集的行数
{
// printf("\%s - \%s \n", row[0], row[1]);
if (strcmp(row[0], username) == 0) //如果数据库中的存在的部分文件的用户名和客户端发来的用户名相同,则可以进行断点传。如果不不相同,则重传
{
mysql_free_result(result);
mysql_close(mysql);
return SUCCESS;
}
}
mysql_free_result(result);
}
mysql_close(mysql);
return FAIL;
}
}
在文件信息表中根据完整标志为判断文件是否完整
判断文件的完整性,并且判断文件的属主,
不完整,且是同一属主,同文件名才可以进行断点传输。
int isIntact(char* filename)
{
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
int ret = 0;
mysql = mysql_real_connect(mysql, "localhost",
"root", "123456", "md5", 0, NULL, 0);//连接MySQL testdb数据库
//printf("连接成功\n");
char buffer[128] = { 0 };
sprintf(buffer, "select intact from md5table where filename='%s'", filename);
//查询md5table表中文件名为filename,文件完整性标识的值(0/1 ,0为不完整)
if (mysql_query(mysql, buffer))
{
fprintf(stderr, "%d: %s\n",
mysql_errno(mysql), mysql_errno(mysql));
}
else
{
result = mysql_store_result(mysql); //从表中获取不完整标识值
while (row = mysql_fetch_row(result))//获取结果集行数
{
// printf("\%s - \%s \n", row[0], row[1]);
if (strcmp(row[0], "1") == 0) //如果为1,完整,
{
mysql_free_result(result);
mysql_close(mysql);
return SUCCESS;
}
}
mysql_free_result(result);
}
mysql_close(mysql);
return FAIL;
}
}
int Display()
{
MYSQL* mysql;
MYSQL_RES* result;
MYSQL_ROW row;
int ret = 0;
//对数据库进行出初始化
//设置超时标志
//链接数据库
//判断user表下的 name 不等于 su的 用户名和密码
if (mysql_query(mysql, "select name, passwd from user where name != 'su'"))
{
fprintf(stderr, "%d: %s\n",
mysql_errno(mysql), mysql_errno(mysql));
}
else
{ //执行成功,一次性获取表中所有的数据
result = mysql_store_result(mysql);
printf("=======用户信息表=======\n");
printf("用户名 \t\t 密码\n");
while (row = mysql_fetch_row(result))
{ //从数据集合中取出一行,并放进一个行结构,然后对数据进行处理,处理完退出
printf("\%-10s \t \%-10s \n", row[0], row[1]);
}
return SUCCESS;
mysql_free_result(result);
}
mysql_close(mysql);
return FAIL;
}
}