聊天室登陆篇

Server.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

#include "Server.h"



void reg(int cmd, int client_socket)
{
	int result = REG_USEREXIST;
	printf("客户端有一个注册请求\n");
	char name[20] = {0};
	char passwd[20] = {0};
	int len;
	read(client_socket, &len, sizeof(int));  // 读取用户名长度
	read(client_socket, name, len);           // 读用户名
	
	read(client_socket, &len, sizeof(int));  // 读取密码长度
	read(client_socket, passwd, len);         // 密码
	
	// 检测数据库中是否有用户,没有就将数据存入
	if(0 == message_select(name))
	{
		result = message_add(name,passwd);
		
	}
	else
	{
		result =  REG_USEREXIST;
	}
	
	
	// 告诉客户端处理的结果
	write(client_socket, &cmd, sizeof(int));
	write(client_socket, &result, sizeof(int));
}


void login(int cmd, int client_socket)
{
	int result = REG_USEREXIST;
	printf("客户端有一个登陆请求\n");
	char name[20] = {0};
	char passwd[20] = {0};
	int len;
	read(client_socket, &len, sizeof(int));  // 读取用户名长度
	read(client_socket, name, len);           // 读用户名
	
	read(client_socket, &len, sizeof(int));  // 读取密码长度
	read(client_socket, passwd, len);         // 密码
	
	
	// 告诉客户端处理的结果
	result = message_right(name,passwd);
	write(client_socket, &cmd, sizeof(int));
	write(client_socket, &result, sizeof(int));
}

void *handl_client(void *v)
{
	long client_socket = (long)v;
	
	while (1)
	{
		int cmd;
		int ret = read(client_socket, &cmd, sizeof(int));
		if (-1 == ret)
		{
			perror("read");
			return NULL;
		}
		if (0 == ret)
		{
			break;
		}
		printf("从客户端收到一条消息\n"); 
		switch(cmd)
		{
			case REGISTER:   // 注册
				reg(cmd, client_socket);
				break;
			case LOGIN:
				login(cmd, client_socket);
				break;
			case QUIT:
				break;
			default:
				printf("发生错误\n");
				break;
			
		}
		
		
	}
	
}


// 监听套接字
int init()
{
	int listen_socket = socket(AF_INET, SOCK_STREAM, 0);
	
	if(-1 == listen_socket)
	{
		perror("创建套接字失败");
		return -1;
	}
	
	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(struct sockaddr_in));
	addr.sin_family      = AF_INET;             /* Internet地址族 */
	addr.sin_port        = htons(PORT);         /* 端口号 */
	addr.sin_addr.s_addr = htonl(INADDR_ANY);   /* IP地址, 绑定本地的所有ip地址*/

	int ret = bind(listen_socket, (const struct sockaddr *)&addr, sizeof(addr));
	
	if(-1 == ret)
	{
		perror("绑定失败");
		return -1;
	}
	
	// 3、监听套接字
	ret = listen(listen_socket, 5);
	
	if(-1 == ret)
	{
		perror("监听失败");
		return -1;
	}
	
	return listen_socket;
}

// 通信套接字
int myAccept(int listen_socket)
{
	struct sockaddr_in client_addr;
	socklen_t  len = sizeof(client_addr);
	int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &len);
	
	if (-1 == client_socket)
	{
		perror("accept  失败");
		return -1;
	}
	
	printf ("客户端的 ip = %s, 端口 = %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
	
	
	return client_socket;
}



Sqlite3.c

#include <stdio.h>
#include <sqlite3.h>

#include "Server.h"


// 查询用户是否被注册
int message_select(char *name)
{
	sqlite3 *db;
	int ret = sqlite3_open("message.db",&db);
	
	if (ret != SQLITE_OK)
	{
		printf ("数据库打开失败\n");
		return -1;
	}
	printf("正在查找有无相同的用户名\n");
	
	//创建表
	char *errmsg;
	const char *sql = "create table if not exists message(Name TEXT,Passwd TEXT, primary key(name))";
	ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg );
	
	if (ret != SQLITE_OK)
	{
		printf ("exec 失败: %s\n", errmsg);
		return -1;
	}
	
	const char *sql2 = "select * from message";
	char **value = NULL;
	int row;
	int column;
	ret = sqlite3_get_table(db, sql2, &value, &row, &column, &errmsg);
	
	if (ret != SQLITE_OK)
	{
		printf ("查询失败: %s\n", errmsg);
		sqlite3_free(errmsg);
		return -1;
	}

	int i;
	
	for (i = column; i < row*column; i += column)
	{
		if(0 == strcmp(value[i],name))
		{
			printf("用户名已被注册\n");
			return 1;
		}
	}

	printf("%s还没有被注册\n",name);
	sqlite3_free_table(value);   // 释放查询结果
	sqlite3_close(db);
	
	return 0;
}

//查询待登陆账户是否存在,密码是否正确
int message_right(char *name ,char *passwd)
{
	sqlite3 *db;
	int ret = sqlite3_open("message.db",&db);
	
	if (ret != SQLITE_OK)
	{
		printf ("数据库打开失败\n");
		return -1;
	}
	printf("正在查找有无相同的用户名\n");
	
	//创建表
	char *errmsg;
	const char *sql = "create table if not exists message(Name TEXT,Passwd TEXT, primary key(name))";
	ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg );
	
	if (ret != SQLITE_OK)
	{
		printf ("exec 失败: %s\n", errmsg);
		return -1;
	}
	
	const char *sql2 = "select * from message";
	char **value = NULL;
	int row;
	int column;
	ret = sqlite3_get_table(db, sql2, &value, &row, &column, &errmsg);
	
	if (ret != SQLITE_OK)
	{
		printf ("查询失败: %s\n", errmsg);
		sqlite3_free(errmsg);
		return -1;
	}

	int i;
	/* for (i = column; i < row*column; i++)
	{
		if (i % column == 0)
			printf ("\n");
		printf ("%-8s", value[i]);
	}
	printf ("\n"); */
	
	for (i = column; i < (row+1)*column; i += column)
	{
		if(0 == strcmp(value[i] ,name) && 0 == strcmp(value[i+1] ,passwd) )
		{
			printf("查找到该用户\n");
			sqlite3_free_table(value);   // 释放查询结果
			sqlite3_close(db);
			return LOG_OK;
		}
	}

	printf("%s用户登陆失败\n",name);
	sqlite3_free_table(value);   // 释放查询结果
	sqlite3_close(db);
	
	return LOG_FAIL;
}



//创建添加
int message_add(char *name, char *passwd)
{
	printf("正在注册......");
	//创建文件
	sqlite3 *db;
	int ret = sqlite3_open("message.db",&db);
	if (ret != SQLITE_OK)
	{
		printf ("数据库打开失败\n");
		return -1;
	}
	//创建表
	char *errmsg;
	/* const char *sql = "create table if not exists message(Name TEXT,Passwd TEXT, primary key(name))";
	ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg );
	
	if (ret != SQLITE_OK)
	{
		printf ("exec 失败: %s\n", errmsg);
		return -1;
	} */
	
	
	char str[100];
	sprintf (str, "insert into message values('%s', '%s')", name, passwd);
	ret = sqlite3_exec(db, str, NULL, NULL, &errmsg );
	
	if (ret != SQLITE_OK)
	{
		printf ("exec 失败: %s\n", errmsg);
		sqlite3_free(errmsg);
		sqlite3_close(db);
		return REG_USEREXIST;
	}

	sqlite3_close(db);
	
	return REG_OK;
}

Client.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

#include <netinet/in.h>
#include "Client.h"

int flag = 0;
void write_reg(int client_socket)
{
	//命令
	int cmd = 1;
	//用户名/密码长度
	int len;
	//用户名
	char name[20] = {0};
	//密码
	char passwd[20] = {0};
	//一开始将cmd写入
	write(client_socket, &cmd, sizeof(int));
	
	//填写用户名,并测量用户名长度
	printf("请输入用户名\n");
	scanf("%s", name);
	len = strlen(name);
	//先将用户名长度填入
	write(client_socket, &len, sizeof(int));
	//再将用户名填入
	write(client_socket, name, len);
	
	
	//填写密码,并测量密码长度
	printf("请输入密码\n");
	scanf("%s", passwd);
	len = strlen(passwd);
	//先将密码长度填入
	write(client_socket, &len, sizeof(int));
	//再将密码填入
	write(client_socket, passwd, len);
	
	return;
}

void write_log(int client_socket)
{
	//命令
	int cmd = 2;
	//用户名/密码长度
	int len;
	//用户名
	char name[20] = {0};
	//密码
	char passwd[20] = {0};
	//一开始将cmd写入
	write(client_socket, &cmd, sizeof(int));
	
	//填写用户名,并测量用户名长度
	printf("请输入用户名\n");
	scanf("%s", name);
	len = strlen(name);
	//先将用户名长度填入
	write(client_socket, &len, sizeof(int));
	//再将用户名填入
	write(client_socket, name, len);
	
	
	//填写密码,并测量密码长度
	printf("请输入密码\n");
	scanf("%s", passwd);
	len = strlen(passwd);
	//先将密码长度填入
	write(client_socket, &len, sizeof(int));
	//再将密码填入
	write(client_socket, passwd, len);
	
	return;
}
//子线程负责往服务器写数据
void *write_data(void *v)
{
	system("clear");
	int client_socket = *(int*)v;
	int cmd;
	
	while(1)
	{
		sleep(2);
		printf("1、注册\n");
		printf("2、登陆\n");
		printf("3、退出\n");
		printf("请输入指令:");
		scanf("%d",&cmd);
		
		switch(cmd)
		{
			case REGISTER:
				write_reg(client_socket);
				break;
			case LOGIN:
				write_log(client_socket);
				sleep(2);
				break;
			case QUIT:
				
				break;
			default:
				printf("输入错误,请重新输入\n");
				break;
		}
		
		system("clear");
		int cmd2;
		while(1 == flag)
		{
			printf("您可以进行以下操作\n");
			printf("1、查看当前在线用户\n");
			printf("2、进入群聊界面\n");
			printf("3、进入私聊界面\n");
			printf("4、退出聊天室\n");
			printf("请输入指令:");
			scanf("%d",&cmd2);
			switch(cmd2)
			{
				case 1:
					
					break;
				case 2:
					
					break;
				case 3:
				
					break;
				case 4:
					
					break;
				default:
					printf("输入错误,请重新输入\n");
					break;
			}
			
		}
	
	}
}

void read_reg(int client_socket)
{
	
	int result;
	int ret = read(client_socket, &result, sizeof(int));
	
	if (-1 == ret)
	{
		perror ("read error");
	}
	
	switch(result)
	{
		case REG_OK:
			printf("注册成功\n");
			break;
		case REG_USEREXIST:
			printf("用户已存在,注册失败,请重新注册\n");
			break;
		default:
			printf("出现错误,请重新注册\n");
			break;
	}
}

void read_log(int client_socket)
{
	
	int result;
	int ret = read(client_socket, &result, sizeof(int));
	
	if (-1 == ret)
	{
		perror ("read error");
	}
	
	switch(result)
	{
		case LOG_OK:
			printf("登陆成功\n");
			flag = 1;
			break;
		case LOG_FAIL:
			printf("登陆失败,请重新输入\n");
			break;
		default:
			printf("出现错误,请重新注册\n");
			break;
	}
}

//主线程负责从服务器读数据
void read_data(int client_socket)
{
	int cmd;
	while (1)
	{
		int ret = read(client_socket, &cmd, sizeof(int));
		if (-1 == ret)
		{
			perror ("read error");
		}
		if (0 == ret)
		{
			printf ("客户端退出\n");
			break;
		}
		system("clear");
		switch(cmd)
		{
			case REGISTER:
				read_reg(client_socket);
				break;
			case LOGIN:
				read_log(client_socket);
				break;
			case QUIT:
				
				break;
			default:
				printf("读取错误,请重新输入\n");
				break;
		}
	}	
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值