网络编程的小项目

本项目仅实现了注册登录以及增加信息和查看所有信息的功能

还需要继续完善。 

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值