/***************************************************************
File Name: client.h
Author: 浮生流年
Function List: main() 主函数
Created Time: 2017年12月12日 星期二 17时16分54秒
**************************************************************/
#ifndef _CHATING_H_
#define _CHATING_H_
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <time.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.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];
struct node *next;
};
typedef struct node Node;
void show_first1();
void show_first2();
void print_info();
int mygetch();
int getpasswd(char *passwd, int size);
int client_creat();
int Register(Userinfo *sendbuf);
int Login(Userinfo *sendbuf);
void login_screen();
void chat_function(int *sockfd, struct sockaddr_in *server_addr);
void *read_from_server(void *arg);
#endif
/***************************************************************
File Name: chat.h
Author: 浮生流年
Function List: main() 主函数
Created Time: 2017年12月12日 星期二 10时10分56秒
**************************************************************/
#include <stdio.h>
#include "client.h"
extern Userinfo RECVBUF;
extern OUT;
extern OUT1;
char time_info[128] = {0};
void time_show()
{
time_t rawtime;
struct tm *timeinfo;
time (&rawtime);
timeinfo = localtime(&rawtime);
printf("时间: %d 年 %d 月 %d 日 %d 时 %d 分 %d 秒\n\n", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
}
char *time_show1()
{
time_t rawtime;
struct tm *timeinfo;
time (&rawtime);
timeinfo = localtime(&rawtime);
sprintf(time_info, "时间: %d 年 %d 月 %d 日 %d 时 %d 分 %d 秒\n\n", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
return time_info;
}
void show()//欢迎界面
{
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 ");
printf("\e[0;37m%s\e[0m","******************\n\n\n");
printf("\t\t\t Author : 浮生流年 \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 ");
printf("\e[0;37m%s\e[0m","******************\n\n\n");
printf("\t\t\t Author : \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 光 ");
printf("\e[0;37m%s\e[0m","******************\n\n\n");
printf("\t\t\t Author : 浮生流年 \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
printf("\e[0;37m%s\e[0m","******************\n\n\n");
printf("\t\t\t Author : \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ## ");
printf("\e[0;37m%s\e[0m","*****************\n\n\n");
printf("\t\t\t Author : 浮生流年 \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ## ");
printf("\e[0;36;1m%s\e[0m","网 ");
printf("\e[0;37m%s\e[0m","*****************\n\n\n");
printf("\t\t\t Author : \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ## ");
printf("\e[0;36;1m%s\e[0m","网 络 ");
printf("\e[0;37m%s\e[0m","*********************\n\n\n");
printf("\t\t\t Author : 浮生流年 \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ## ");
printf("\e[0;36;1m%s\e[0m","网 络 聊 ");
printf("\e[0;37m%s\e[0m","*********************\n\n\n");
printf("\t\t\t Author : \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ## ");
printf("\e[0;36;1m%s\e[0m","网 络 聊 天 ");
printf("\e[0;37m%s\e[0m","*********************\n\n\n");
printf("\t\t\t Author : 浮生流年 \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
usleep(400000);
system("clear");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;33;1m%s\e[0m","###"); time_show();
printf("\t\t\t\e[0;37m%s\e[0m","***************** ");
printf("\e[0;36;1m%s\e[0m","欢 迎 光 临 ");
printf("\e[0;35;1m%s\e[0m"," ## 依 人 恋 春 ## ");
printf("\e[0;36;1m%s\e[0m","网 络 聊 天 室");
printf("\e[0;37m%s\e[0m","*********************\n\n\n");
printf("\t\t\t Author : 浮生流年 \n\n");
printf("\t\t\t\e[0;34;1m%s\e[0m"," ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** \n\n");
printf("\t\t\t\e[0;35;1m%s\e[0m","**************************************************************************************\n\n");
sleep(2);
}
void print_info()//主界面
{
system("clear");
system("tput cup 6 20");
printf("*****************************************************************************************\n");
system("tput cup 7 20");
printf("* *\n");
system("tput cup 8 20");
printf("* #####################* * 依 人 恋 春 * *####################### *\n");
system("tput cup 9 20");
printf("* *\n");
system("tput cup 10 20");
printf("* ********1. 注册帐户******** *\n");
system("tput cup 11 20");
printf("* *\n");
system("tput cup 12 20");
printf("* ********2. 登录帐户******** *\n");
system("tput cup 13 20");
printf("* *\n");
system("tput cup 14 20");
printf("* ********3. 忘记密码******** *\n");
system("tput cup 15 20");
printf("* *\n");
system("tput cup 16 20");
printf("* ********4. 退出平台******** *\n");
system("tput cup 17 20");
printf("* *\n");
system("tput cup 18 20");
printf("*******************************请 输 入 您 的 选 择:************************************\n");
}
void show_first()//开场白
{
system("clear");
system("tput cup 5 84"); printf("\e[0;35;1m%s\e[0m","依\n"); usleep(350000);
system("tput cup 7 84"); printf("\e[0;34;1m%s\e[0m","山\n"); usleep(350000);
system("tput cup 9 84"); printf("\e[0;34;1m%s\e[0m","寄\n"); usleep(350000);
system("tput cup 11 84"); printf("\e[0;34;1m%s\e[0m","水\n"); usleep(350000);
system("tput cup 13 84"); printf("\e[0;34;1m%s\e[0m","似\n"); usleep(350000);
system("tput cup 15 84"); printf("\e[0;34;1m%s\e[0m","浮\n"); usleep(350000);
system("tput cup 17 84"); printf("\e[0;34;1m%s\e[0m","云\n"); usleep(850000);
system("tput cup 5 74"); printf("\e[0;35;1m%s\e[0m","人\n"); usleep(350000);
system("tput cup 7 74"); printf("\e[0;34;1m%s\e[0m","间\n"); usleep(350000);
system("tput cup 9 74"); printf("\e[0;34;1m%s\e[0m","步\n"); usleep(350000);
system("tput cup 11 74"); printf("\e[0;34;1m%s\e[0m","步\n"); usleep(350000);
system("tput cup 13 74"); printf("\e[0;34;1m%s\e[0m","是\n"); usleep(350000);
system("tput cup 15 74"); printf("\e[0;34;1m%s\e[0m","尘\n"); usleep(350000);
system("tput cup 17 74"); printf("\e[0;34;1m%s\e[0m","埃\n"); usleep(850000);
system("tput cup 5 64"); printf("\e[0;35;1m%s\e[0m","恋\n"); usleep(350000);
system("tput cup 7 64"); printf("\e[0;34;1m%s\e[0m","君\n"); usleep(350000);
system("tput cup 9 64"); printf("\e[0;34;1m%s\e[0m","不\n"); usleep(350000);
system("tput cup 11 64"); printf("\e[0;34;1m%s\e[0m","去\n"); usleep(350000);
system("tput cup 13 64"); printf("\e[0;34;1m%s\e[0m","君\n"); usleep(350000);
system("tput cup 15 64"); printf("\e[0;34;1m%s\e[0m","须\n"); usleep(350000);
system("tput cup 17 64"); printf("\e[0;34;1m%s\e[0m","会\n"); usleep(850000);
system("tput cup 5 54"); printf("\e[0;35;1m%s\e[0m","春\n"); usleep(350000);
system("tput cup 7 54"); printf("\e[0;34;1m%s\e[0m","尽\n"); usleep(350000);
system("tput cup 9 54"); printf("\e[0;34;1m%s\e[0m","空\n"); usleep(350000);
system("tput cup 11 54"); printf("\e[0;34;1m%s\e[0m","余\n"); usleep(350000);
system("tput cup 13 54"); printf("\e[0;34;1m%s\e[0m","白\n"); usleep(350000);
system("tput cup 15 54"); printf("\e[0;34;1m%s\e[0m","日\n"); usleep(350000);
system("tput cup 17 54"); printf("\e[0;34;1m%s\e[0m","长\n"); usleep(850000);
system("tput cup 9 44"); printf("\e[0;35;1m%s\e[0m","|\n"); usleep(550000);
system("tput cup 11 44"); printf("\e[0;34;1m%s\e[0m","浮\n"); usleep(550000);
system("tput cup 13 44"); printf("\e[0;34;1m%s\e[0m","生\n"); usleep(550000);
system("tput cup 15 44"); printf("\e[0;34;1m%s\e[0m","流\n"); usleep(550000);
system("tput cup 17 44"); printf("\e[0;34;1m%s\e[0m","年\n"); usleep(550000);
sleep(2);
}
/*void exit()//落幕
{
system(“clear”);
system(“tput cup 5”)
system(“tput “)
}*/
int mygetch()//相当于getch()
{
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;
}
int getpasswd(char *passwd, int size)//获取密码, 同时输出*
{
int c, n = 0;
do
{
c = mygetch();
if (c != '\n' && c != 'r' & c != 127)
{
passwd[n] = c;
printf("*");
n++;
}
else if ((c != '\n' | c != 'r') && c == 127)//判断是否是回车或者是退格
{
if (n > 0)
{
n--;
printf("\b \b");//输出退格
}
}
}while (c != '\n' && c != 'r' && n < (size - 1));
passwd[n] = '\0';//消除一个多余的回车
return n;
}
int client_creat()//创建socket
{
int sockfd;
sockfd = socket(PF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd)
{
perror("socket");
exit(1);
}
return sockfd;
}
int Register(Userinfo *sendbuf)//注册
{
char ch;
char password1[20] = {0};
char password2[20] = {0};
printf("请创建帐号:\n");
scanf("%s", sendbuf->account);
while ((ch = getchar()) != '\n' && (ch != EOF));//清空缓冲区
printf("请设计昵称:\n");
scanf("%s", sendbuf->nickname);
while ((ch = getchar()) != '\n' && (ch != EOF));//清空缓冲区
// printf("%s****\n", sendbuf->nickname);
printf("请输入密码:\n");
getpasswd(password1, 20);
printf("\n请确认密码:\n");
getpasswd(password2, 20);
printf("\n密码找回:请输入您的QQ邮箱!\n");
scanf("%s", sendbuf->qq_email);
while ((ch = getchar()) != '\n' && (ch != EOF));//清空缓冲区
strcpy(sendbuf->moto, "暂无个性签名");
sendbuf->likes = 0;
strcpy(sendbuf->vip, "未开通");
strcpy(sendbuf->administrator, "大众");
strcpy(sendbuf->shut_up, "未禁");
printf("\n正在注册....\n");
sleep(2);
if (strcmp(password1, password2) != 0)
{
printf("密码输入不一致,请重新注册!\n");
memset(sendbuf, 0, sizeof(*sendbuf));
return 0;
}
else
{
strcpy(sendbuf->password, password1);
}
}
int Login(Userinfo *sendbuf)//登录
{
char ch;
// char password[20];
printf("请输入帐号:\n");
scanf("%s", sendbuf->account);
while ((ch = getchar()) != '\n' && ch != EOF);
printf("请输入密码:\n");
getpasswd(sendbuf->password, 20);
// strcpy(sendbuf->password, password);
system("clear");
system("tput cup 11 33 ");
printf("正在登录.......\n");
sleep(2);
}
void online(Userinfo *recvbuf, int *sockfd, struct sockaddr_in *server_addr)//处理在线人数以及在线用户名单的显示函数
{
int ret, i;
Userinfo sendbuf = {0};
bzero(&sendbuf, sizeof(sendbuf));
sendbuf.flag = 7;
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_online_number!!!");
return;
}
int length = sizeof(*server_addr);
ret = recvfrom(*sockfd, recvbuf, sizeof(*recvbuf), 0, (struct sockaddr *)server_addr, &length);
if (ret < 0)
{
perror("sendto_...");
return;
}
}
void login_screen(int *sockfd, struct sockaddr_in *server_addr)//登录界面
{
int i;
Userinfo recvbuf = {0};
bzero(&recvbuf, sizeof(recvbuf));
online(&recvbuf, sockfd, server_addr);
if (!strcmp(RECVBUF.vip, "荣耀会员"))//会员专属界面
{
system("clear");
system("tput cup 0 16"); printf("\e[0;30;7m%s\e[0m","******************************************************************************************\n");
system("tput cup 2 20"); time_show();
system("tput cup 4 20"); printf("昵称:\e[0;34m%s\e[0m 个性签名:\e[0;32;1m%s\e[0m 点赞:\e[0;35;1m%d\e[0m VIP:\e[0;36;1m%s\e[0m 头衔:\e[0;33;1m%s\e[0m\n",RECVBUF.nickname, RECVBUF.moto, RECVBUF.likes, RECVBUF.vip, RECVBUF.administrator);
printf("\n 当前在线人数:\e[0;31;1m%d\e[0m人\n", recvbuf.online_number);
for (i = 0; i < recvbuf.online_number; i++)
{
printf(" \e[0;31m%s\e[0m\n", recvbuf.online_nickname[i]);
}
system("tput cup 6 20"); printf("\e[0;34;1m%s\e[0m","1.私聊\n");
system("tput cup 6 60"); printf("\e[0;34;1m%s\e[0m","2.群聊\n");
system("tput cup 8 20"); printf("\e[0;34;1m%s\e[0m","3.文件传输\n");
system("tput cup 8 60"); printf("\e[0;34;1m%s\e[0m","4.点赞\n");
system("tput cup 10 20"); printf("\e[0;34;1m%s\e[0m","5.修改个性签名\n");
system("tput cup 10 60"); printf("\e[0;34;1m%s\e[0m","6.注册会员\n");
system("tput cup 12 20"); printf("\e[0;34;1m%s\e[0m","7.禁言指定用户(管理员权限)\n");
system("tput cup 12 60"); printf("\e[0;34;1m%s\e[0m","8.全员禁言(管理员权限)\n");
system("tput cup 14 20"); printf("\e[0;34;1m%s\e[0m","9.查看聊天记录\n");
system("tput cup 14 60"); printf("\e[0;34;1m%s\e[0m","10.解禁指定用户(管理员权限)\n");
system("tput cup 16 20"); printf("\e[0;34;1m%s\e[0m","11.全员解禁(管理员权限)\n");
system("tput cup 16 60"); printf("\e[0;34;1m%s\e[0m","12.踢人(管理员权限)\n");
system("tput cup 18 20"); printf("\e[0;34;1m%s\e[0m","13.退出(不终止客户端)\n");
system("tput cup 18 60"); printf("\e[0;34;1m%s\e[0m","14.退出(终止客户端)\n");
system("tput cup 20 16"); printf("\e[0;30;7m%s\e[0m","*********************************请 输 入 您 的 选 择:***********************************\n");
}
else if (!strcmp(RECVBUF.vip, "至尊会员"))//管理员专属界面
{
system("clear");
system("tput cup 0 16"); printf("\e[0;35;7m%s\e[0m","**************************************************************************************************\n");
system("tput cup 2 20"); time_show();
system("tput cup 4 20"); printf("昵称:\e[0;34m%s\e[0m 个性签名:\e[0;32;1m%s\e[0m 点赞:\e[0;35;1m%d\e[0m VIP:\e[0;36;1m%s\e[0m 头衔:\e[0;33;1m%s\e[0m\n",RECVBUF.nickname, RECVBUF.moto, RECVBUF.likes, RECVBUF.vip, RECVBUF.administrator);
printf("\n 当前在线人数:\e[0;31;1m%d\e[0m人\n", recvbuf.online_number);
for (i = 0; i < recvbuf.online_number; i++)
{
printf(" \e[0;31m%s\e[0m\n", recvbuf.online_nickname[i]);
}
system("tput cup 6 20"); printf("\e[0;34;1m%s\e[0m","1.私聊\n");
system("tput cup 6 60"); printf("\e[0;34;1m%s\e[0m","2.群聊\n");
system("tput cup 8 20"); printf("\e[0;34;1m%s\e[0m","3.文件传输\n");
system("tput cup 8 60"); printf("\e[0;34;1m%s\e[0m","4.点赞\n");
system("tput cup 10 20"); printf("\e[0;34;1m%s\e[0m","5.修改个性签名\n");
system("tput cup 10 60"); printf("\e[0;34;1m%s\e[0m","6.注册会员\n");
system("tput cup 12 20"); printf("\e[0;34;1m%s\e[0m","7.禁言指定用户(管理员权限)\n");
system("tput cup 12 60"); printf("\e[0;34;1m%s\e[0m","8.全员禁言(管理员权限)\n");
system("tput cup 14 20"); printf("\e[0;34;1m%s\e[0m","9.查看聊天记录\n");
system("tput cup 14 60"); printf("\e[0;34;1m%s\e[0m","10.解禁指定用户(管理员权限)\n");
system("tput cup 16 20"); printf("\e[0;34;1m%s\e[0m","11.全员解禁(管理员权限)\n");
system("tput cup 16 60"); printf("\e[0;34;1m%s\e[0m","12.踢人(管理员权限)\n");
system("tput cup 18 20"); printf("\e[0;34;1m%s\e[0m","13.退出(不终止客户端)\n");
system("tput cup 18 60"); printf("\e[0;34;1m%s\e[0m","14.退出(终止客户端)\n");
system("tput cup 20 16"); printf("\e[0;35;7m%s\e[0m","*************************************请 输 入 您 的 选 择:***************************************\n");
}
else//普通用户界面
{
system("clear");
time_show();
printf("昵称:%s 个性签名:%s 点赞:* %d * VIP:%s 头衔:%s\n",RECVBUF.nickname, RECVBUF.moto, RECVBUF.likes, RECVBUF.vip, RECVBUF.administrator);
printf("\n\n 当前在线人数:%d人\n", recvbuf.online_number);
for (i = 0; i < recvbuf.online_number; i++)
{
printf(" %s\n", recvbuf.online_nickname[i]);
}
printf("1.私聊\n");
printf("2.群聊\n");
printf("3.文件传输\n");
printf("4.点赞\n");
printf("5.修改个性签名\n");
printf("6.注册会员\n");
printf("7.禁言指定用户(管理员权限)\n");
printf("8.全员禁言(管理员权限)\n");
printf("9.查看聊天记录\n");
printf("10.解禁指定用户(管理员权限)\n");
printf("11.全员解禁(管理员权限)\n");
printf("12.踢人(管理员权限)\n");
printf("13.退出(不终止客户端)\n");
printf("14.退出(终止客户端)\n");
printf("请输入您的选择:\n");
}
}
void show_private_chat()
{
system("clear");
system("tput cup 4 20"); time_show();
printf("######################################################################\n");
printf("# #\n");
printf("# 聊天工具 常用语 常用表情 #\n");
printf("# #\n");
printf("# 1.输入信息 1.气死宝宝了 1. ^_^ #\n");
printf("# #\n");
printf("# 2.选择表情 2.饿死宝宝了 2. >O< #\n");
printf("# #\n");
printf("# 3.日常用语 3.痛死宝宝了 3. >*< #\n");
printf("# #\n");
printf("# 4.确认发送 4.想死宝宝了 4.|*O*| #\n");
printf("# #\n");
printf("# 5.退出私聊 5.冻死宝宝了 5. -_-|| #\n");
printf("# #\n");
printf("######################################################################\n");
printf("# #\n");
printf("################# 请输入您的选择 #################\n");
}
void chat_function(int *sockfd, struct sockaddr_in *server_addr)//娱乐聊天功能
{
char choice[20] = {0};
char pay_confirm[20];
char ch;
char vip[20] = {0};//
char administrator[20] = {0};//
char nickname[20] ={0};//
char shut_up[20] = {0};//
int ret, fd1, length;
strcpy(nickname, RECVBUF.nickname);//这步必须要放在while循环外面,亲测!!!,否则对于一些无效操作
//(已是会员,不是管理员等的操作)昵称while循环会被清空,
Userinfo sendbuf;//重新定义一个结构体变量
//***************************************************************************************************一登录进去就群发上线指令
sendbuf.flag = 21;
strcpy(sendbuf.nickname, RECVBUF.nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_show_info");
return;
}
// bzero(&sendbuf, sizeof(sendbuf));
//***************************************************************************************************
while (1)//本case语句中,sleep两秒的作用是为了保证在下一个循环前,读线程可以运行完毕,局部变量可以被成功赋值!!!
{
if (0 == OUT)//收到被踢信号,下线
{
++OUT;//必须要这步,因为程序没有终止,全局变量需要重新回到1,否则下次上线后会立即下线
return;
}
// sleep(3);//等待接受线程完成,此处与线程函数处的sleep时间是有关系的
bzero(&vip, sizeof(vip));
bzero(&administrator, sizeof(administrator));
bzero(&shut_up, sizeof(shut_up));
strcpy(vip, RECVBUF.vip);//只用这三个而忽略点赞是因为这三个要用来判断是否是会员、管理员和禁言
strcpy(administrator, RECVBUF.administrator);
strcpy(shut_up, RECVBUF.shut_up);
system("clear");
login_screen(sockfd, server_addr);//主界面
// system("tput cup x y");//等界面做好后再定坐标***************************************************
fgets(choice, 20, stdin);
bzero(&sendbuf, sizeof(sendbuf));
switch (atoi(choice))
{
case 0:
{
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(1);
break;
}
case 1://私聊
{
char chat_file_name[128] = {0};//存放聊天文件名
char chat_file_record[4096] = {0};//存放聊天记录
char tmp_record[128] = {0};
char Tmp_record[2048] = {0};
system("clear");
char select[20] = {0};
char select1[20] = {0};
printf("请输入聊天对象的名字:\n"); //等待界面做好后在定坐标*******************************************
scanf("%s", sendbuf.to_nickname);//所要发送消息对象的昵称
while ((ch = getchar()) != '\n' && ch != EOF);
while (1)
{
if (0 == OUT1)//收到退出私聊信号
{
++OUT1;
break;
}
show_private_chat();//私聊界面
fgets(select, 20, stdin);
switch (atoi(&select[0]))
{
case 0:
break;
case 1:
{
// bzero(chat_text, sizeof(chat_text));
// bzero(chat_record, sizeof(chat_record));
// printf("请输入聊天对象的名字:\n"); //等待界面做好后在定坐标*******************************************
// scanf("%s", sendbuf.to_nickname);//所要发送消息对象的昵称
// while ((ch = getchar()) != '\n' && ch != EOF);
printf("请输入您想要说的话:\n");
scanf("%[^\n]", sendbuf.msg);//读入所有不是换行的字符
strcpy(sendbuf.nickname, nickname);//用户自己的昵称
break;
}
case 2://选择表情
{
printf("请选择表情!\n");
scanf("%s", select1);
switch(atoi(&select1[0]))
{
case 1:
strcat(sendbuf.msg, " ^_^ ");
break;
case 2:
strcat(sendbuf.msg, " >O< ");
break;
case 3:
strcat(sendbuf.msg, " >*< ");
break;
case 4:
strcat(sendbuf.msg, " |*O*| ");
break;
case 5:
strcat(sendbuf.msg, " -_-|| ");
}
break;
}
case 3://选择常用语
{
printf("请选择常用语!\n");
scanf("%s", select1);
switch(atoi(&select1[0]))
{
case 1:
strcat(sendbuf.msg, " 气死宝宝了! ");
break;
case 2:
strcat(sendbuf.msg, " 饿死宝宝了! ");
break;
case 3:
strcat(sendbuf.msg, " 痛死宝宝了! ");
break;
case 4:
strcat(sendbuf.msg, " 想死宝宝了! ");
break;
case 5:
strcat(sendbuf.msg, " 冻死宝宝了! ");
break;
}
break;
}
case 4://全部结束后发送消息
{
sendbuf.flag = 4;
if (!strcmp(sendbuf.to_nickname, nickname))//如果所要发送消息的对象是自己
{
bzero(&sendbuf, sizeof(sendbuf));
printf("哼,本服务器不支持自言自语功能!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr,
sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
// bzero(&sendbuf, sizeof(sendbuf));
break;
}
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr,
sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_private_chat!!!");
return;
}
bzero(&tmp_record, sizeof(tmp_record));//先清空
sprintf(tmp_record, "%s%s\n\n", time_show1(), sendbuf.msg);//再赋值
//每次对话先临时保存在中,退出私聊时再一并记录
bzero(&sendbuf.msg, sizeof(sendbuf.msg));//清空sendbuf.msg,否则下次还保留信息
strcat(Tmp_record, tmp_record);//留到第5步退出私聊后清空
sleep(2);
break;
}
case 5:
{
OUT1 = 0;
int fd;
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr,
sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sprintf(chat_file_name, "%s与%s的聊天记录.txt", nickname, sendbuf.to_nickname);
fd = open(chat_file_name, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);
if (-1 == fd)
{
perror("open");
return;
}
sprintf(chat_file_record, "\e[0;34;1m%s对%s发送信息:\e[0m\n\n\n%s\n", nickname, sendbuf.to_nickname, Tmp_record);
ret = write(fd, chat_file_record, strlen(chat_file_record));
if (-1 == ret)
{
perror("write");
return;
}
bzero(&Tmp_record, sizeof(Tmp_record));
bzero(&chat_file_name, sizeof(chat_file_name));
bzero(&chat_file_record, sizeof(chat_file_record));
close(fd);
sleep(2);
}
break;
default:
printf("请您输入正确的选项,谢谢配合!\n");
}//switch
}//while
// sprintf(chat_record,"%s与%s的聊天记录.txt", recvbuf->nickname, sendbuf->nickname);
// fd1 = open(chat_record, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR)
}break;
case 2://群聊
{
if (!strcmp(shut_up, "禁言"))
{
printf("您已被禁言,无此权限!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
}
else
{
system("clear");
printf("请发送消息:\n");
scanf("%s", sendbuf.msg);
while ((ch = getchar()) != '\n' && ch != EOF);
sendbuf.flag = 5;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_group_chat");
break;
}
printf("正在发送......\n");
sleep(2);
}
break;
}
case 3://文件传输
{
int ret;
FILE *fp;
printf("接收方昵称:\n");
scanf("%s", sendbuf.to_nickname);
while ((ch = getchar()) != '\n' && ch != EOF);
if (!strcmp(sendbuf.to_nickname, nickname))
{
printf("本服务器不支持自发自收功能!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
break;
}
strcpy(sendbuf.nickname, nickname);
printf("请选择文件:\n");
scanf("%s", sendbuf.file_name);
sendbuf.flag = 6;
fp = fopen(sendbuf.file_name, "r");
if (NULL == fp)
{
printf("无法打开,该文件不存在!\n");
perror("can not open file\n");
return;
}
ret = fread(sendbuf.file_content, 1, sizeof(sendbuf.file_content), fp);//可能写的不对//读到数组中
if (0 == ret)
{
perror("fread_file_transfer");
return;
}
fclose(fp);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_file_transfer");
return;
}
sleep(2);
}
break;
case 4://点赞
{
system("clear");
sendbuf.flag = 10;
printf("请输入点赞对象昵称:\n");
scanf("%s", sendbuf.to_nickname);
while ((ch = getchar()) != '\n' && ch != EOF);
strcpy(sendbuf.nickname, nickname);
if (!strcmp(nickname, sendbuf.to_nickname))
{
sleep(1);
system("clear");
printf("本服务器不支持自我点赞!\n");
sendbuf.flag = 20;
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
break;
}
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_give_like");
return;
}
printf("正在为您喜爱的用户点赞......\n");
sleep(2);
break;
}
case 5://修改个性签名
{
system("clear");
sendbuf.flag = 11;
printf("请输入您的个性签名:\n");
scanf("%[^\n]", sendbuf.moto);
while ((ch = getchar()) != '\n' && ch != EOF);
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_chang_moto");
return;
}
printf("正在更新您的个性签名, 请稍等片刻!\n");
sleep(2);
break;
}
case 6://注册会员
{
char choice[10] = {0};
if (!strcmp(vip, "荣耀会员"))
{
system("clear");
printf("您已是荣耀会员!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
break;
}
else
{
system("clear");
printf("开通荣耀会员:支付100¥ \n");
printf("立即开通?(y/n)\n");//找人代付?....
scanf("%s", choice);//如果不定义choice,直接用ch ???
if ('y' == choice[0])
{
strcpy(sendbuf.vip, "荣耀会员");
strcpy(sendbuf.nickname, nickname);
sendbuf.flag = 12;
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
break;
}
else//需要else,不可省略,因为任何操作都需要接收信息
{
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
break;
}
}
}
case 7://禁言指定用户(管理员权限)(针对群聊)
{
if (!strcmp(administrator, "大众"))
{
system("clear");
system("tput cup 6 55"); printf("您并非管理人员, 无此权限!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
}
else
{
system("clear");
printf("请您输入禁言对象昵称:\n");
scanf("%s", sendbuf.to_nickname);
if (!strcmp(sendbuf.to_nickname, nickname))
{
system("clear");
system("tput cup 6 55"); printf("无法对自己禁言!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
break;
}
sendbuf.flag = 13;
strcpy(sendbuf.nickname, nickname);
strcpy(sendbuf.administrator, administrator);//传过去用来显示
strcpy(sendbuf.shut_up, "禁言");
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_shut_up_person");
return;
}
}
sleep(2);
break;
}
case 8://全员禁言(针对群聊)
{
if (!strcmp(administrator, "大众"))
{
system("clear");
system("tput cup 6 55"); printf("您并非管理人员, 无此权限!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
}
else
{
sendbuf.flag = 14;
strcpy(sendbuf.nickname, nickname);
strcpy(sendbuf.administrator, administrator);
strcpy(sendbuf.shut_up, "禁言");
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_group_chat");
break;
}
printf("正在发送......\n");
}
sleep(2);
break;
}
case 9://查看聊天记录
{
system("clear");
int fd1, i = 0;
char buf, record[1024] = {0};
char to_nickname[20] = {0};
char chat_name[128] = {0};//聊天文件名
printf("请您输入对方昵称:\n");
scanf("%s", to_nickname);
while ((ch = getchar()) != '\n' && ch != EOF);
sprintf(chat_name, "%s与%s的聊天记录.txt", nickname, to_nickname);
// printf("%s\n", chat_name);//****************************************
fd1 = open(chat_name, O_RDONLY, S_IRUSR | S_IWUSR);
if (-1 == fd1)
{
system("clear");
printf("您与%s暂无聊天记录!\n", to_nickname);
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
break;
}
//********************************************flag = 20!!!
sleep(2);
break;
}
while ((ret = read(fd1, &buf, 1)) != 0)
{
record[i] = buf;
i++;
bzero(&buf, sizeof(buf));
}
record[i] = '\0';
system("clear");
printf("聊天记录:\n%s\n", record);
sleep(10);
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
close(fd1);
sleep(2);
break;
}
case 10://解禁(指定用户)(针对群聊)
{
if (!strcmp(administrator, "大众"))
{
system("clear");
system("tput cup 6 55"); printf("您并非管理人员,无此权限!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
}
else
{
system("clear");
printf("请您输入解禁对象昵称:\n");
scanf("%s", sendbuf.to_nickname);
if (!strcmp(sendbuf.to_nickname, nickname))
{
system("clear");
printf("您是管理人员,无须此操作!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
break;
}
sendbuf.flag = 15;
strcpy(sendbuf.nickname, nickname);
strcpy(sendbuf.administrator, administrator);//传过去用来显示
strcpy(sendbuf.shut_up, "未禁");
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_shut_up1");
return;
}
printf("正在处理......\n");
}
sleep(2);
break;
}
case 11://全员解禁(针对群聊)(针对群聊)
{
if (!strcmp(administrator, "大众"))
{
system("clear");
printf("您并非管理人员, 无此权限!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
}
else
{
sendbuf.flag = 16;
strcpy(sendbuf.nickname, nickname);
strcpy(sendbuf.administrator, administrator);
strcpy(sendbuf.shut_up, "未禁");
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_group_chat1");
break;
}
printf("正在发送......\n");
}
sleep(2);
break;
}
case 12://踢人(强制对方下线)(管理员权限)
{
if (!strcmp(administrator, "大众"))
{
system("clear");
printf("您并非管理人员, 无此权限!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
}
else
{
system("clear");
printf("请您输入对方昵称:\n");
scanf("%s", sendbuf.to_nickname);
printf("duifang:*******%s\n", sendbuf.to_nickname);
while ((ch = getchar()) != '\n' && ch != EOF);
if (!strcmp(sendbuf.to_nickname, nickname))
{
sleep(1);
system("clear");
printf("您是管理员,不得胡闹!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
sleep(2);
break;
}
sendbuf.flag = 17;
strcpy(sendbuf.nickname, nickname);//传管理员昵称
strcpy(sendbuf.administrator, administrator);//传过去用来显示
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_shut_up");
return;
}
printf("正在处理......\n");
}
sleep(2);
break;
}
case 13://退出(下线)(不终止客户端)
{
sendbuf.flag = 18;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_downline");
return;
}
sleep(2);
}
break;
case 14://退出(下线)(终止客户端)
{
strcpy(sendbuf.nickname, nickname);
sendbuf.flag = 19;
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_downline");
return;
}
// exit();//落幕
exit(1);
}
default:
printf("请您输入正确的指令,谢谢配合!\n");
sendbuf.flag = 20;
strcpy(sendbuf.nickname, nickname);
ret = sendto(*sockfd, &sendbuf, sizeof(sendbuf), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));
if (ret < 0)
{
perror("sendto_register_member");
return;
}
break;
}
}
}
``void *read_from_server(void *arg)
{
int ret, length;
struct sockaddr_in server_addr;
length = sizeof(server_addr);
while (1)
{
sleep(3);
bzero(&RECVBUF, sizeof(RECVBUF));
ret = recvfrom(*(int *)arg, &RECVBUF, sizeof(RECVBUF), 0, (struct sockaddr *)&server_addr, &length);
if ( ret < 0)
{
perror("recvfrom_read_from_server");
return;
}
switch (atoi(RECVBUF.buf))
{
case 1://对方向我私聊
{
system("clear");
char fd2;
char chat_file_name1[128] = {0};
char chat_file_record1[4096] = {0};
char tmp_record1[256] = {0};
bzero(&chat_file_name1, sizeof(chat_file_name1));
bzero(&chat_file_record1, sizeof(chat_file_record1));
bzero(&tmp_record1, sizeof(tmp_record1));
sprintf(tmp_record1, "%s%s\n\n", time_show1(), RECVBUF.msg);
sprintf(chat_file_name1, "%s与%s的聊天记录.txt", RECVBUF.nickname, RECVBUF.tmp_name);
fd2 = open(chat_file_name1, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);
if (-1 == fd2)
{
perror("open1");
return;
}
sprintf(chat_file_record1, "\e[0;34;1m%s对%s发送信息:\e[0m\n\n%s\n", RECVBUF.tmp_name, RECVBUF.nickname, tmp_record1);
ret = write(fd2, chat_file_record1, strlen(chat_file_record1));
if (-1 == ret)
{
perror("write1");
return;
}
system("tput cup 6 55"); printf("%s: %s\n", RECVBUF.tmp_name, RECVBUF.msg);//格式为: 对方名称:消息
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
case 2://发送消息成功(包括 私聊 和 群聊 和 文件)
{
system("clear");
system("tput cup 6 55"); printf("发送成功!\n");
//system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
case 3://对方暂未登录
{
system("clear");
system("tput cup 6 55"); printf("很遗憾, 对方暂未登录!\n");
//system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
/* case 4://查看聊天记录
{
}*/
case 5://对方发起群聊
{
system("clear");
system("tput cup 6 55"); printf("%s群发:%s\n", RECVBUF.tmp_name, RECVBUF.msg);
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
case 6://发送消息失败
{
system("clear");
system("tput cup 6 55"); printf("消息发送失败,无其他人在线!\n");
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
}
case 7://接收文件
{
system("clear");
int ret;
FILE *fp1;//之前传输文件处定义过fp,这里文件描述符千万别写成fp,就是说文件描述符必须不一致!!!
char file_name[64] = "复件";
strcat(file_name, RECVBUF.file_name);
fp1 = fopen(file_name, "w");
if (NULL == fp1)
{
perror("can not open file_client_file_transfer") ;
return;
}
ret = fwrite(RECVBUF.file_content, 1, strlen(RECVBUF.file_content), fp1);
if (0 == ret)
{
perror("fread_file_transfer");
return;
}
printf("%s 给您发送文件,恭喜您已成功接收......\n", RECVBUF.tmp_name);
printf("文件内容:%s\n", RECVBUF.file_content);//稍后再写函数控制是否接收等等
system("tput cup 8 55"); printf("请您输入回车键刷新:\n");
fclose(fp1);
//bzero(&RECVBUF, sizeof(RECVBUF));
break;
}
case 8://对方向我点赞
system("clear");
system("tput cup 6 55"); printf("%s为您点赞!\n", RECVBUF.tmp_name);
system("tput cup 8 55"); printf("请您输入回车键刷新:\n");
break;
case 9://点赞成功
system("clear");
system("tput cup 6 55"); printf("点赞成功!\n");
break;
case 10://点赞失败
system("clear");
system("tput cup 6 55"); printf("点赞失败,该用户尚未注册!\n");
// system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 11://修改个性签名成功
system("clear");
system("tput cup 6 55"); printf("恭喜您已成功修改个性签名!\n");
break;
case 12://注册会员成功
system("clear");
system("tput cup 6 55"); printf("恭喜您已成功开通会员!\n");
break;
case 13://指定用户被禁言
system("clear");
system("tput cup 6 55"); printf("很抱歉, 您已被管理员:%s 禁言!\n", RECVBUF.tmp_name);
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 14://指定用户禁言成功
system("clear");
system("tput cup 6 55"); printf("恭喜您成功禁言该用户!\n");
break;
case 15://指定用户禁言失败
system("clear");
system("tput cup 6 55"); printf("该用户并未注册, 无须禁言!\n");
break;
case 16://全员禁言成功
system("clear");
system("tput cup 6 55"); printf("恭喜尊贵的管理员,本群禁言成功!\n");
// system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 17://收到禁言信息
system("clear");
system("tput cup 6 55"); printf("管理员%s:本群禁言中...\n", RECVBUF.tmp_name);
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 18://指定用户被解禁
system("clear");
system("tput cup 6 55"); printf("恭喜您,您已被管理员:%s 解禁!\n", RECVBUF.tmp_name);
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 19://指定用户解禁成功
system("clear");
system("tput cup 6 55"); printf("恭喜您成功解禁该用户!\n");
break;
case 20://指定用户解禁失败
system("clear");
system("tput cup 6 55"); printf("该用户并未注册,无须解禁!\n");
// system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 21://全员解禁成功
system("clear");
system("tput cup 6 55"); printf("恭喜尊贵的管理员,本群解禁成功!\n");
// system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 22://收到解禁信息
system("clear");
system("tput cup 6 55"); printf("管理员%s:本群已解禁!\n", RECVBUF.tmp_name);
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 23://被踢(被强制下线)
system("clear");
OUT = 0;
system("tput cup 6 55"); printf("很遗憾,您已被管理员:%s 强制下线!\n", RECVBUF.tmp_name);
system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 24://踢人(强制对方下线)成功
system("clear");
system("tput cup 6 55"); printf("恭喜尊贵的管理员,对方已被您成功踢下线!\n");
// system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 25://踢人(对方未登录)失败
system("clear");
system("tput cup 6 55"); printf("该用户尚未登录,您的踢人指令无效!\n");
// system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 26://踢人(对方未注册)失败
system("clear");
system("tput cup 6 55"); printf("该用户尚未注册,您的踢人指令无效!\n");
// system("tput cup 8 55"); printf("请您输入回车键返回:\n");
break;
case 27://自己下线成功(不终止客户端)
system("clear");
OUT = 0;
system("tput cup 6 55"); printf("恭喜您已成功下线!\n");
break;
case 28://好友上线通知
system("clear");
system("tput cup 6 55"); printf("您的好友%s已上线\n", RECVBUF.tmp_name);
system("tput cup 8 55"); printf("请您输入回车键刷新:\n");
break;
case 29://好友下线通知
system("clear");
system("tput cup 6 55"); printf("您的好友%s已下线\n", RECVBUF.tmp_name);
system("tput cup 8 55"); printf("请您输入回车键刷新:\n");
break;
}
}
}
/***************************************************************
File Name: testchat.c
Author: 浮生流年
Function List: main() 主函数
Created Time: 2017年12月13日 星期三 16时49分18秒
**************************************************************/
#include <stdio.h>
#include "client.h"
//pthread_t tid[2];
Userinfo RECVBUF;//全局变量
int OUT = 1;//全局变量,1保持聊天状态,0退出聊天界面
int OUT1 = 1;//全局变量,1保持聊天表情,常用语,聊天说话,0退出
//char time_info[128];//必须要全局变量,否则提示出错
int main()
{
Userinfo Sendbuf;//定义结构体变量client
// Userinfo Recvbuf;
char choice[10] = {0};
int sockfd, ret;
struct sockaddr_in server_addr;
pthread_t tid;
/* H_node *head = (H_node *)malloc(sizeof(H_node));
if (NULL == head)
{
printf("Malloc Failure !\n");
return;
}
head->next = NULL;*/
sockfd = client_creat();//创建socket
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = PORT;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
show_first();
show();
int length = sizeof(server_addr);
while (1)
{
print_info();
scanf("%s", choice);
switch (atoi(&choice[0]))
{
case 1://注册
{
bzero(&Sendbuf, sizeof(Sendbuf));
if (Register(&Sendbuf) == 0)
{
break;
}
else
{
Sendbuf.flag = 1;
ret = sendto(sockfd, &Sendbuf, sizeof(Sendbuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret < 0)
{
perror("sendto_register");
exit(1);
}
bzero(&RECVBUF, sizeof(RECVBUF));
ret = recvfrom(sockfd, &RECVBUF, sizeof(RECVBUF), 0, (struct sockaddr *)&server_addr, &length);
if (ret < 0)
{
perror("recvfrom_register");
exit(1);
}
if (strcmp(RECVBUF.buf, "注册成功!") == 0)
{
printf("恭喜您注册成功!\n");
sleep(2);
break;
}
else if (strcmp(RECVBUF.buf, "帐号已存在!") == 0)
{
printf("该帐户已被注册, 请重新注册!\n");
sleep(2);
break;
}
}
}
case 2://登录
{
bzero(&Sendbuf, sizeof(Sendbuf));
Login(&Sendbuf);
Sendbuf.flag = 2;
ret = sendto(sockfd, &Sendbuf, sizeof(Sendbuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
if ( ret < 0)
{
perror("sendto_login");
exit(1);
}
bzero(&Sendbuf, sizeof(Sendbuf));
ret = recvfrom(sockfd, &RECVBUF, sizeof(RECVBUF), 0, (struct sockaddr *)&server_addr, &length);
if (ret < 0)
{
perror("recvfrom_login");
exit(1);
}
if (!strcmp(RECVBUF.buf, "登录成功!"))//Recvbuf中保存了服务器发送的调用数据库中的本帐号信息
{
printf("恭喜您登录成功!\n");
printf("%s\n", RECVBUF.nickname);
// bzero(&Recvbuf, sizeof(Recvbuf));//先写登录界面,待会再处理
sleep(2);
// login_screen(&Recvbuf);//登录界面
// bzero(&Recvbuf, sizeof(Recvbuf));
pthread_create(&tid, NULL, read_from_server, (void *)&sockfd);//开起一个读线程,专门用来接收消息
pthread_detach(tid);
chat_function(&sockfd, &server_addr);
}
else if (!strcmp(RECVBUF.buf, "该帐号已在其他地方登录!"))
{
printf("该帐号已在其他地方登录!\n");
bzero(&RECVBUF, sizeof(RECVBUF));
break;
}
else if (!strcmp(RECVBUF.buf, "帐号或密码错误"))
{
printf("您输入的帐号或密码错误,请重新登录!\n");
sleep(2);
bzero(&RECVBUF, sizeof(RECVBUF));
}
break;
}
case 3://忘记密码
{
system("clear");
bzero(&Sendbuf, sizeof(Sendbuf));
Sendbuf.flag = 3;
printf("请输入您的QQ邮箱,我们将通过此邮箱发送您所需要的信息,请您注意查收!\n");
scanf("%s", Sendbuf.qq_email);
ret = sendto(sockfd, &Sendbuf, sizeof(Sendbuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret < 0)
{
perror("sendto_forgot_password");
exit(1);
}
ret = recvfrom(sockfd, &RECVBUF, sizeof(RECVBUF), 0, (struct sockaddr *)&server_addr, &length);
if (ret < 0)
{
perror("recvfrom_forgot_password");
exit(1);
}
sleep(2);
system("clear");
if (!strcmp(RECVBUF.buf, "忘记密码"))
{
printf("密码已发送至您的邮箱,请前往查收!\n\n\n");
printf("正在为您跳转......\n\n");
sleep(2);
system("clear");
printf("已使用快捷方式登陆您的邮箱......\n");
sleep(1);
printf("************请妥善保管************\n");
printf("* *\n");
printf("* 帐号:%s *\n", RECVBUF.account);
printf("* *\n");
printf("* 密码:%s *\n", RECVBUF.password);
printf("* *\n");
printf("**********************************\n");
sleep(3);
break;
show_first();
}
else
{
printf("该帐号尚未注册!\n");
break;
}
}
case 4:
exit(1);
break;
default:
printf("未知操作。。。。。。\n");
}
}
close(sockfd);
return 0;
}