本项目仅实现了注册登录以及增加信息和查看所有信息的功能
还需要继续完善。
server服务器端
network.c
#include "../../../include/db.h"
#include "../../../include/sqlite3.h"
#include "../../../include/network.h"
void getFileInfo(char *buf, char *arr[])
{
if(NULL == buf || NULL == arr)
{
printf("getFileInfo arg error.\n");
return;
}
int i = 0;
arr[0] = buf;
while(*buf)
{
if('#' == *buf)
{
*buf = '\0';
i++;
arr[i] = buf + 1;
}
buf++;
}
}
int server_listen()
{
//1、创建sorket文件
int iServer = socket(AF_INET,SOCK_STREAM,0);
if(iServer < 0)
{
puts("socket error.");
return -1;
}
puts("socket success.");
//2、bind
struct sockaddr_in stServer;
stServer.sin_family = AF_INET;
stServer.sin_port = htons(7777);
stServer.sin_addr.s_addr = htonl(INADDR_ANY);
int ret = bind(iServer, (struct sockaddr *)&stServer, sizeof(struct sockaddr_in));
if(ret != 0)
{
puts("bind error");
close(iServer);
return -1;
}
puts("bind success.");
//3、listen
ret = listen(iServer, 5);
if(ret != 0)
{
puts("listen error");
close(iServer);
return -1;
}
puts("listen success.");
//int flags = fcntl(iServer,F_GETFL);
//fcntl(iServer,F_SETFL,flags | O_NONBLOCK);
return iServer;
}
int server(int iServer)
{
fd_set readfds,tempfds;//创建文件描述符集合,一个备份
FD_ZERO(&readfds);//清空集合
FD_ZERO(&tempfds);
FD_SET(iServer, &readfds);//将iServer加入集合
FD_SET(0, &readfds);
int maxfd = iServer;
char *arr[10] = {0};
int state = 0;//判断符,用来判断用户是否已经登陆
int client_t = 9;
while(1)
{
printf("state = %d\n", state);
tempfds = readfds;
int ret = select(maxfd+1, &tempfds, NULL, NULL, NULL);
if(ret < 0)
{
printf("select error\n");
continue;
}
if(0 == ret)
{
continue;//连接失败,重新连接
}
else
{
int i = 0;//用来遍历集合
int a = 0;
for(i ;i < maxfd+1; i++)
{
if(FD_ISSET(i, &tempfds))//判断值为i的IO文件描述符是否在集合内
{
if(i == iServer)//若i描述符是iServer,进行下一步操作
{
struct sockaddr_in iClient;
int len = sizeof(iClient);
int connfd = accept(i, (struct sockaddr *)&iClient, &len);
if(connfd < 0)
{
perror("server:accept error");
close(i);
return -1;
//int flags = fcntl(connfd, F_GETFL);
//fcntl(connfd, F_SETFL, flags | O_NONBLOCK);
}
puts("Have a client accept success.");
FD_SET(connfd,&readfds);
if(connfd > maxfd)
{
maxfd = connfd;
}
}
else//如果i描述符位置恰当,则进行通信操作
{
char buf[1024] = {0};
memset(buf, 0, sizeof(buf));
ret = recv(i, buf, sizeof(buf), 0);
getFileInfo(buf, arr);
if(ret < 0)
{
printf("recv error.\n");
continue;//如果接收失败,则重新接受
}
else if(0 == ret)
{
printf("Client quit!\n");
state = 0;//客户端退出后,将判断符(state)置为0,表示未登陆状态
close(i);//关闭i(客户端套接字)
FD_CLR(i, &readfds);//将i描述符从集合中删除
}
else
{
if(1 == state)
{
if(0 == strcmp(arr[0], "1"))
{
a = atoi(arr[3]);//atoi将字符串转换成整形数的一个函数
ret = AddInfo(arr[1],arr[2],a);
if(-1 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "参数有问题.\n");
}
if(-2 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "增加信息失败.");
}
if(0 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "增加信息成功.");
}
send(i, buf, sizeof(buf), 0);
}
else if(0 == strcmp(arr[0], "2"))
{
a = atoi(arr[2]);
ret = ChangeInfo(arr[1],a);
if(-1 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "参数有问题.");
}
if(-2 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "修改信息失败.");
}
if(0 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "修改信息成功.");
}
send(i, buf, sizeof(buf), 0);
}
else if(0 == strcmp(arr[0], "3"))
{
char * p = SelectInfo(arr[1]);
if(NULL == p)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "参数有问题.\n");
}
/*if(-2 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "查找失败.\n");
}*/
char brr[1024] = {0};
if(p)
{
//printf("asdasd");
memset(buf, 0, sizeof(buf));
sprintf(buf, "查找信息成功.\n");
//sprintf(brr, "%s", p);
sprintf(brr, "%s", p);
}
send(i, brr, sizeof(brr), 0);
}
else if(0 == strcmp(arr[0], "4"))
{
ret = DeleteInfo(arr[1]);
if(-1 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "参数有问题.\n");
}
if(-2 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "删除信息失败.\n");
}
if(0 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "删除信息成功.\n");
}
send(i, buf, sizeof(buf), 0);
}
else if(0 == strcmp(arr[0], "5"))
{
memset(buf ,0,sizeof(buf));
char *p = FindEverystudents();
if(NULL == p)
{
sprintf(buf,"查看全部失败\n");
}
else
{
sprintf(buf,"%s",p);
}
send(i,buf,sizeof(buf),0);
}
}
}
if(0 == state)
{
if(0 == strcmp(arr[0], "1"))
{
ret = TeacherRegister(arr[1], arr[2]);
if(-1 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "注册失败.\n");
}
else if(-2 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "用户已存在.\n");
}
else if(0 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "注册成功.\n");
}
send(i, buf, sizeof(buf), 0);
}
if(0 == strcmp(arr[0], "2"))
{
ret = TeacherLogin(arr[1], arr[2]);
if(-1 == ret || -2 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "登陆失败");
}
if(-3 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "账号或密码错误.\n");
}
if(0 == ret)
{
memset(buf, 0, sizeof(buf));
sprintf(buf, "登陆成功");
state = 1;
}
send(i, buf, sizeof(buf), 0);
}
}
}
}
}
}
}
}
main.c
#include "../../include/db.h"
#include "../../include/network.h"
int main()
{
int sockfd = server_listen();
dbInit();//调用数据库
server(sockfd);
close(sockfd);
return 0;
}
数据库db
#include "../../../include/db.h"
#include "../../../include/sqlite3.h"
//创建数据库、创建两个表
int dbInit()
{
//创建数据库
// sqlite3 *pdb;
char *msgerr = NULL;
int ret = sqlite3_open("admin_sys.db", &pdb);
if(ret != SQLITE_OK)
{
puts("dbInit:sqlite3_open error.");
return -1;
}
//创建教师信息表
char *sql = "create table Teacher(name text, passwd text);";
ret = sqlite3_exec(pdb, sql, NULL, NULL, &msgerr);
if(ret != SQLITE_OK)
{
printf("dbInit:create table Teacher error.\n");
sqlite3_free(msgerr);
}
//创建学生信息表
sql = "create table students(sname text not null, major_class text not null,ID integer not null);";
msgerr = NULL;
ret = sqlite3_exec(pdb, sql, NULL, NULL, &msgerr);
if(ret != SQLITE_OK)
{
printf("dbInit:create table students error.\n");
sqlite3_free(msgerr);
}
puts("creat dbInit and table success.");
return 0;
}
//注册
int TeacherRegister(const char *name, const char *passwd)
{
if(NULL == name || NULL == passwd)
{
perror("TeacherRegister : arg error.");
return -1;
}
//先判断这个账号有没有注册过
char sql[1024] = {0};
sprintf(sql, "select passwd from Teacher where name='%s';", name);
char **ppTable = NULL;//查询的信息
char * msgerr = NULL;//保存错误信息
int row = 0;//查询的结果行数,不包含title;当row=1, 则查询到了,否则没有
int column;
int ret = sqlite3_get_table(pdb, sql, &ppTable, &row, &column, &msgerr);
if(ret != SQLITE_OK)
{
printf("register get table error:%s\n",msgerr);
sqlite3_free(msgerr);
return -1;
}
if(1 == row)
{
puts("suer is have!");
return -2;
}
//有的话就返回,没有的话就注册
memset(sql, 0, sizeof(sql));
msgerr = NULL;
sprintf(sql, "insert into Teacher values ('%s','%s');", name, passwd);
ret = sqlite3_exec(pdb, sql, NULL, NULL, &msgerr);
if(ret != SQLITE_OK)
{
printf("register Teacher error:%s\n",msgerr);
//释放msgerr的空间
sqlite3_free(msgerr);
return -1;
}
printf("register Teacher success!\n");
return 0;
}
//教师登陆
int TeacherLogin(const char *name, const char *passwd)
{
if(NULL == name || NULL == passwd)
{
perror("TeacherLogin:arg error:");
return -1;
}
char sql[1024] = {0};
char **ppTable = NULL;
char *msgerr = NULL;
int row = 0;
int column;
sprintf(sql, "select passwd from Teacher where name = '%s';", name);
int ret = sqlite3_get_table(pdb, sql, &ppTable, &row, &column, &msgerr);
if(ret != SQLITE_OK)
{
printf("TeacherLogin:get table error:%s", msgerr);
return -2;
}
if(0 == row)//没有查到,说明账号有误
{
puts("账号有误!");
return -3;
}
if(0 == strcmp(ppTable[1], passwd))
{
printf("登陆成功!\n");
return 0;
}
else
{
puts("密码有误!");
return -3;
}
return 0;
}
//增加学生信息
int AddInfo(const char *sname,const char *major_class,int ID)
{
if(NULL == sname || NULL == major_class)//因为ID为整形所以不能yuNULL相比。
{
perror("addInfo:arg error:");
return -1;
}
char sql[1024] = {0};
char *msgerr = NULL;
sprintf(sql, "insert into students values ('%s', '%s','%d');", sname,major_class,ID);
int ret = sqlite3_exec(pdb, sql, NULL, NULL, &msgerr);
if(ret != SQLITE_OK)
{
printf("AddInfo:add Info error:%s\n",msgerr);
sqlite3_free(msgerr);
return -2;
}
printf("add Info success.\n");
return 0;
}
//查找信息
char *SelectInfo(int ID)
{
if(ID < 0)
{
perror("selectInfo:arg error:");
return -1;
}
char sql[1024] = {0};
char *msgerr = NULL;
sprintf(sql, "select * from students where ID='%d';", ID);
char **ppTable = NULL;
int row = 0;
int column;
int ret = sqlite3_get_table(pdb, sql, &ppTable, &row, &column, &msgerr);
if(ret != SQLITE_OK)
{
printf("selectInfo: get table error:%s\n", msgerr);
sqlite3_free(msgerr);
return NULL;
}
int i, j;
char buf[1024] = "查询结果:\n";
char * p = buf;
for(i = 0; i< row+1; i++)
{
for(j = 0; j< column; j++)
{
//printf("%s\t", ppTable[i*column+j]);
sprintf(buf, "%s\t%s", buf, ppTable[i*column+j]);
}
sprintf(buf, "%s\n", buf);
}
//puts("");
//puts(buf);
sqlite3_free_table(ppTable);
puts(p);
return p;
}
//更改信息
int ChangeInfo(const char * major_class, int ID)
{
if(NULL == major_class)
{
perror("changeInfo:arg error:");
return -1;
}
char sql[1024] = {0};
char *msgerr = NULL;
sprintf(sql, "update students set major_class =%s where ID='%d'",major_class, ID);
int ret = sqlite3_exec(pdb, sql, NULL, NULL, &msgerr);
if(ret != SQLITE_OK)
{
printf("changeInfo: exec table error:%s\n", msgerr);
sqlite3_free(msgerr);
return -2;
}
puts("change success.");
sqlite3_free(msgerr);
return 0;
}
//删除信息
int DeleteInfo(int ID)
{
if(ID < 0)
{
perror("DeleteInfo: arg error:");
return -1;
}
char sql[1024] = {0};
char *msgerr = NULL;
sprintf(sql, "delete from students where ID='%d';", ID);
int ret = sqlite3_exec(pdb, sql, NULL, NULL, &msgerr);
if(ret != SQLITE_OK)
{
printf("DeleteInfo: exec table error:%s\n", msgerr);
return -2;
}
printf("delete %d success\n",ID);
return 0;
}
//查找所有学生信息
char * FindEverystudents()
{
char sql[1024] = {0};
char *msgerr = NULL;
sprintf(sql, "select * from students;");
char ** ppTable = NULL;
int row = 0;
int column;
int ret = sqlite3_get_table(pdb, sql, &ppTable, &row, &column, &msgerr);
if(ret < 0)
{
perror("FindEverystudents: get table error");
sqlite3_free(msgerr);
sqlite3_free_table(ppTable);
return NULL;
}
char buf[1024] = "所有学生信息如下:\n";
char *p = buf;
int i, j;
for(i = 0; i < row+1; i++)
{
for(j = 0; j < column; j++)
{
sprintf(buf, "%s\t%s", buf, ppTable[i*column+j]);
}
sprintf(buf, "%s\n", buf);
}
puts(p);
sqlite3_free(msgerr);
sqlite3_free_table(ppTable);
return p;
}
#if 0
int main()
{
dbInit();
char name[20] = {0};
int price = 0;
char passwd[20] = {0};
char mode[20] = {0};
char release[20] = {0};
/*
//添加测试
printf("添加测试:");
scanf("%s %s %d", mode, release, &price);
printf("mode:%s\trelease:%s\tprice = %d\n", mode, release, price);
AddCar(mode, release, price);
*/
/*
//查找测试
printf("查找测试:");
memset(mode, 0, sizeof(mode));
memset(release, 0, sizeof(release));
scanf("%s",mode);
printf("mode:%s\n", mode);
SelectCars(mode);
*/
/*
//修改测试
printf("修改测试:");
memset(mode, 0, sizeof(mode));
memset(release, 0, sizeof(release));
scanf("%s %d", mode, &price);
printf("mode:%s\tprice = %d\n", mode, price);
ChangeCars(mode, price);
*/
/*
//查找测试
printf("查找测试:");
memset(mode, 0, sizeof(mode));
memset(release, 0, sizeof(release));
scanf("%s", mode);
printf("mode:%s\n", mode);
SelectCars(mode);
*/
/*
//删除测试
printf("删除测试:");
memset(mode, 0, sizeof(mode));
memset(release, 0, sizeof(release));
scanf("%s", mode);
printf("mode:%s\n", mode);
DeleteCars(mode);
*/
/*//查找测试
printf("查找测试:");
memset(mode, 0, sizeof(mode));
memset(release, 0, sizeof(release));
scanf("%s %s %d", mode, release, &price);
printf("mode:%s\trelease:%s\tprice = %d\n", mode, release, price);
SelectCars(mode);
*/
//全部查找测试
FindEveryCars();
return 0;
}
#endif
client客户端
main.c
#include "../../../include/teacher_client.h"
#include "../../../include/db.h"
int main()
{
int sockfd = teacher_client_con();
teacher_client(sockfd);
close(sockfd);
return 0;
}
teacher_client.c
#include "../../../include/teacher_client.h"
#include "../../../include/db.h"
#include "../../../include/sqlite3.h"
#define BUF_SIZE 1024
void menu()
{
printf("*************************************\n");
printf("1----------------------------注册账号\n");
printf("2----------------------------登陆账号\n");
printf("0---------------------------退出系统\n");
printf("*************************************\n");
}
void menu2()
{
printf("*************************************\n");
printf("1------------------------增加信息\n");
printf("2------------------------更改信息\n");
printf("3------------------------查询某个ID学生信息\n");
printf("4------------------------删除信息\n");
printf("5------------------------查看全部信息\n");
printf("0-----------------------返回上一级系统\n");
printf("*************************************\n");
}
void pack_func(char *buf, char *name, char * passwd)
{
if(NULL == buf || NULL == name || NULL == passwd)
{
perror("pack_func:arg error");
}
sprintf(buf, "%s#%s#%s", buf, name, passwd);
}
int teacher_client_con()
{
int iClient = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == iClient)
{
perror("socket error");
return -1;
}
puts("socket success.");
struct sockaddr_in stServer;
stServer.sin_family = AF_INET;
stServer.sin_port = htons(7777);
stServer.sin_addr.s_addr = inet_addr("127.0.0.1");
int ret = connect(iClient, (struct sockaddr *)&stServer, sizeof(stServer));
if(ret != 0)
{
perror("connect error");
return -1;
}
puts("connect success.");
return iClient;
}
int teacher_client(int iClient)
{
char buf[1024] = {0};
char name[20] = {0};
char passwd[20] = {0};
char sname[20] = {0};
char major_class[20] = {0};
int ID = 0;
int menu_t = 0;
while(1)
{
menu();
printf("请输入:");
scanf("%s", buf);
if(0 == strcmp(buf, "0"))
{
printf("客户端退出.\n");
break;
}
printf("请输入账号:");
scanf("%s", name);
printf("请输入密码:");
scanf("%s", passwd);
sprintf(buf, "%s#%s#%s", buf, name, passwd);
int ret = send(iClient, buf, sizeof(buf), 0);
if(ret < 0)
{
perror("send error");
return -1;
}
printf("send success.\n");
memset(buf, 0, sizeof(buf));
ret = recv(iClient, buf, sizeof(buf), 0);
if(ret < 0)
{
perror("recv error");
continue;
}
printf("%s", buf);
if(0 == strcmp(buf, "登陆成功"))
{
puts("");
memset(buf, 0, sizeof(buf));
menu2();
printf("请输入:");
scanf("%s", buf);
while(strcmp(buf, "0"))
{
if(0 == strcmp(buf, "1"))
{
printf("姓名:");
scanf("%s", sname);
printf("班级专业:");
scanf("%s", major_class);
printf("学号:");
scanf("%d",&ID);
sprintf(buf, "%s#%s#%s#%d", buf,sname,major_class,ID);
}
if(0 == strcmp(buf, "3") || 0 == strcmp(buf, "4"))
{
printf("ID:");
scanf("%d",&ID);
sprintf(buf, "%s#%d", buf, ID);
}
if(0 == strcmp(buf, "2"))
{
printf("ID:");
scanf("%d", &ID);
printf("班级专业更改为:");
scanf("%s", major_class);
sprintf(buf, "%s#%d#%s", buf,ID, major_class);
}
ret = send(iClient, buf, sizeof(buf), 0);
if(ret < 0)
{
perror("menu2: send error");
continue;
}
printf("menu2:send success.\n");
memset(buf, 0, sizeof(buf));
ret = recv(iClient, buf, sizeof(buf), 0);
if(ret < 0)
{
perror("menu2:recv error");
continue;
}
puts(buf);
//printf("%s\n", buf);
menu2();
printf("请输入:");
scanf("%s", buf);
}
}
}
return 0;
}
db.h
#ifndef __DB_H__
#define __DB_H__
#include <stdio.h>
#include <string.h>
#include "sqlite3.h"
#include <sys/stat.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/socket.h>
#include "network.h"
sqlite3 *pdb;
int dbInit();//创建数据库、表
int TeacherRegister(const char *name , const char *passwd);
int TeacherLogin(const char *name, const char *passwd);
int AddInfo(const char *sname, const char *major_class, int ID);
char *SelectInfo(int ID);
int ChangeInfo(const char *major_class, int ID);
int DeleteInfo(int ID);
int db_func();
char * FindEverystudents();
#endif
network.h
#ifndef __NETWORK_H__
#define __NETWORK_H__
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
void getFileInfo(char *buf, char * arr[]);
int server_listen();
int server();
#endif
student_client.h
#ifndef __STUDENT_CLIENT__
#define __STUDENT_CLIENT__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
void menu();
void menu2();
int student_client(int iClient);
int student_client_con();
#endif