基于C/S架构的网络聊天室

服务器端

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sqlite3.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "LinkList.h"

#define PORT 9999

typedef struct _msg
{
	int cmd;
	int flag;
	char username[20];
	char password[20];
	char msg[1024];
	char frname[20];
	char toname[20];
	char time[50];
	char filename[20];
}Msg;

sqlite3 *database;

Node *head;

//初始化套接字,返回监听套接字
int Init_Socket()
{
	//创建套接字
	int listen_socket = socket(AF_INET, SOCK_STREAM, 0);
	if(listen_socket == -1)
	{
		perror("socket");
		return -1;
	}
	
	//命名套接字
	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	int ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof(addr));
	if(ret == -1)
	{
		perror("bind");
		return -1;
	}
	
	//监听套接字
	ret = listen(listen_socket, 5);
	if(ret == -1)
	{
		perror("listen");
		return -1;
	}
	
	printf("等待客户端连接......\n");
	
	return listen_socket;
}

//处理客户端连接,返回与客户端通信的套接字
int MyAccept(int listen_socket)
{
	//接收套接字
	struct sockaddr_in client_addr;
	int len = sizeof(client_addr);
	
	int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &len);
	if(client_socket == -1)
	{
		perror("accept");
		return -1;
	}
	
	printf("成功接收一个客户端:%s\n",inet_ntoa(client_addr.sin_addr));
	
	return client_socket;
}

//注册
void reg(int client_socket, Msg *msg)
{
	char *errmsg = NULL;
	char **resultp = NULL;
	int nrow, ncolumn;
	char *sql = "select * from login";
	int ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg);
	if (ret != SQLITE_OK)
	{
		printf ("数据库操作失败:%s\n", errmsg);
		return;
	}
	printf("查找成功\n");
	
	int i;
	for(i = 0;i < (nrow+1) * ncolumn;i++)
	{
		if(strcmp(resultp[i],msg->username) == 0)
		{
			printf("用户已存在\n");
			msg->cmd = -1;
			write(client_socket,msg,sizeof(Msg));
			return;
		}
	}
	
	char buf[100];
	sprintf (buf, "insert into login values('%s', '%s')", msg->username,msg->password);
	ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg);
	if (ret != SQLITE_OK)
	{
		printf ("数据库操作失败:%s\n", errmsg);
		return;
	}
	printf("%s用户注册成功\n",msg->username);
	
	msg->cmd = 1001;

	write(client_socket,msg,sizeof(Msg));
}

//用户登录
void login(int client_socket, Msg *msg)
{
	char *errmsg = NULL;
	char **resultp = NULL;
	int nrow, ncolumn;
	char *sql = "select * from login";
	int ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg);
	if (ret != SQLITE_OK)
	{
		printf ("数据库操作失败:%s\n", errmsg);
		return;
	}
	printf("查找成功\n");
	
	int i;
	for(i = 0;i < (nrow+1) * ncolumn;i++)
	{
		if(strcmp(resultp[i],msg->username) == 0 && strcmp(resultp[i+1],msg->password) == 0)
		{
			printf("%s登录成功\n",msg->username);
			User user;
			strcpy(user.username,msg->username);
			user.client_socket = client_socket;
			Insert_Last(head,user);
			Display(head);
			msg->cmd = 1002;
			write(client_socket,msg,sizeof(Msg));
			return;
		}
	}
		
	msg->cmd = -2;
	printf("用户名或密码错误,%s登录失败\n",msg->us
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值