头文件
#ifndef _SERVER_H_
#define _SERVER_H_
#define color_none "\033[0m"
#define color_red "\033[1;5;31m"
#define color_purple "\033[1;5;35m"
#define color_green "\033[1;5;32m"
#define color_yellow "\033[1;5;33m"
#define PORT 8888
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
pthread_t tid;
struct info
{
int option;
int sign;
int num;
int chat;
char username[20];
char passward[20];
char name[20];
char question[20];
char key[20];
char buf[10000];
char n[10][10];
int online_num;
char recvname[20];
char filename[20];
char member[10];
int speak;
int offline;
char agree[10];
};
struct link
{
char id[20];
char name[20];
int fd;
int port;
char member[10];
int speak;
int offline;
struct link *next;
};
typedef struct link Link;
typedef Link *link_list;
void signalhandler(void);
void show();
void PrintInfo();
int regis(int sockfd);
int log_in(int sockfd);
int find(int sockfd);
int Exit(int sockfd);
int chat(int sockfd);
#endif
主程序
#include "chatroom.h"
int main(int argc, char *argv[])
{
int sockfd, ret;
struct sockaddr_in server_addr;
char num[10] = {0};
char enter[10] = {0};
struct info sendbuf;
struct info recvbuf;
signalhandler();
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if(-1 == sockfd)
{
perror("socket");
exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = PF_INET;
server_addr.sin_port =htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(-1 == ret)
{
perror("connect");
exit(1);
}
show();
while(1)
{
PrintInfo();
fgets(num, 2, stdin);
switch(num[0])
{
case '1':
{
ret = log_in(sockfd);
if(ret == -1)
{
printf("\n\n\t\t\t\t\t账号错误!\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else if(ret == -2)
{
printf("\n\n\t\t\t\t\t密码错误!\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else if(ret == -3)
{
printf("\n\n\t\t\t\t\t该账号已登录!\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else if(ret == 0)
{
ret = chat(sockfd);
}
break;
}
case '2':
{
ret = regis(sockfd);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
if(recvbuf.sign == 2)
{
system("clear");
printf("\n\n\t\t\t\t\t该账号已存在,注册失败\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else if(recvbuf.sign == 1)
{
system("clear");
printf("\n\n\t\t\t\t\t恭喜你,注册成功\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
break;
}
case '3':
{
ret = find(sockfd);
if(-1 == ret)
{
printf("\n\n\t\t\t\t\t没有这个账号!\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else if(-2 == ret)
{
printf("\n\n\t\t\t\t\t答案错误!\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
else if(0 == ret)
{
printf("\n\n\t\t\t\t\t恭喜你,密码修改成功!\n");
fgets(enter, 20, stdin);
}
break;
}
case '4':
{
Exit(sockfd);
close(sockfd);
exit(1);
}
case 10:
{
system("clear");
break;
}
default:
{
printf(color_red"\t\t\t\t\t**Unkown Input!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
break;
}
}
}
return 0;
}
接口
#include "chatroom.h"
void *receive(void *arg)
{
char n[10][10] = {0};
int i = 0;
struct info recvbuf;
struct info sendbuf;
int ret, oldtype;
time_t now;
struct tm *tm_now;
char buf[10000];
char filename[100];
char enter[10] = {0};
int fd;
pthread_t pt;
pthread_detach(pthread_self());
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
while(1)
{
memset(&recvbuf, 0, sizeof(recvbuf));
memset(&sendbuf, 0, sizeof(sendbuf));
recv(*(int *)arg, &recvbuf, sizeof(recvbuf), 0);
switch(recvbuf.sign)
{
case (1):
{
system("clear");
printf("\n\n\t\t\t\t\t
printf("\n\t\t\t\t\t请按y接受 \n");
break;
}
case (2):
{
memset(buf, 0, sizeof(buf));
memset(filename, 0, sizeof(filename));
printf("\t\t\t\t\t\trecv:
now = time(NULL);
tm_now = localtime(&now);
sprintf(filename, "
fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
sprintf(buf, "
write(fd, buf, strlen(buf));
close(fd);
break;
}
case (3):
{
system("clear");
printf("\n\n\n\n\n\t\t\t\t\t
printf("
now = time(NULL);
tm_now = localtime(&now);
sprintf(filename, "
fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
sprintf(buf, "
write(fd, buf, strlen(buf));
close(fd);
fgets(enter, 20, stdin);
break;
}
case (4):
{
system("clear");
printf("\n\n\n\n\n\t\t\t\t\t
break;
}
case (5):
{
system("clear");
printf("\n\n\n\n\n\t\t\t\t\t
fd = open(recvbuf.filename, O_RDWR | O_CREAT| O_APPEND, 666);
write(fd, recvbuf.buf, strlen(recvbuf.buf));
close(fd);
break;
}
case (6):
{
system("clear");
printf("\n\n\n\n\n\t\t\t\t\t
printf("\n\n\t\t\t\t\t接收完成!!!\n");
fgets(enter, 20, stdin);
break;
}
case (-1):
{
system("clear");
printf("\n\n\n\n\n\t\t\t\t\t你被
printf("\n\n\t\t\t\t\t你可以开通会员解除禁言\n");
fgets(enter, 20, stdin);
break;
}
case (-2):
{
system("clear");
printf("\n\n\n\n\n\t\t\t\t\t你被
fgets(enter, 20, stdin);
return 0;
}
}
}
}
void signalhandler(void)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGINT);
sigaddset(&sigset,SIGQUIT);
sigprocmask(SIG_BLOCK, &sigset, NULL);
}
void show()
{
char enter[10];
system("clear");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t##############################################\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#***************");
printf(color_red"欢迎进入聊天室"color_none);
printf("***************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#*************");
printf(color_purple"请按回车键进入界面"color_none);
printf("*************#\n") ;
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t##############################################\n");
fgets(enter, 2, stdin);
if (enter[0] == 10)
{
system("clear");
}
}
void PrintInfo()
{
system("clear");
printf("\n\n\t\t\t\t\t##############################################\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#*************** 1.登录 *****************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#*************** 2.注册 *****************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#*************** 3.找回密码 *************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#*************** 4.退出 ****************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t#****************");
printf(color_red"按回车键清屏"color_none);
printf("****************#\n");
printf("\t\t\t\t\t#********************************************#\n");
printf("\t\t\t\t\t# #\n");
printf("\t\t\t\t\t#请输入选项:");
}
int regis(int sockfd) //注册函数
{
system("clear");
struct info sendbuf;
int ret;
memset(&sendbuf, 0, sizeof(sendbuf));
sendbuf.num = 2;
printf("\n\n\n\t\t\t\t\t请输入账号:");
scanf("
getchar();
printf("\n\t\t\t\t\t请输入密码:");
scanf("
getchar();
printf("\n\t\t\t\t\t请输入昵称:");
scanf("
getchar();
printf("\n\t\t\t\t\t请输入密保问题:");
scanf("
getchar();
printf("\n\t\t\t\t\t请输入密保答案:");
scanf("
getchar();
strcpy(sendbuf.member, "n");
printf("\n\t\t\t\t\t正在注册...\n");
sleep(1);
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
if(-1 == ret)
{
perror("send");
return 0;
}
return 1;
}
int log_in(int sockfd) //登录函数
{
system("clear");
struct info sendbuf;
struct info recvbuf;
int ret;
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 1;
sendbuf.option = 0;
printf("\n\n\n\n\n\n\n\t\t\t\t\t账号:");
scanf("
getchar();
printf("\n\n\t\t\t\t\t密码:");
scanf("
getchar();
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
if(recvbuf.sign == 1)
{
return -1;
}
else if(recvbuf.sign == 2)
{
return -2;
}
else if(recvbuf.sign == 3)
{
return 0;
}
else if(recvbuf.sign == 4)
{
return -3;
}
return 1;
}
int find(int sockfd)
{
struct info sendbuf;
struct info recvbuf;
char id[100] = {0};
int ret;
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 3;
sendbuf.sign = 1; //传输账号
printf("\n\n\n\t\t\t\t\t请输入账号:");
scanf("
strcpy(id, sendbuf.username);
getchar();
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
if(recvbuf.sign == 1)
{
return -1;
}
else if(recvbuf.sign == 2)
{
memset(&sendbuf, 0, sizeof(sendbuf));
sendbuf.num = 3;
sendbuf.sign = 2; //传输答案
printf("\n\t\t\t\t\t密保问题:
printf("\n\t\t\t\t\t请输入密保答案:");
scanf("
getchar();
strcpy(sendbuf.username, id);
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
memset(&recvbuf, 0, sizeof(recvbuf));
recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
if(recvbuf.sign == 1)
{
return -2;
}
else if(recvbuf.sign == 2)
{
memset(&sendbuf, 0, sizeof(sendbuf));
sendbuf.num = 3;
sendbuf.sign = 3; //传输新密码
strcpy(sendbuf.username, id);
printf("\n\t\t\t\t\t请输入新密码:");
scanf("
getchar();
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
memset(&recvbuf, 0, sizeof(recvbuf));
recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
if(recvbuf.sign == 1)
{
return 0;
}
}
}
}
int Exit(int sockfd)
{
struct info sendbuf;
memset(&sendbuf, 0, sizeof(sendbuf));
sendbuf.num = 4;
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
return 1;
}
int chat(int sockfd) //聊天界面
{
int ret;
char enter[10] = {0};
char num[10] = {0};
char opt[10] = {0};
char name[10] = {0};
char filename[100] = {0};
int fd;
struct info sendbuf;
struct info recvbuf;
time_t now;
struct tm *tm_now;
char buf[10000];
int i = 0;
while(1)
{
system("clear");
printf("\n\n\n\n\t\t\t\t正在刷新...\n");
sleep(1);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
memset(filename, 0, sizeof(filename));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
system("clear");
if(recvbuf.offline == 1)
{
memset(&sendbuf, 0, sizeof(sendbuf));
pthread_cancel(tid);
sendbuf.num = 5; //处理聊天
sendbuf.option = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
return 0;
}
printf("\n\n\t\t\t\t\t\t\t\t\t\t\t\t*****");
if(recvbuf.speak == 1)
{
printf(" 状态:");
printf(color_red"禁言\n"color_none);
}
else
{
printf(" 状态:");
printf(color_green"在线\n"color_none);
}
printf("\t\t\t\t\t\t\t\t\t\t\t\t(^o^)");
printf(" 昵称:
if(strcmp(recvbuf.member, "y") == 0)
{
printf(color_yellow" 会员用户\n"color_none);
}
else
{
printf(" 普通用户\n");
}
printf("\t\t\t\t\t\t\t\t\t\t\t\t*****");
printf(" 在线人数:
printf("\t\t\t\t\t\t\t\t\t\t\t\t1: 私聊\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t2: 群聊\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t3: 发送文件\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t4: 开通会员\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t5: 禁言(需开通会员)\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t6: 解除禁言(需开通会员)\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t7: 踢人(需开通会员)\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t8: 查看在线人数\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t9: 查看聊天记录\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t0: 退出登录\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t按回车刷新\n\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t请输入:");
ret = pthread_create(&tid, NULL, receive, (void *)&sockfd);
fgets(num, 2, stdin);
switch(num[0])
{
case '1':
{
system("clear");
pthread_cancel(tid);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
for(i = 0; i < recvbuf.online_num; i++)
{
if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
else
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
}
getchar();
if(recvbuf.speak == 1)
{
printf("\n\n\n\t\t\t\t\t\t你已被禁言,不能聊天!!!\n");
printf("\n\n\n\n\t\t\t\t\t\t请按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
memset(&sendbuf, 0, sizeof(sendbuf));
memset(name, 0, sizeof(name));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = 10; //发起聊天
printf("\n\n\n\n\t\t\t\t\t你想向谁发起聊天:");
scanf("
getchar();
if(strcmp(recvbuf.name, name) == 0)
{
printf("\n\n\t\t\t\t\t你不能与自己聊天哦\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
strcpy(sendbuf.name, name);
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
if(recvbuf.sign == 1)
{
printf("\n\t\t\t\t此用户不在线或者没有这个用户\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
printf("\n\t\t\t\t请等待该用户接受...\n");
sleep(3);
system("clear");
printf("*******************************************************\n");
printf("\t与
printf("(输入“bye“退出聊天)\n");
ret = pthread_create(&tid, NULL, receive, (void *)&sockfd);
while(1)
{
memset(&sendbuf, 0, sizeof(sendbuf));
memset(buf, 0, sizeof(buf));
memset(filename, 0, sizeof(filename));
strcpy(sendbuf.name, name);
sendbuf.num = 5; //处理聊天
sendbuf.option = 1;
sendbuf.chat = 1;
printf("");
scanf("
getchar();
if(strncmp(sendbuf.buf, "bye", 3) == 0)
{
pthread_cancel(tid);
break;
}
now = time(NULL);
tm_now = localtime(&now);
sprintf(filename, "
fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
sprintf(buf, "
write(fd, buf, strlen(buf));
close(fd);
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
}
break;
}
case '2':
{
system("clear");
pthread_cancel(tid);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
for(i = 0; i < recvbuf.online_num; i++)
{
if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
else
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
}
getchar();
if(recvbuf.speak == 1)
{
printf("\n\n\n\n\t\t\t\t你已被禁言,不能聊天\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
memset(&sendbuf, 0, sizeof(sendbuf));
sendbuf.num = 5;
sendbuf.option = 2;
printf("\n\n\t\t\t\t请输入你想说的话:");
scanf("
getchar();
printf("\n\n\t\t\t\t正在发送...\n");
sleep(1);
now = time(NULL);
tm_now = localtime(&now);
sprintf(filename, "
fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
sprintf(buf, "
write(fd, buf, strlen(buf));
close(fd);
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
printf("\n\n\t\t\t\t发送成功\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
case '3':
{
pthread_cancel(tid);
system("clear");
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
for(i = 0; i < recvbuf.online_num; i++)
{
if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
else
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
}
memset(&sendbuf, 0, sizeof(sendbuf));
sendbuf.num = 5;
sendbuf.option = 3;
printf("\n\n\t\t\t\t你想向谁发送:");
scanf("
getchar();
if(strcmp(recvbuf.name, sendbuf.name) == 0)
{
printf("\n\n\t\t\t\t\t你不能给自己发送文件哦\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
printf("\n\t\t\t\t请选择该文件夹中的文件:");
scanf("
getchar();
strcpy(sendbuf.filename, filename);
fd = open(filename, O_RDONLY);
if(-1 == fd)
{
printf("\n\t\t\t\t没有这个文件\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
sendbuf.sign = 1;
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
while((ret = read(fd, sendbuf.buf, sizeof(sendbuf.buf))) > 0)
{
sendbuf.sign = 2;
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
usleep(1000);
}
close(fd);
printf("\n\n\t\t\t\t正在发送...\n");
sleep(1);
sendbuf.sign = 3;
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
printf("\n\t\t\t\t发送成功\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
case '4':
{
system("clear");
pthread_cancel(tid);
memset(&sendbuf, 0, sizeof(sendbuf));
getchar();
if(strcmp(recvbuf.member, "y") == 0)
{
printf("你已经是会员了\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
printf("是否支付 20RMB 成为会员?\n");
printf("1:是\n");
printf("2:否\n");
fgets(opt, 2, stdin);
switch(opt[0])
{
case '1':
{
getchar();
printf("支付完成,恭喜你成为会员\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
sendbuf.num = 5;
sendbuf.option = 4;
strcpy(sendbuf.member, "y");
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
fgets(enter, 20, stdin);
break;
}
case '2':
{
getchar();
printf("很遗憾,你放弃了成为会员的机会\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
}
break;
}
case '5':
{
system("clear");
pthread_cancel(tid);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
for(i = 0; i < recvbuf.online_num; i++)
{
if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
else
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
}
memset(&sendbuf, 0, sizeof(sendbuf));
getchar();
if(strcmp(recvbuf.member, "n") == 0)
{
printf("\n\n\t\t\t\t你还不是会员,不能禁言\n");
printf("\t\t\t\t快去开通会员吧\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
printf("\n\n\t\t\t\t你想禁言谁:");
scanf("
getchar();
if(strcmp(sendbuf.name, recvbuf.name) == 0)
{
printf("\n\n\t\t\t\t你不能禁言自己哦\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
sendbuf.num = 5;
sendbuf.option = 5;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
memset(&recvbuf, 0, sizeof(recvbuf));
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
if(recvbuf.sign == 1)
{
printf("\n\t\t\t\t此用户不在线或者没有这个用户\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
else if(recvbuf.sign == 2)
{
printf("\n\n\t\t\t\t此用户已被禁言,无法继续禁言\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
else if(recvbuf.sign == 3)
{
printf("\n\n\t\t\t\t恭喜你,禁言成功\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
}
case '6':
{
system("clear");
pthread_cancel(tid);
memset(&sendbuf, 0, sizeof(sendbuf));
getchar();
if(recvbuf.speak != 1)
{
printf("\n\t\t\t\t你没有被禁言\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
else if(recvbuf.speak == 1)
{
if(strcmp(recvbuf.member, "n") == 0)
{
printf("\n\t\t\t\t你还不是会员,不能解除禁言\n");
printf("\t\t\t\t快去开通会员吧\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
else if(strcmp(recvbuf.member, "y") == 0)
{
sendbuf.num = 5;
sendbuf.option = 6;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
printf("\n\n\n\n\t\t\t\t恭喜你成功解除禁言!\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
}
}
case '7':
{
system("clear");
pthread_cancel(tid);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
for(i = 0; i < recvbuf.online_num; i++)
{
if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
else
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
}
memset(&sendbuf, 0, sizeof(sendbuf));
getchar();
if(strcmp(recvbuf.member, "n") == 0)
{
printf("\n\t\t\t\t你还不是会员,不能踢人\n");
printf("\t\t\t\t快去开通会员吧\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
printf("\n\t\t\t\t你想踢谁:");
scanf("
getchar();
if(strcmp(sendbuf.name, recvbuf.name) == 0)
{
printf("\n\t\t\t\t你不能踢自己哦\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
sendbuf.num = 5;
sendbuf.option = 7;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
memset(&recvbuf, 0, sizeof(recvbuf));
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
if(recvbuf.sign == 1)
{
printf("\n\t\t\t\t此用户不在线或者没有这个用户\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
else if(recvbuf.sign == 2)
{
printf("\n\t\t\t\t此用户已被你踢下线\n");
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
}
case '8':
{
system("clear");
pthread_cancel(tid);
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
getchar();
printf("\t\t\t\t\t\t\t\t\t\t\t\t在线用户\n");
for(i = 0; i < recvbuf.online_num; i++)
{
if(strcmp(recvbuf.name, recvbuf.n[i]) == 0)
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
else
{
printf("\t\t\t\t\t\t\t\t\t\t\t\t
}
}
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
case '9':
{
pthread_cancel(tid);
system("clear");
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
printf("\t\t\t\t\t\t\t\t\t\t\t\t
getchar();
printf("\n\t\t\t\t1.查询私聊记录\n");
printf("\n\t\t\t\t2.查询群聊记录\n");
printf("\n\t\t\t\t请输入:");
fgets(opt, 2, stdin);
switch(opt[0])
{
case'1':
{
printf("\t\t\t\t你想查看与谁的聊天记录:");
scanf("
getchar();
sprintf(filename, "
fd = open(filename, O_RDONLY);
if (ret == -1)
{
printf("\n\t\t\t\t没有记录\n");
}
while(1)
{
memset(buf, 0, sizeof(buf));
ret = read(fd, buf, sizeof(buf));
if(ret == 0)
{
close(fd);
break;
}
printf("
}
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
case'2':
{
getchar();
sprintf(filename, "
fd = open(filename, O_RDONLY);
if (ret == -1)
{
printf("\n\t\t\t\t没有记录\n");
}
while(1)
{
memset(buf, 0, sizeof(buf));
ret = read(fd, buf, sizeof(buf));
if(ret == 0)
{
close(fd);
break;
}
printf("
}
printf("\n\n\n\t\t\t\t\t按回车键返回\n");
fgets(enter, 20, stdin);
break;
}
}
break;
}
case 'y':
{
pthread_cancel(tid);
printf("\n\n\t\t\t\t\t请输入对方名字:");
scanf("
getchar();
memset(&sendbuf, 0, sizeof(sendbuf));
memset(&recvbuf, 0, sizeof(recvbuf));
sendbuf.num = 5;
sendbuf.option = 1;
sendbuf.chat = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
ret = recv(sockfd, &recvbuf, sizeof(recvbuf), 0);
system("clear");
printf("*******************************************************\n");
printf("\t与
printf("(输入“bye“退出聊天)\n");
ret = pthread_create(&tid, NULL, receive, (void *)&sockfd);
while(1)
{
memset(&sendbuf, 0, sizeof(sendbuf));
memset(filename, 0, sizeof(filename));
memset(buf, 0, sizeof(buf));
strcpy(sendbuf.name, name);
sendbuf.num = 5; //处理聊天
sendbuf.option = 1;
sendbuf.chat = 1;
printf("");
scanf("
getchar();
if(strncmp(sendbuf.buf, "bye", 3) == 0)
{
pthread_cancel(tid);
break;
}
now = time(NULL);
tm_now = localtime(&now);
sprintf(filename, "
fd = open(filename, O_RDWR | O_CREAT| O_APPEND, 666);
sprintf(buf, "
write(fd, buf, strlen(buf));
close(fd);
send(sockfd, &sendbuf, sizeof(sendbuf), 0);
}
break;
}
case '0':
{
getchar();
memset(&sendbuf, 0, sizeof(sendbuf));
pthread_cancel(tid);
sendbuf.num = 5; //处理聊天
sendbuf.option = -1;
ret = send(sockfd, &sendbuf, sizeof(sendbuf), 0);
return 0;
}
case 10: //回车键
{
pthread_cancel(tid);
break;
}
default:
{
pthread_cancel(tid);
printf(color_red"\t\t\t\t\t**Unkown Input!\n"color_none);
printf("\t\t\t\t\t \n");
printf("\t\t\t\t\t*************请按回车键进入界面*************\n");
fgets(enter, 20, stdin);
break;
}
}
}
return 0;
}