#include

#include "server_module.h"

// 管理员及普通用户登陆

int login_in(int fd, struct login_inform *logininfo, sqlite3 *db)

{

int ret;

char buf[128] = {0};

char *errmsg;

char **azresult;

int nrow;

int ncolumn;

// 接受登陆信息

if((ret = recv( fd, logininfo, sizeof(struct login_inform), 0)) < 0)

{

printf("fail to recv login inform\n");

ret = -1;// 接受登陆信息失败

send(fd, &ret, 4, 0);

return 1;

}else if(ret == 0){

printf("client exit not normal\n");// 客户端异常退出

return -1;

}

if(strcmp(logininfo->login_user, "quit") == 0)

{

printf("client exit\n");// 客户端正常退出

return -1;

}

// 拼接SQL命令

sprintf(buf, "select * from staff where name = '%s' and passwd = '%s'", logininfo->login_user, logininfo->login_passwd);

if(sqlite3_get_table(db, buf, &azresult, &nrow, &ncolumn, &errmsg) != SQLITE_OK)

{

printf("%s\n", errmsg);

ret = -1;

send(fd, &ret, 4, 0);// 查询数据库失败

return 1;

}

if(nrow > 0)// 登陆信息匹配

{

if (strcmp(logininfo->login_user, "root") == 0)//root用户登陆

{

printf("root login in\n");

ret = 1;

send(fd, &ret, 4, 0);

return 0;

}else{

printf("common user %s login in\n", logininfo->login_user);//普通用户登陆

ret = 2;

send(fd, &ret, 4, 0);

return 0;

}

}else{

printf("wrong user name or password\n"); // 登陆信息不匹配

ret = -1;

send(fd, &ret, 4, 0);

return 1;

}

}

// 用户信息存储结构体

struct user_info {

char user_name[32]; // 专门存放用户名字

char user_passwd[32]; // 专门存放用户密码

char user_phone[32]; // 专门存放用户手机

char user_address[32]; // 专门存放用户地址

};

// 增加用户

void add_user(int fd, sqlite3 *db)

{

int ret;

char buf[128] = {0};

char *errmsg;

struct user_info userinfo;

recv(fd, &userinfo, sizeof(userinfo), 0);// 接受用户信息

//拼接sql命令

sprintf(buf, "insert into staff values('%s', '%s', '%s', '%s')", userinfo.user_name, userinfo.user_passwd, userinfo.user_phone, userinfo.user_address);

if(sqlite3_exec(db, buf, NULL, NULL, &errmsg) != SQLITE_OK)

{

printf("add user failed\n");// 添加失败

ret = -1;

send(fd, &ret, 4, 0);

return;

}else{

printf("add user success\n");// 添加成功

ret = 0;

send(fd, &ret, 4, 0);

return;

}

}

// 查询用户

void query_user(int fd, sqlite3 *db)

{

char buf[128] = {0};

char **azresult;

int nrow;

int ncolumn;

char *errmsg;

struct user_info userinfo;

recv(fd, &userinfo, sizeof(userinfo), 0);// 接受用户信息

// 拼接sql命令

sprintf(buf, "select * from staff where name = '%s'", userinfo.user_name);

if(sqlite3_get_table(db, buf, &azresult, &nrow, &ncolumn, &errmsg) != SQLITE_OK)

{

printf("errmsg :%s\n", errmsg);// 查询数据库失败

strcpy(userinfo.user_name, "wrong");

send(fd, &userinfo, sizeof(userinfo), 0);

return;

}

if(nrow > 0)// 查询有结果

{

printf("query success\n");

// 拷贝查询结果

strcpy(userinfo.user_passwd, azresult[nrow*ncolumn+1]);

strcpy(userinfo.user_phone, azresult[nrow*ncolumn+2]);

strcpy(userinfo.user_address, azresult[nrow*ncolumn+3]);

printf("name:%s password:%s phone:%s addr:%s\n", userinfo.user_name, userinfo.user_passwd, userinfo.user_phone, userinfo.user_address);

send(fd, &userinfo, sizeof(userinfo), 0);// 发送查询结果

}else{

printf("no user\n");// 查询没结果

strcpy(userinfo.user_name, "wrong");

send(fd, &userinfo, sizeof(userinfo), 0);

}

sqlite3_free_table(azresult);// 释放查询时的空间

return;

}

// 删除用户

void del_user(int fd, sqlite3 *db)

{

int ret;

char *errmsg;

char buf[128];

struct user_info userinfo;

recv(fd, &userinfo, sizeof(userinfo), 0);// 接受用户信息

// 拼接sql命令

sprintf(buf, "delete from staff where name = '%s'", userinfo.user_name);

if(sqlite3_exec(db, buf, NULL, NULL, &errmsg) != SQLITE_OK)

{

printf("errmsg:%s\n", errmsg);// 删除失败

ret = -1;

}else{

printf("del success\n");// 删除成功

ret = 0;

}

send(fd, &ret, 4, 0);// 发送反馈

}

// 更新用户

void update_user(int fd, sqlite3 *db)

{

int ret;

char buf[128];

char *errmsg;

struct user_info userinfo;

recv(fd, &userinfo, sizeof(userinfo), 0);// 接受用户信息

// 拼接sql命令

sprintf(buf, "update staff set passwd = '%s' where name = '%s'", userinfo.user_passwd, userinfo.user_name);

if(sqlite3_exec(db, buf, NULL, NULL, &errmsg) != SQLITE_OK)

{

printf("fail to update\n");//更新成功

ret = -1;

}else{

printf("update success\n");//更新失败

ret = 0;

}

send(fd, &ret, 4, 0);//发送反馈信息

}

// 普通用户查询指定用户特定信息

void user_query_other_people(int fd, sqlite3 *db)

{

char buf[128] = {0};

char **azresult;

int nrow;

int ncolumn;

char *errmsg;

struct user_info userinfo;

recv(fd, &userinfo, sizeof(userinfo), 0);// 接受用户信息

// 拼接sql命令

sprintf(buf, "select * from staff where name = '%s'", userinfo.user_name);

if(sqlite3_get_table(db, buf, &azresult, &nrow, &ncolumn, &errmsg) != SQLITE_OK)

{

printf("errmsg :%s\n", errmsg);// 查询失败

strcpy(userinfo.user_name, "wrong");

send(fd, &userinfo, sizeof(userinfo), 0);

return;

}

if(nrow > 0)// 查询有结果

{

printf("query success\n");

printf("nrow:%d, ncolumn:%d\n", nrow, ncolumn);

// 拷贝查询结果

strcpy(userinfo.user_passwd, "*********");

strcpy(userinfo.user_phone, azresult[nrow*ncolumn+2]);

strcpy(userinfo.user_address,azresult[nrow*ncolumn+3]);

printf("name:%s password:%s phone:%s addr:%s\n", userinfo.user_name, userinfo.user_passwd, userinfo.user_phone, userinfo.user_address);

send(fd, &userinfo, sizeof(userinfo), 0);// 发送查询结果

}else{

printf("no user\n");// 查询没结果

strcpy(userinfo.user_name, "wrong");

send(fd, &userinfo, sizeof(userinfo), 0);

}

sqlite3_free_table(azresult);// 释放查询空间

return;

}

// 显示服务器文件

void list_file(int fd)

{

DIR *dir;

char buf[256] = {0};

struct dirent *dirent;

// 打开文件目录

if((dir = opendir("./docm/")) == NULL)

{

strcpy(buf, "fail");

send(fd, buf, 128, 0);

perror("fail to open dir:");

return;

}

// 读取文件目录

while((dirent = readdir(dir)) != NULL)

{

printf("d_name:%s\n", dirent->d_name);

if((!strcmp(dirent->d_name, "."))||(!strcmp(dirent->d_name, "..")))// 规避当前目录及上级目录

{

continue;

}

send(fd, &(dirent->d_name), 256, 0);// 发送目录信息

}

send(fd, "over", 256, 0);// 发送完毕

printf("list over\n");

}

// 向服务器上传文件

void put_file(int fd)

{

int f_fd;

int ret;

char buf[128] = {0};

char filename[128] = {0};

char filepath[200] = {0};

recv(fd, filename, 128, 0);// 接受客户端文件名

if(strcmp(filename, "fail") == 0)

{

printf("file is invalid\n");

return;

}

sprintf(filepath, "./docm/%s", filename);// 拼接文件路径

f_fd = open(filepath, O_RDWR|O_CREAT, 0777);// 创建文件等待接受

if(f_fd < 0)

{

perror("fail to open file:\n");

send(fd, "fail", 128, 0);

return;

}

send(fd, "ok", 128, 0);

while((ret = recv(fd, buf, 128, 0)) > 0) // 接受客户端信息

{

write(f_fd, buf, ret);

if(ret < 128)// 接受到结尾

{

break;

}

}

printf("put over\n");

}

// 从服务器上下载文件

void load_file(int fd)

{

int f_fd;

int ret;

char buf[128] = {0};

char filename[128] = {0};

char filepath[200] = {0};

recv(fd, filename, 128, 0);// 接受客户端文件名

sprintf(filepath, "./docm/%s", filename);// 拼接文件路径

f_fd = open(filepath, O_RDONLY);// 打开服务器端文件

if(f_fd < 0)

{

send(fd, "fail", 128, 0);

perror("fail to open file:");

return;

}

send(fd, "ok", 128, 0);

recv(fd, buf, 128, 0);// 接受客户端能否接受的反馈信息

if(strcmp(buf, "fail") == 0)

{

printf("fail to load fiel\n");

return;

}

while((ret = read(f_fd, buf, 128)) > 0) // 读取服务器端文件信息

{

if(ret < 128)// 读取文件到结尾

{

send(fd, buf, ret, 0);

continue;

}

send(fd, buf, 128, 0);// 发送文件信息

}

printf("load over\n");

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

func服务器报警显示C,serve_func.c相关推荐

  1. 服务器报警显示er什么意思,洗衣机一开机就报警响,显示ER是什么原因-洗衣机开机就报警...

    洗衣机开机报警的几个故障原因及维修 LG力神洗衣机PE故障代码表示 :压力开关.电脑板.接插件等不良. 1.检查水位开关是否损坏. 2.检查水位传感器是否故障. 3.检查接插件接触是否良好,有无氧化. ...

  2. 华为服务器报警显示F02,服务器不明原因重启

    服务器不明原因重启 内容精选 换一换 Windows操作系统云服务器蓝屏,如图1所示.使用了来源不明的第三方软件.CPU占用过高导致.因为误操作或者病毒引起的系统文件.注册表损坏.操作系统在蓝屏的情况 ...

  3. 华为服务器报警显示F02,华为手机黑屏白字怎么调回来

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 以荣耀20Pro手机为例,显示黑屏白字就是开启了[深色模式]功能,黑屏白字调回来的方法如下: 1.点击打开手机桌面上的[设置]. ...

  4. Func:统一网络控制器

    项目背景: 为了更好的管理我们企业中小型服务器,我们需要一个统一的网络控制器Func去进行远程命令执行.文件分发的工作.同时我们可以方便的自己定义适合我们企业需要的模块. 实验环境: vmware w ...

  5. evoc服务器长鸣报警显示正常,研祥工业服务器出大事了!

    五环,你比四环多一环-- 岳岳,听到请回答! 啊!五环,你比六环少一环-- 岳岳,MB,再唱抽死你! 怎么了!师傅!!! 五一录制的节目,资料都丢失了! 你这么不小心,师娘知道吗? 去年在你二大爷那里 ...

  6. evoc服务器长鸣报警显示正常,UPS电源故障灯亮,蜂鸣器长鸣报警怎么办

    UPS电源故障灯亮,蜂鸣器长鸣报警怎么办 一台迈普1KVA在线式UPS电源,开机后旁路输出正常,按ON键,能由旁路转入逆变器工作,但立即又跳转旁路,且故障灯亮,蜂鸣器长鸣报警,按OFF键,蜂鸣器停止报 ...

  7. swift文件服务器,Swift3一行代码将各种类型文件上传到服务器

    由于之前一直在忙项目,很久没有写过一篇像样的文章了,现在手上的项目基本是完成了,正好工作时间偷个懒写两篇文章. 将相机或相册图片上传到服务器 先看看最常见的图片上传,也可以选择跳过,后面有直接的封装方 ...

  8. js ftpclient linux server,Node.JS用Socket实现FTP Server服务器和Client客户端

    通信过程 FTP协议其实就是主机和服务通过Socket进行固定格式的通信过程,当某客户端连接到FTP 服务器后,客户端发送指令: [参数] 服务会按以下格式返回: [参数或说明] 例如以下是FileZ ...

  9. 使用libevent多线程验证Linux上的服务器惊群现象

    什么是惊群现象? 惊群(thundering herd)是指,只有一个子进程能获得连接,但所有N个子进程却都被唤醒了,这种情况将使性能受损. 举一个很简单的例子,当你往一群鸽子中间扔一块食物,虽然最终 ...

最新文章

  1. 深度分享 | 世界顶级语音识别科学家黄学东博士CCL 2018主旨报告(附PPT)
  2. linux 卸载模块命令,Linux中module模块的编译、加载、卸载
  3. private static final 修饰符
  4. CentOS 初体验十五:阿里云安装Nginx
  5. HttpClient 学习整理
  6. flex image 控件显示bmp 格式图片
  7. 马哥linux 培训第一周作业
  8. GitHub的CI实践(xUnit / OpenCover /Appveyor / Coveralls.net)
  9. OAuth 2.0: Bearer Token Usage
  10. Leetcode每日一题:328.odd-even-linked-list(奇偶链表)
  11. Review JDBC
  12. 魔乐科技MLDN_android开发实战经典_李兴华_视频下载汇总
  13. 第三方应用软件检测实验室质量管理体系需要符合哪些要求?
  14. 浩万计算机工具,子浩KX3552驱动一键安装工具(Win7/Win8/win10)
  15. 百度移动搜索优化指南2.0
  16. 如何用三角形拼成一个正方形
  17. Python zip, unzip, zip_longest的用法
  18. linux上无法发送163邮件,如何在linux中发送邮件,使用163邮箱发信。
  19. python 银行_python 银行系统
  20. window10如何重命名系统用户文件夹

热门文章

  1. MySQL 存储过程的变量
  2. [Swift通天遁地]二、表格表单-(11)创建星期选项表单和拥有浮动标签的文本框
  3. P2424 约数和 真丶除法分块
  4. springcloud- FeginClient 调用统一拦截添加请求头 RequestInterceptor ,被调用服务获取请求头...
  5. 生成Treeview树 递归方法
  6. 【个人笔记】OpenCV4 C++ 图像处理与视频分析 11课
  7. 减法运算的借位标志cf_数学|有理数运算法则及题型汇总
  8. android之activity跳转
  9. python解释器调用_Python3.x那些事儿:[2]如何调用解释器-百度经验
  10. python绘图背景透明_如何在 Matplotlib 中更改绘图背景