#ifndef _UDP_NET_SOCKET_
#define _UDP_NET_SOCKET_
#define _UDP_NET_SOCKET_
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sqlite3.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sqlite3.h>
#define PORT 8888
struct userinfo
{
int flag;//
char buf[100];//
char account[20];
char password[20];
char nickname[100];
char moto[256];
int likes;
char vip[20];
char qq_email[64];
char administrator[20];//管理员
char msg[1024];//存储对话消息
char to_nickname[20];
int online_number;
char online_nickname[100][20];//存储在线人员名单
char file_name[64];//文件名称
char file_content[4096];//文件内容
char shut_up[20];//禁言标志位
char tmp_name[20];
};
typedef struct userinfo Userinfo;
struct node
{
struct sockaddr_in client_addr;
char nickname[20];
char chat_record[1024];//链表保存聊天信息
struct node *next;
};
{
struct sockaddr_in client_addr;
char nickname[20];
char chat_record[1024];//链表保存聊天信息
struct node *next;
};
typedef struct node Node;
void forgot(sqlite3 *ppdb, Userinfo *recvbuf, Node **head, struct sockaddr_in *tmp_addr, int *sockfd);
#endif
#include <stdio.h>
#include "server.h"
#include "server.h"
void server_save_info(sqlite3 *ppdb, Userinfo *recvbuf, Userinfo *sendbuf)
{
int ret;
char auff[1024];
{
int ret;
char auff[1024];
sprintf(auff, "insert into save_info values('%s', '%s', '%s', '%s', '%d', '%s', '%s', '%s', '%s')", recvbuf->account, recvbuf->password,
recvbuf->nickname, recvbuf->moto, recvbuf->likes, recvbuf->vip, recvbuf->qq_email, recvbuf->administrator, recvbuf->shut_up);
ret = sqlite3_exec(ppdb, auff, NULL, NULL, NULL);
if (ret != SQLITE_OK)
{
perror("sqlite3_exec");
strcpy(sendbuf->buf, "帐号已存在!");
}
else
{
strcpy(sendbuf->buf, "注册成功!");
}
}
recvbuf->nickname, recvbuf->moto, recvbuf->likes, recvbuf->vip, recvbuf->qq_email, recvbuf->administrator, recvbuf->shut_up);
ret = sqlite3_exec(ppdb, auff, NULL, NULL, NULL);
if (ret != SQLITE_OK)
{
perror("sqlite3_exec");
strcpy(sendbuf->buf, "帐号已存在!");
}
else
{
strcpy(sendbuf->buf, "注册成功!");
}
}
void server_login(sqlite3 *ppdb, Userinfo *recvbuf, Userinfo *sendbuf, Node **head, struct sockaddr_in *tmp_addr)
{
bzero(sendbuf, sizeof(*sendbuf));
char **dbresult = NULL;
char *errmsg = NULL;//用来存储错误信息字符串
int nrow;//查询出多少记录(总行数)
int ncolumn;//查询出来的记录有多少字段,(总列数)
int ret, i;
char cuff[1024];
{
bzero(sendbuf, sizeof(*sendbuf));
char **dbresult = NULL;
char *errmsg = NULL;//用来存储错误信息字符串
int nrow;//查询出多少记录(总行数)
int ncolumn;//查询出来的记录有多少字段,(总列数)
int ret, i;
char cuff[1024];
sprintf(cuff, "select account, password, nickname, moto, likes, vip , administrator from save_info where account = '%s' and password = '%s'", recvbuf->account, recvbuf->password);
ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值
if (ret != SQLITE_OK)
{
perror("sqlite3_get_table_server_login");
return;
}
printf("%d\n", nrow);
ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值
if (ret != SQLITE_OK)
{
perror("sqlite3_get_table_server_login");
return;
}
printf("%d\n", nrow);
if (1 == nrow)
{
Node *tmp = (*head)->next;
while (tmp != (*head))
{
printf("%s\n", dbresult[9]);
if (!strcmp(tmp->nickname, dbresult[9]))
{
strcpy(sendbuf->buf, "该帐号已在其他地方登录!");
return;
}
tmp = tmp->next;
}
{
Node *tmp = (*head)->next;
while (tmp != (*head))
{
printf("%s\n", dbresult[9]);
if (!strcmp(tmp->nickname, dbresult[9]))
{
strcpy(sendbuf->buf, "该帐号已在其他地方登录!");
return;
}
tmp = tmp->next;
}
strcpy(sendbuf->buf, "登录成功!");
printf("%s\n", sendbuf->buf);
strcpy(sendbuf->nickname, dbresult[9]);
strcpy(sendbuf->moto, dbresult[10]);
sendbuf->likes = (*dbresult[11]) - 48;
strcpy(sendbuf->vip, dbresult[12]);
strcpy(sendbuf->administrator, dbresult[13]);
printf("%s\n", sendbuf->buf);
strcpy(sendbuf->nickname, dbresult[9]);
strcpy(sendbuf->moto, dbresult[10]);
sendbuf->likes = (*dbresult[11]) - 48;
strcpy(sendbuf->vip, dbresult[12]);
strcpy(sendbuf->administrator, dbresult[13]);
Node *p = (Node *)malloc(sizeof(Node));//链表用来记录帐号是否已登录,登录的帐号接入链表
if (NULL == p)
{
printf("Malloc Failure !\n");
return;
}
p->client_addr.sin_family = tmp_addr->sin_family;
p->client_addr.sin_port = tmp_addr->sin_port;
p->client_addr.sin_addr.s_addr = tmp_addr->sin_addr.s_addr;
if (NULL == p)
{
printf("Malloc Failure !\n");
return;
}
p->client_addr.sin_family = tmp_addr->sin_family;
p->client_addr.sin_port = tmp_addr->sin_port;
p->client_addr.sin_addr.s_addr = tmp_addr->sin_addr.s_addr;
strcpy(p->nickname, dbresult[9]);
p->next = (*head)->next;
(*head)->next = p;//循环链表; 记忆:head始终在最有边,新来的结点在最左边,head->next 始终指向p
}
else
{
strcpy(sendbuf->buf, "帐号或密码错误");
}
}
(*head)->next = p;//循环链表; 记忆:head始终在最有边,新来的结点在最左边,head->next 始终指向p
}
else
{
strcpy(sendbuf->buf, "帐号或密码错误");
}
}
void forgot_password(sqlite3 *ppdb, Userinfo *recvbuf, Node **head, struct sockaddr_in *tmp_addr, int *sockfd)
{
Userinfo sendbuf = {0};
bzero(&sendbuf, sizeof(sendbuf));
char **dbresult = NULL;
char *errmsg = NULL;//用来存储错误信息字符串
int nrow;//查询出多少记录(总行数)
int ncolumn;//查询出来的记录有多少字段,(总列数)
int ret, i;
char cuff[1024];
sprintf(cuff, "select account, password from save_info where qq_email = '%s'", recvbuf->qq_email);
ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值
if (ret != SQLITE_OK)
{
perror("sqlite3_get_table_server_login");
return;
}
printf("%d\n", nrow);
ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值
if (ret != SQLITE_OK)
{
perror("sqlite3_get_table_server_login");
return;
}
printf("%d\n", nrow);
if (1 == nrow)
{
strcpy(sendbuf.buf, "忘记密码");
strcpy(sendbuf.account, dbresult[2]);
strcpy(sendbuf.password, dbresult[3]);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)tmp_addr, sizeof(*tmp_addr));
if (ret < 0)
{
perror("sendto_forgot_password");
return;
}
}
else
{
strcpy(sendbuf.buf, "该帐号未注册");
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)tmp_addr, sizeof(*tmp_addr));
if (ret < 0)
{
perror("sendto_forgot_password");
return;
}
}
}
{
strcpy(sendbuf.buf, "忘记密码");
strcpy(sendbuf.account, dbresult[2]);
strcpy(sendbuf.password, dbresult[3]);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)tmp_addr, sizeof(*tmp_addr));
if (ret < 0)
{
perror("sendto_forgot_password");
return;
}
}
else
{
strcpy(sendbuf.buf, "该帐号未注册");
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)tmp_addr, sizeof(*tmp_addr));
if (ret < 0)
{
perror("sendto_forgot_password");
return;
}
}
}
void transmit_to(sqlite3 *ppdb, Userinfo *sendbuf, Userinfo *recvbuf)//存储接收方用户信息to_nickname
{
char **dbresult = NULL;
char *errmsg = NULL;//用来存储错误信息字符串
int nrow;//查询出多少记录(总行数)
int ncolumn;//查询出来的记录有多少字段,(总列数)
int ret, i;
char cuff[1024];
sprintf(cuff, "select shut_up, password, nickname, moto, likes, vip , administrator from save_info where nickname = '%s'", recvbuf->to_nickname);
ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值
if (ret != SQLITE_OK)
{
perror("sqlite3_get_table_server_login");
return;
}
printf("%d\n", nrow);
ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值
if (ret != SQLITE_OK)
{
perror("sqlite3_get_table_server_login");
return;
}
printf("%d\n", nrow);
if (1 == nrow)
{
strcpy(sendbuf->shut_up, dbresult[7]);
strcpy(sendbuf->nickname, dbresult[9]);//
strcpy(sendbuf->moto, dbresult[10]);
sendbuf->likes = (*dbresult[11]) - 48;
strcpy(sendbuf->vip, dbresult[12]);
strcpy(sendbuf->administrator, dbresult[13]);
printf("%s\n", sendbuf->shut_up);
}
}
{
strcpy(sendbuf->shut_up, dbresult[7]);
strcpy(sendbuf->nickname, dbresult[9]);//
strcpy(sendbuf->moto, dbresult[10]);
sendbuf->likes = (*dbresult[11]) - 48;
strcpy(sendbuf->vip, dbresult[12]);
strcpy(sendbuf->administrator, dbresult[13]);
printf("%s\n", sendbuf->shut_up);
}
}
void transmit(sqlite3 *ppdb, Userinfo *sendbuf, Userinfo *recvbuf)//存储发送方用户信息
{
char **dbresult = NULL;
char *errmsg = NULL;//用来存储错误信息字符串
int nrow;//查询出多少记录(总行数)
int ncolumn;//查询出来的记录有多少字段,(总列数)
int ret, i;
char cuff[1024];
sprintf(cuff, "select shut_up, password, nickname, moto, likes, vip , administrator from save_info where nickname = '%s'", recvbuf->nickname);
ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值
if (ret != SQLITE_OK)
{
perror("sqlite3_get_table_server_login");
return;
}
printf("%d\n", nrow);
ret = sqlite3_get_table(ppdb, cuff, &dbresult, &nrow, &ncolumn, &errmsg);//执行成功返回SQLITE_OK,否则返回其他值
if (ret != SQLITE_OK)
{
perror("sqlite3_get_table_server_login");
return;
}
printf("%d\n", nrow);
if (1 == nrow)
{
strcpy(sendbuf->shut_up, dbresult[7]);
strcpy(sendbuf->nickname, dbresult[9]);//
strcpy(sendbuf->moto, dbresult[10]);
sendbuf->likes = (*dbresult[11]) - 48;
strcpy(sendbuf->vip, dbresult[12]);
strcpy(sendbuf->administrator, dbresult[13]);
}
}
{
strcpy(sendbuf->shut_up, dbresult[7]);
strcpy(sendbuf->nickname, dbresult[9]);//
strcpy(sendbuf->moto, dbresult[10]);
sendbuf->likes = (*dbresult[11]) - 48;
strcpy(sendbuf->vip, dbresult[12]);
strcpy(sendbuf->administrator, dbresult[13]);
}
}
void transmit_back(sqlite3 *ppdb, Userinfo *recvbuf, struct sockaddr_in *tmp_addr, int *sockfd)
//存储发送方用户信息并直接返回发送方,用于处理客户端误操作或重复操作
{
Userinfo sendbuf = {0};
bzero(&sendbuf, sizeof(sendbuf));
char **dbresult = NULL;
char *errmsg = NULL;//用来存储错误信息字符串
int nrow;//查询出多少记录(总行数)
int ncolumn;//查询出来的记录有多少字段,(总列数)
int ret, i;
char cuff[1024];
//存储发送方用户信息并直接返回发送方,用于处理客户端误操作或重复操作
{
Userinfo sendbuf = {0};
bzero(&sendbuf, sizeof(sendbuf));
char **dbresult = NULL;
char *errmsg = NULL;//用来存储错误信息字符串
int nrow;//查询出多少记录(总行数)
int ncolumn;//查询出来的记录有多少字段,(总列数)
int ret, i;
char cuff[1024];
sprintf(cuff, "select shut_up, password, nickname, moto, likes, vip , administrator from save_info where nickname = '%s'&