/***************************************************************

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();//创建socketbzero(&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;
}

UDP网络聊天室(客户端 )相关推荐

  1. qt linux 聊天室,Qt网络聊天室客户端

    原创 DeRoy 2020-08-15 收录于话题 #QT项目实战 11个 点击蓝字关注我们 基于Qt网络编程客户端 QTcpSocketQTcpSocket 类提供一个TCP套接字TCP是一个面向连 ...

  2. 【基于UDP的网络聊天室】

    总结下近期写的小项目,在学习中同时积累解决问题的经验,以及真正的项目中解决问题的思路,如有不合理地方,请多指教! 一.项目名称 基于UDP的网络聊天室 二.功能 1.当有新用户登录时,其他在线用户可以 ...

  3. 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器

    早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...

  4. [NUAA]Python用UDP协议建立带有私聊功能的网络聊天室-建立聊天工具

    文章目录 前言 1.网络聊天室的基本架构是什么? 1.1 客户端和服务器的架构 1.2 通信协议的选择以及多线程通信 1.2.1 多线程通信 1.2.2 通信协议选择 1.3 前后端功能设计思路 1. ...

  5. 基于UDP的网络聊天室网络编程0811作业-洪庆乐

    项目:基于UDP的网络聊天室 功能:1.服务器日志系统,且可以查看(实现) 2.有用户,其他用户收到这个人登入信息(实现) 3.群发消息(实现) 4.如果有用户下线,其他用户收到下线消息(实现) 5. ...

  6. Linux网络编程--聊天室客户端程序

    聊天室客户端程序 #define _GNU_SOURCE 1 #include <sys/types.h> #include <sys/socket.h> #include & ...

  7. python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...

    实验名称: 网络聊天室 功能: i. 掌握利用Socket进行编程的技术 ii. 掌握多线程技术,保证双方可以同时发送 iii. 建立聊天工具 iv. 可以和单人聊天 v. 可以和多个人同时进行聊天 ...

  8. 网络聊天室的技术与发展

    网络聊天室的技术与发展 摘要: 此文讲述了视频聊天网站相关的技术.发展过程.从客户那里了解到了很多的视频聊天相关的需求,经过自己长时间对视频聊天网站运营模式.盈利模式.系统架构以及相关技术的研究,写下 ...

  9. 网络聊天室(linux,java,Android)

    如果追忆会荡起涟漪,那么今天的秋红落叶和晴空万里都归你 艾恩凝 个人博客 https://aeneag.xyz/ 前几天在他人那里看到了网络聊天室的文章,想起了自己几年前也认认真真写过相关编程,实现了 ...

  10. 网络聊天室(Java)

    摘要 本文阐述了基于Linux环境,Java语言实现的基本聊天室功能,涉及Linux下的Java 语言的Socket编程.以及Java语言的多线程编程. 关键字 Linux         Java  ...

最新文章

  1. python音频聚类_利用python的KMeans和PCA包实现聚类算法
  2. 解决Linux最大进程数和最大文件句柄问题
  3. 用Python解“二分法求多项式单根 ”题
  4. OpenCV 霍夫圆检测
  5. C# .NET 根据Url链接保存Image图片到本地磁盘
  6. 微软开源故事 | 开启 .NET 开源革命
  7. Apache Camel –从头开始开发应用程序(第1部分/第2部分)
  8. centos6.5lamp环境搭建
  9. 计蒜客 蒜头君的数轴
  10. oracle监听启动接着关闭,Oracle监听启动后自动关闭
  11. 第二季-专题8-不用内存怎么行
  12. 2022Adobe全套资源|PS PR AE
  13. 《知行合一 王阳明》读书笔记
  14. 优动漫PAINT新建文件
  15. 【深度学习】实时人眼 瞳孔追踪 系统
  16. GPS时钟的详细说明
  17. ChatGpt真的会取代程序员吗,有点过分担心了
  18. 第28届奥运会奖牌榜
  19. 企业如何与客户建立良好的客户关系
  20. K均值聚类以及matlab实现

热门文章

  1. EMQ「边缘-工厂-云」异常事件告警处理架构
  2. 日本之行三——细节看东京
  3. 记录一下第一次安装和配置Nginx
  4. react生命周期新旧对比(图示)
  5. 矩阵的幂c语言中文网,矩阵的幂演算
  6. SLAM代码之svo代码分析
  7. 程序员记笔记的重要性与技巧
  8. DLL的灾难 --- DEBUG与RELEASE版本不能交叉调用
  9. 空间顶点到平面的距离计算的证明及其源码
  10. 英语总结系列:爽约Pauel叔十五天