客户端具体功能函数实现,完成测试运行
实现注册、登录、vip设置、发送表情、点赞等功能
#include "my_headfile.h"
struct send userInfo;
struct recv userBack;
int ret;
char fan[20]; //输入任意键返回
char Name[20];
int READEN = 0;
int State;
int LIKES = 0;
int OUT = 0;
struct tm *gettime(void) //获取当前时间
{
time_t now;
struct tm *t;
time(&now);
t = localtime(&now);
return t;
}
char* nowtime() //将获取的时间以字符串返回
{
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
return asctime(timeinfo);
}
int mygetch() //将密码数字转换为*(网上借鉴,不太懂)
{
struct termios oldt,
newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}
void Welcome() //启动客户端界面
{
struct tm *t = gettime();
system("clear");
printf(" ************************************************************\n");
printf("\n");
printf(" ******************** 欢 ********************\n");
printf("\n");
printf(" ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
printf("\n");
printf(" Author:QXW \n");
printf("\n");
printf(" ************************************************************\n");
printf("\n");
usleep(1000000);
system("clear");
printf(" ************************************************************\n");
printf("\n");
printf(" ******************** 欢迎 ********************\n");
printf("\n");
printf(" ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
printf("\n");
printf(" Author:QXW \n");
printf("\n");
printf(" ************************************************************\n");
printf("\n");
usleep(1000000);
system("clear");
printf(" ************************************************************\n");
printf("\n");
printf(" ******************** 欢迎来 ********************\n");
printf("\n");
printf(" ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
printf("\n");
printf(" Author:QXW \n");
printf("\n");
printf(" ************************************************************\n");
printf("\n");
usleep(1000000);
system("clear");
printf(" ************************************************************\n");
printf("\n");
printf(" ******************** 欢迎来到 ********************\n");
printf("\n");
printf(" ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
printf("\n");
printf(" Author:QXW \n");
printf("\n");
printf(" ************************************************************\n");
printf("\n");
usleep(1000000);
system("clear");
printf(" ************************************************************\n");
printf("\n");
printf(" ******************** 欢迎来到本 ********************\n");
printf("\n");
printf(" ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
printf("\n");
printf(" Author:QXW \n");
printf("\n");
printf(" ************************************************************\n");
printf("\n");
usleep(1000000);
system("clear");
printf(" ************************************************************\n");
printf("\n");
printf(" ******************** 欢迎来到本聊 ********************\n");
printf("\n");
printf(" ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
printf("\n");
printf(" Author:QXW \n");
printf("\n");
printf(" ************************************************************\n");
printf("\n");
usleep(1000000);
system("clear");
printf(" ************************************************************\n");
printf("\n");
printf(" ******************** 欢迎来到本聊天 ********************\n");
printf("\n");
printf(" ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
printf("\n");
printf(" Author:QXW \n");
printf("\n");
printf(" ************************************************************\n");
printf("\n");
usleep(1000000);
system("clear");
printf(" ************************************************************\n");
printf("\n");
printf(" ******************** 欢迎来到本聊天室 ********************\n");
printf("\n");
printf(" ************ 当前时间: 2018年-%02d月-%02d日 %02d:%02d ************\n", t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min);
printf("\n");
printf(" Author:QXW \n");
printf("\n");
printf(" ************************************************************\n");
printf("\n");
usleep(1000000);
}
//主界面显示
void show()
{
system("clear");
printf("**********************************欢迎使用本聊天室*****************************\n");
printf("* *\n");
printf("* 1、注册 *\n");
printf("* 2、登录 *\n");
printf("* 3、忘记密码 *\n");
printf("* 4、退出 *\n");
printf("* *\n");
printf("* 为了维护本聊天室的数据安全和通信请勿登录超过10个客户端 *\n");
printf("* *\n");
printf("*******************************************************************************\n");
printf("请输入相应的命令(如注册输入1):\n");
}
//注册界面显示及处理
int show_reg()
{
char pass1[20];
char pass2[20];
int i = 0;
int j = 0;
system("clear");
printf("\n\n\n\n");
State = 0; //禁言标志位
userInfo.cmd = reg;
userInfo.likes = 0; //初始值
userInfo.vip = 0; //初始值
printf("\t\t\t\t请输入账号:");
scanf("%s", userInfo.account);
printf("\n\t\t\t\t请输入密码:");
while (i < 20)
{
pass1[i] = mygetch();
if (pass1[i] == 10)
{
if (j == 0) 防止输入账号的最后一个回车影响
{
j++;
continue;
}
break;
}
printf("*");
i++;
}
pass1[i] = '\0';
i = 0;
printf("\n\n\t\t\t\t请确认您的密码:");
while (i < 20)
{
pass2[i] = mygetch();
if (pass2[i] == 10)
{
break;
}
printf("*");
i++;
}
pass2[i] = '\0';
printf("\n\n\t\t\t\t请设计您的昵称:");
scanf("%s", userInfo.name);
strcpy(userInfo.moto, "略略略(T_T)");
printf("\n\n\t\t\t\t请输入密保问题:");
scanf("%s", userInfo.question);
getchar();
printf("\n\n\t\t\t\t请输入密保答案:");
scanf("%s", userInfo.answer);
getchar();
system("clear");
printf("\n\n\n\n\n\n\n\t\t\t正在注册......\n");
sleep(2);
if (strcmp(pass1, pass2) != 0) //比较前后输入密码是否一致
{
printf("\n\n\t\t\t\t密码输入有误!请重新注册!\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
return -9;
}
else
{
strcpy(userInfo.passward, pass1);
}
}
//登录界面显示
int show_log()
{
char pass1[20];
int i = 0;
int j = 0;
system("clear");
printf("\n\n\n\n\n\n\n");
printf("\t\t\t\t请输入账号:");
scanf("%s", userInfo.account);
printf("\n\t\t\t\t请输入密码:");
while (i < 20)
{
pass1[i] = mygetch();
if (pass1[i] == 10)
{
if (j == 0) 防止输入账号的最后一个回车影响
{
j++;
continue;
}
break;
}
printf("*");
i++;
}
pass1[i] = '\0';
strcpy(userInfo.passward, pass1);
system("clear");
printf("\n\n\n\n\n\n\n\t\t\t正在登录......\n");
sleep(2);
}
//登陆之后界面显示及处理
int show_chat()
{
system("clear");
gettime();
printf("\n%s 个性签名:%s 点赞数:%d", Name, userBack.moto, LIKES);
if (userBack.vip == 1)
{
printf("\t\t超级会员");
}
else
{
printf("\t\t普通用户");
}
printf("\n\n\t\t a 私聊\n");
printf("\t\t\t\t b 群聊\n");
printf("\t\t c 查看在线人数\n");
printf("\t\t\t\t d 发送表情\n");
printf("\t\t e 点赞\n");
printf("\t\t\t\t f 更改个性签名\n");
printf("\t\t g 注册会员\n");
printf("\t\t\t\t h 禁言(需开通会员)\n");
printf("\t\t i 解禁(需开通会员)\n");
printf("\t\t\t\t j 查看聊天记录\n");
printf("\t\t k 退出\n");
printf("\n\n\t\t请输入您的选择:");
}
//发送表情选择
int deal_send_expr(int sfd)
{
char e[10]; //输入表情选项
system("clear");
printf("\n\n\n\n");
if (State == Shutup) //判断用户是否被禁言
{
printf("\n\n\n\n\t\t您处于被禁言状态!无法发言!开通会员可以解禁`(*∩_∩*)′\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
return Shutup;
}
printf("\n\t\t\t您想发表情给谁呢?:");
scanf("%s", userInfo.toname);
strcpy(userInfo.name, Name);
userInfo.cmd = expression;
printf("\n\n\t\t\t\t1 开心 :-D\n");
printf("\t\t\t\t2 生气 = =#\n");
printf("\t\t\t\t3 为你加油 *\(^_^)/*\n");
printf("\t\t\t\t4 两手一摊 ╮( ̄▽  ̄)╭\n");
printf("\t\t\t\t5 飞吻 づ ̄ 3 ̄)づ\n");
printf("\t\t\t\t6 哭泣 (T_T)\n");
printf("\t\t\t\t7 竖起大拇指 b( ̄▽ ̄)d\n");
printf("\t\t\t\t8 不满 (︶︿︶)\n");
printf("\t\t\t\t9 亲亲 >3<\n\n");
printf("\t\t请输入您想发送的表情:");
scanf("%s", e);
getchar();
userInfo.e_s = e[0];
if (strcmp(Name, userInfo.toname) == 0)
{
sleep(1);
system("clear");
printf("\n\n\n\n\n\n\t\t不可以给自己发送表情哦`(*∩_∩*)′");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
return -1;
}
ret = write(sfd, &userInfo, sizeof(userInfo)); //将发送信息打包发送给服务器处理
if (ret == -1)
{
perror("write");
return -1;
}
system("clear");
printf("\n\n\n\n\n\n\t\t正在发送...\n");
sleep(2);
}
//分析表情信号
int back_ep()
{
char er[20];
switch (userBack.e_s)
{
case '1':
{
strcpy(er, ":-D");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
case '2':
{
strcpy(er, "= =#");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
case '3':
{
strcpy(er, "*\(^_^)/*");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
case '4':
{
strcpy(er, "╮( ̄▽  ̄)╭");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
case '5':
{
strcpy(er, "づ ̄ 3 ̄)づ");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
case '6':
{
strcpy(er, "(T_T)");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
case '7':
{
strcpy(er, "b( ̄▽ ̄)d");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
case '8':
{
strcpy(er, "(︶︿︶)");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
case '9':
{
strcpy(er, ">3<");
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一个表情给您!", userBack.from_name);
printf("\n\n\t\t%s\n", er);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
default:
{
system("clear");
printf("\n\n\n\n\t\t抱歉!输入错误!/n");
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
break;
}
}
}
//读线程
void* Read_from_server(int sfd)
{
int i;
while (1)
{
ret = read(sfd, &userBack, sizeof(userBack)); //接收服务器返回信息
if (ret == -1)
{
perror("read");
return;
}
READEN = 1;
switch (userBack.result)
{
case (private_chat): //私聊
{
system("clear");
printf("\n\n\n\n\n\n\t\t%s 对您说了一句悄悄话:%s", userBack.from_name, userBack.msg);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
memset(&userBack.result, 0, sizeof(userBack.result));
break;
}
case (group_chat): //群聊
{
system("clear");
printf("\n\n\n\n\t\t%s用户发送了一条信息:%s\n", userBack.from_name, userBack.msg);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
memset(&userBack.result, 0, sizeof(userBack.result));
break;
}
case (online_member): //在线人数
{
system("clear");
printf("\n\n\n\n\t\t当前在线人数:%d\n", userBack.online_num);
for (i = 0; i < userBack.online_num; i++)
{
printf("\n\n\t\t%s\n", userBack.num[i]);
}
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
getchar();
memset(&userBack.result, 0, sizeof(userBack.result));
break;
}
case (expression): //发送表情
{
back_ep();
memset(&userBack.result, 0, sizeof(userBack.result));
break;
}
case (like): //点赞
{
LIKES = userBack.likes;
system("clear");
printf("\n\n\n\n\n\n\t\t%s用户给你点了一个赞!`(*∩_∩*)′\n", userBack.from_name);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
memset(&userBack.result, 0, sizeof(userBack.result));
break;
}
case (Shutup): //禁言
{
State = Shutup;
system("clear");
printf("\n\n\n\n\n\n\t\t%s用户把您禁言了!开通会员可以解禁并反击他哦`(*∩_∩*)′\n", userBack.from_name);
printf("\n\n\n\n\t\t输入ENTER键返回`(*∩_∩*)′\n");
memset(&userBack.result, 0, sizeof(userBack.result));
break;
}
}
}
}
//处理登录后的请求
int deal_log(int sfd)
{
char ecf[12]; //输入选择
char x[2]; //用于支付确认
char xzf[40]; //聊天文本名字
char czf[2048]; //聊天记录
while (1)
{
if (READEN == 1)
{
READEN = 0;
switch (userBack.result)
{
case (Send_success): //发送消息成功
{
system("clear");
printf("\n\n\n\n\n\n\t\t发送成功!\n");
memset(&userBack.result, 0, sizeof(userBack.result));
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
case (like_success): //点赞成功
{
system("clear");
printf("\n\n\n\n");
printf("\n\n\t\t恭喜您点赞成功!`(*∩_∩*)′\n");
memset(&userBack.result, 0, sizeof(userBack.result));
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
case (change_success): //修改个性签名成功
{
system("clear");
printf("\n\n\n\n");
printf("\n\n\t\t恭喜您更改个性签名成功!`(*∩_∩*)′\n");
memset(&userBack.result, 0, sizeof(userBack.result));
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
case (vip_success): //申请vip成功
{
system("clear");
printf("\n\n\n\n");
printf("\n\n\t\t恭喜您成为超级会员!`(*∩_∩*)′\n");
memset(&userBack.result, 0, sizeof(userBack.result));
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
case (Shutup_success): //禁言成功
{
system("clear");
printf("\n\n\n\n");
printf("\n\n\t\t恭喜您对方已成功被您禁言!`(*∩_∩*)′\n");
memset(&userBack.result, 0, sizeof(userBack.result));
printf("\n\n\n\t\t输入ENTER键离开:");
fgets(fan, 20, stdin);
break;
}
case (Send_error): //请求失败, 服务器未通过该请求
{
system("clear");
printf("\n\n\n\n");
printf("\n\n\t\t对不起,对方暂时没有登录!\n");
memset(&userBack.result, 0, sizeof(userBack.result));
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
}
}
show_chat();
fgets(ecf, 12, stdin);
if (OUT == 1)
{
OUT--;
return Exit;
}
switch (ecf[0])
{
case 'a': //私聊
{
int fd1;
system("clear");
printf("\n\n\n\n");
if (State == Shutup) //判断是否被禁言
{
printf("\n\n\n\n\t\t您处于被禁言状态!无法发言!开通会员可以解禁`(*∩_∩*)′\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
memset(czf, 0, strlen(czf));
memset(xzf, 0, strlen(xzf));
printf("\t\t\t您想和谁聊天呢?请输入对方名字:"); //聊天对象
scanf("%s", userInfo.toname);
getchar();
printf("\n\n\t\t\t请输入您想要说的话:"); //聊天内容
scanf("%[^\n]", userInfo.msg);
getchar();
userInfo.cmd = private_chat; //通知服务器 有私聊请求
strcpy(userInfo.name, Name);
if (strcmp(Name, userInfo.toname) == 0)
{
sleep(1);
system("clear");
printf("\n\n\n\n\n\n\t\t不可以给自己发信息哦`(*∩_∩*)′");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
ret = write(sfd, &userInfo, sizeof(userInfo)); //将相关信息打包发给服务端
if (ret == -1)
{
perror("write");
return -1;
}
sprintf(xzf, "%s与%s的聊天记录.txt", Name, userInfo.toname); //保存聊天记录
fd1 = open(xzf, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR); //打开保存聊天记录的文件
if (fd1 == -1)
{
perror("open");
return -1;
}
sprintf(czf, "%s 对 %s 发送了一句悄悄话:%s\t%s", Name, userInfo.toname, userInfo.msg, nowtime());
ret = write(fd1, czf, strlen(czf)); //将聊天记录写入文件保存
if (ret == -1)
{
perror("write");
return -1;
}
printf("\n\n\t\t\t正在发送...\n");
sleep(2);
break;
}
case 'b': //群聊
{
system("clear");
printf("\n\n\n\n");
int i = 0;
if (State == Shutup) //判断是否被禁言
{
printf("\n\n\n\n\t\t您处于被禁言状态!无法发言!开通会员可以解禁`(*∩_∩*)′\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
printf("\n\n\n\n\n\t\t\t请输入您想要说的话:");
scanf("%[^\n]", userInfo.msg);
getchar();
userInfo.cmd = group_chat; //通知服务器 有群聊请求
strcpy(userInfo.name, Name);
ret = write(sfd, &userInfo, sizeof(userInfo)); //打包发给服务器
if (ret == -1)
{
perror("write");
return -1;
}
system("clear");
printf("\n\n\n\n\n\t\t\t正在发送...\n");
sleep(2);
break;
}
case 'c': //查看在线人数
{
userInfo.cmd = online_member; //通知服务器 查看在线人数请求
ret = write(sfd, &userInfo, sizeof(userInfo));
if (ret == -1)
{
perror("write");
return -1;
}
system("clear");
printf("\n\n\n\n\n\n\t\t...\n");
break;
}
case 'd': //发送表情
{
deal_send_expr(sfd);
break;
}
case 'e': //点赞
{
userInfo.cmd = like; //通知服务器 有点赞请求
system("clear");
printf("\n\n\n\n\n\n\t\t您比较欣赏谁呢?`(*∩_∩*)′请告诉我:");
scanf("%s", userInfo.toname);
getchar();
strcpy(userInfo.name, Name);
if (strcmp(Name, userInfo.toname) == 0)
{
sleep(1);
system("clear");
printf("\n\n\n\n\n\n\t\t不可以给自己点赞哦`(*∩_∩*)′");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
ret = write(sfd, &userInfo, sizeof(userInfo)); //将信息打包发给服务器
if (ret == -1)
{
perror("write");
return -1;
}
printf("\n\n\t\t请稍等...\n");
sleep(2);
break;
}
case 'f': //更改个性签名
{
userInfo.cmd = motto_change; //通知服务器 有更改个性签名请求
system("clear");
printf("\n\n\n\n\n\n\t\t您想要一个什么样的个性签名呢?\n\n\n\t\t\t\t");
scanf("%s", userInfo.moto);
getchar();
strcpy(userInfo.name, Name);
ret = write(sfd, &userInfo, sizeof(userInfo)); //将信息打包发给服务器
if (ret == -1)
{
perror("write");
return -1;
}
printf("\n\n\t\t请稍等...\n");
sleep(2);
break;
}
case 'g': //注册会员
{
if (userBack.vip == 1)
{
system("clear");
printf("\n\n\n\n\n\n\t\t\t您已经是超级会员了!`(*∩_∩*)′\n");
printf("\n\n\n\t\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
}
else if (userBack.vip == 0)
{
system("clear");
printf("\n\n\n\t您好,请先支付200元,然后就能永久享受vip权限了!`(*∩_∩*)′\n");
printf("\n\n\n\n\n\t确认支付吗?(y/n)");
scanf("%s", x);
getchar();
if (x[0] == 'y')
{
strcpy(userInfo.name, Name);
userInfo.vip = 1;
userInfo.cmd = Vip; //通知服务器有申请vip请求
ret = write(sfd, &userInfo, sizeof(userInfo)); //将信息打包发给服务器
if (ret == -1)
{
perror("write");
return -1;
}
printf("\n\n\t\t请稍等...\n");
sleep(2);
}
}
break;
}
case 'h': //禁言
{
if (userBack.vip == 0) //判断是否是会员
{
system("clear");
printf("\n\n\n\n\n\n\t\t您还没有开通会员,请先开通会员!`(*∩_∩*)′\n");
printf("\n\n\n\t\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
}
else if (userBack.vip == 1)
{
system("clear");
printf("\n\n\n\n\n\n\t\t您想让谁闭嘴呢?`(*∩_∩*)′请告诉我:");
scanf("%s", userInfo.toname);
getchar();
userInfo.cmd = Shutup; //通知服务器 有禁言请求
strcpy(userInfo.name, Name);
if (strcmp(Name, userInfo.toname) == 0)
{
sleep(1);
system("clear");
printf("\n\n\n\n\n\n\t\t不可以给自己禁言哦`(*∩_∩*)′");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
ret = write(sfd, &userInfo, sizeof(userInfo)); //将信息打包发给服务器
if (ret == -1)
{
perror("write");
return;
}
printf("\n\n\t\t请稍等...\n");
sleep(2);
}
break;
}
case 'i': //解禁
{
if (State == 0)
{
system("clear");
printf("\n\n\n\n\n\n\t\t您没有被禁言!尽情聊天吧`(*∩_∩*)′\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
}
else if (State == Shutup)
{
if (userBack.vip == 0)
{
system("clear");
printf("\n\n\n\n\n\n\t\t您还没有开通会员,请先开通会员!`(*∩_∩*)′\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
}
else if (userBack.vip == 1)
{
system("clear");
printf("\n\n\n\n\n\n\t\t您想现在解禁吗!(y/n):");
scanf("%s", x);
getchar();
if (x[0] == 'y')
{
State = 0;
system("clear");
printf("\n\n\n\n\n\n\t\t恭喜您成功解禁!尽情去嗨皮啊!`(*∩_∩*)′\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
}
}
}
break;
}
case 'j': //查看聊天记录
{
system("clear");
char n[20];
char mcf[60];
char ncf[2048];
char kl;
int fd2;
int i = 0;
printf("\n\n\n\n\n\n\t\t您想看和谁的聊天记录呢?");
scanf("%s", n);
getchar();
sprintf(mcf, "%s与%s的聊天记录.txt", Name, n);
fd2 = open(mcf, O_RDONLY, S_IRUSR | S_IWUSR);
if (fd2 == -1)
{
system("clear");
printf("\n\n\n\n\n\n\n\t\t\t您与%s还没有聊天记录!快去聊天吧`(*∩_∩*)′\n", n);
printf("\n\n\n\t\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
while (1) //循环读出文件里聊天的内容
{
memset(&kl, 0, sizeof(kl));
ssize_t read_bytes = read(fd2, &kl, sizeof(kl));
if (read_bytes == -1)
{
perror("read");
return -1;
}
if (read_bytes == 0)
{
break;
}
ncf[i] = kl;
i++;
}
ncf[i] = '\0';
printf("\n%s\n", ncf);
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
case 'k': //退出
{
userInfo.cmd = exit; //通知服务器 有退出请求
strcpy(userInfo.name, Name);
ret = write(sfd, &userInfo, sizeof(userInfo));
if (ret == -1)
{
perror("write");
return -1;
}
return Exit;
}
case 10: //ENTER键返回刷新界面
{
break;
}
default:
{
system("clear");
printf("\n\n\n\n");
printf("\n\n\t\t请输入a--k之间的选择!\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
}
}
}
int main()
{
int sfd;
char bcf[2];
pthread_t ReadId;
sfd = socket(AF_INET, SOCK_STREAM, 0); //申请新的socket
if (sfd == -1)
{
perror("socket");
return -1;
}
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(struct sockaddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT);
serveraddr.sin_addr.s_addr = inet_addr("192.168.111.128");
ret = connect(sfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr)); //将sfd连接至指定的服务器网络地址 serveraddr
if (ret == -1)
{
perror("connect");
close(sfd);
return -1;
}
Welcome();
while (1)
{
show();
scanf("%s", bcf);
switch (bcf[0])
{
case '1': //注册
{
if (show_reg() == -9)
{
break;
}
else
{
write(sfd, &userInfo, sizeof(userInfo)); //将信息打包发给服务器
memset(&userInfo, 0, sizeof(userInfo));
memset(&userBack, 0, sizeof(userBack));
read(sfd, &userBack, sizeof(userBack)); //接收服务器返回信息
if (userBack.result == reg_success)
{
printf("\n\n\t\t\t\t恭喜您注册成功!\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
}
else if (userBack.result == existing_acc)
{
printf("\n\n\t\t\t\t该账户已被注册!请重新注册!\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
}
break;
}
}
case '2': //登录
{
userInfo.cmd = log;
show_log(&userInfo);
write(sfd, &userInfo, sizeof(struct send)); //将信息打包发给服务器
read(sfd, &userBack, sizeof(userBack)); //接收服务器返回信息
if (userBack.result == log_success)
{
strcpy(Name, userBack.from_name);
LIKES = userBack.likes;
printf("\n\n\t\t\t\t恭喜您登录成功!\n");
sleep(2);
pthread_create(&ReadId, NULL, (void*)Read_from_server, (void*)sfd); //创建线程处理部分请求
pthread_detach(ReadId);
ret = deal_log(sfd);
if (ret == Exit)
{
break;
}
}
else if (userBack.result == error)
{
printf("\n\n\t\t\t\t账号密码错误!请重新登录\n");
sleep(2);
}
else if (userBack.result == logged_acc)
{
printf("\n\n\t\t\t\t此账号已被登录!\n");
sleep(2);
}
break;
}
case '3': //忘记密码
{
char ans[100];
userInfo.cmd = forget; //通知服务器 有忘记密码请求
system("clear");
printf("\n\n\n\n\n\n\t\t请输入您的账号:");
scanf("%s", userInfo.account);
ret = write(sfd, &userInfo, sizeof(userInfo)); //将信息打包发给服务器
if (ret == -1)
{
perror("write");
return -1;
}
ret = read(sfd, &userBack, sizeof(userBack)); //接收服务器返回信息
if (ret == -1)
{
perror("read");
return -1;
}
printf("\n\t\t 问题:%s", userBack.question);
printf("\n\n\t\t请输入答案:");
scanf("%s", ans);
getchar();
if (strcmp(ans, userBack.answer) == 0)
{
printf("\n\n\t\t您的密码是:%s 请妥善保管您的密码`(*∩_∩*)′\n", userBack.passward);
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
else
{
system("clear");
printf("\n\n\n\n\n\n\t\t抱歉,您的答案不对!\n");
printf("\n\n\n\t\t输入ENTER键返回:");
fgets(fan, 20, stdin);
break;
}
}
case '4': //退出
{
system("clear");
return 0;
}
default:
{
system("clear");
printf("\n\n\n\n");
printf("\n\n\t\t请输入1--3之间的选择!\n");
sleep(2);
break;
}
}
}
return 0;
}