Udp聊天室服务器

#ifndef _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>
#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;
};
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"
void server_save_info(sqlite3 *ppdb, Userinfo *recvbuf, Userinfo *sendbuf)
{
 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, "注册成功!");
 }
}
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];
 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);
 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;
  }
  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]);
  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;

  strcpy(p->nickname, dbresult[9]);
  p->next = (*head)->next;
  (*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);
 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;
  }
 }
}

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);
 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);
 }
}

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);
 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]);
 }
}

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];
 sprintf(cuff, "select shut_up, password, nickname, moto, likes, vip , administrator from save_info where nickname = '%s'&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值