#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <time.h>
#define PORT 9071//定义的端口号为 9071
#define BUFF_MAX 1024//缓冲器的最大长度
int flag = 0;//用来标记用户是否登录
int msg = 1;//用来控制信息发送
int vsr = 0;//用来控制超级管理员登录
int stp = 0;//用来控制禁言与解禁
/*<普通用户>*/
#define HELP 1 //帮助信息显示
#define LOG 2 //登录
#define REG 3 //注册
#define PTO 4 //悄悄话
#define CTO 5 //群发消息
#define VIM 6 //查看在线用户
#define VOM 7 //查看所有用户
#define CAT 8 //查看聊天历史记录
#define FAC 9 //特殊表情
#define ESC 10 //退出
/*<超级管理员>*/
#define KIC 11 // 踢人
#define SCL 12 //禁言
#define RCL 13 //撤销禁言
int cilnsock_fd;//定义一个全局变量来保存客户端sock地址
pthread_mutex_t mutex;//定义一个互斥锁在多线程中使用
struct man //存放客户信息
{
char name[20];//存放用户名
char passward[20];//存放用户密码
};
struct msg_chat//用于存放客户端发送的动作
{
int action[1];
char name[20];
};
typedef struct sockfd_lis * line;
struct man id;//定义一个存放客户信息的结构体
/******************************************************************************************************************/
void gettime()//获得时间
{
time_t timep;
struct tm *p;
time (&timep);
p = gmtime(&timep);
printf(" %d/%d/%d ",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday);
printf("%s\n",ctime(&timep));
}
/******************************************************************************************************************/
/******************************************************************************************************************/
int check(char order[])//核对输入的指令
{
printf("check!\n");
int i = 0;
char chck[4];
if(strlen(order)>3)//判断输入是否超过命令长度
{
printf("error check out!\n");
return 0;
}
for(i = 0; i < 4; i++)
{
chck[i] = order[i];
}
printf("order is %s\n",chck);
/*判断输入的命令,返回宏*/
if(0 == strncmp(chck, "hlp",3))//帮助信息
{
printf("check out!\n");
return HELP;
}
if(0 == strncmp(chck, "log",3))//登录
{
printf("check out!\n");
return LOG;
}
if(0 == strncmp(chck,"reg",3))//注册
{
printf("check out!\n");
return REG;
}
if(0 == strncmp(chck,"pto",3))//悄悄话
{
printf("check out!\n");
return PTO;
}
if(0 == strncmp(chck,"cto",3))//群发消息
{
printf("check out!\n");
return CTO;
}
if(0 == strncmp(chck,"vim",3))//查看在线用户
{
printf("check out!\n");
return VIM;
}
if(0 == strncmp(chck,"vom",3))//查看查看所有用户
{
printf("check out!\n");
return VOM;
}
if(0 == strncmp(chck,"cat",3))//查看聊天历史记录
{
printf("check out!\n");
return CAT;
}
if(0 == strncmp(chck,"fac",3))//特殊表情
{
printf("check out!\n");
return FAC;
}
if(0 == strncmp(chck,"esc",3))//退出
{
printf("check out!\n");
return ESC;
}
/*<超级管理员>*/
if(0 == strncmp(chck,"kic",3))// 踢人
{
printf("check out!\n");
return KIC;
}
if(0 == strncmp(chck,"scl",3))//禁言
{
printf("check out!\n");
return SCL;
}
if(0 == strncmp(chck,"rcl",3))撤销禁言
{
printf("check out!\n");
return RCL;
}
printf("error check out!\n");
return 0;
}
/*******************************************************************************************************************/
/*******************************************************************************************************************/
void help(char a)//帮助信息
{
switch(a)
{
case 'p':
printf(" ********************************************************* \n");
printf(" 欢迎来到咨询台,这里为您提供需要的命令 \n");
printf(" \n");
printf(" 登录请输入 log 需要注册 请输入 reg \n");
printf(" 发送悄悄话 请输入 pto 发送群信息请输入 cto \n");
printf(" 查看在线用户请输入 vim 查看所有用户请输入 vom \n");
printf(" 查看聊天记录请输入 cat 使用特殊表情请输入 fac \n");
printf(" 退出请输入 esc \n");
printf(" \n");
printf(" ******************************************************** \n");
gettime();
/printf("\n\n\n\n\n");
break;
case 'v':
printf(" ******************************************************** \n");
printf(" 欢迎来到咨询台,这里为您提供需要的命令 \n");
printf(" \n");
printf(" 登录请输入 log 需要注册 请输入 reg \n");
printf(" 发送悄悄话 请输入 pto 发送群信息请输入 cto \n");
printf(" 查看在线用户请输入 vim 查看所有用户请输入 vom \n");
printf(" 查看聊天记录请输入 cat 使用特殊表情请输入 fac \n");
printf(" 退出请输入 esc 踢人请输入 kic \n");
printf(" 禁言请输入 scl 撤消禁言请输入 rcl \n");
printf(" \n");
printf(" ******************************************************* \n");
gettime();
break;
default:
break;
}
return;
}
/**************************************************************************************************************/
/**************************************************************************************************************/
void* recivemsg(void* arg)
{
ssize_t read_fd,write_fd;
int sock_fd = (int)arg;
char buffer[BUFF_MAX] = {0};
printf("pepareing recive massage..\n");
while(1)
{
printf("recivemsg!\n");
bzero(buffer, sizeof(buffer)); /* 清空缓冲区 */
read_fd = read(sock_fd,buffer,BUFF_MAX);
if(-1 == read_fd)
{
perror("read");
exit(EXIT_FAILURE);
}
if(0 == strcmp(buffer,"登录成功\n"))
{
flag = 1;
printf("flag = 1 \n");
}
if(0 == strcmp(buffer,"超级管理员成功登录\n"))
{
flag = 1;
vsr = 1;
printf("vsr = 1 \n");
}
if(0 == strcmp(buffer,"你已经被禁言\n"))
{
stp = 1;
printf("stp = 1 \n");
}
if(0 == strcmp(buffer,"你已经被解禁\n"))
{
stp = 0;
printf("stp = 0 \n");
}
if(0 == strcmp(buffer,"该用户不在线,不能发送消息\n"))
{
msg = 0;
printf("msg = 0 \n");
}
if(0 == strcmp(buffer,"你已经被踢下线\n"))
{
flag = 0;
}
printf("%s\n",buffer);
if(1 == flag)
{
/printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("\n输入hlp后可查看命令帮助\n请您输入指令:\n");
}
if(sizeof("recive a massage!") == strncmp(buffer+1,"recive a massage!",sizeof("recive a massage!")))
{
printf("write in .txt\n");
sleep(1);
int ter = open("cline_chat.txt", O_RDWR|O_CREAT|O_APPEND, S_IRUSR);
if(-1 == ter)
{
perror("open");
exit(EXIT_FAILURE);
}
write(ter,buffer,(size_t)(strlen(buffer)));
if( -1 == ter)
{
perror("write");
exit(EXIT_FAILURE);
}
}
memset(buffer, 0, BUFF_MAX);//初始化
}
return;
}
/**************************************************************************************************************/
/<chat_log登录>//
void chat_log(int sock_fd)
{
printf("log!\n");
ssize_t read_fd, write_fd;//存放读和写的描述符
struct msg_chat action;//用来存放动作
char buffer[BUFF_MAX] ={0};//初始化缓冲器
action.action[0] = LOG;
write_fd = write(sock_fd,action.action, 1);//给服务器发送一个动作
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*开始登录*/
/*输入用户信息*/
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("请您输入用户名:\n");
scanf("%s",id.name);//stdin标准输入用户名
write_fd = write(sock_fd, id.name, 20); //将信息写入sock给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
printf("请您输入密码(不少于5位不多于20位):\n");
repassward:
scanf("%s",id.passward);//stdin标准输入密码
if(strlen(id.passward)<5)
{
printf("密码太短\n");
goto repassward;
}
write_fd = write(sock_fd, id.passward, 20); //将信息写入sock给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
printf("log out!\n");
return;
}
/<chat_log登录>//
//<chat_reg注册>
void chat_reg(int sock_fd)
{
printf("reg!\n");
ssize_t write_fd;//存放写的描述符
struct msg_chat action;//用来存放动作
char buffer[BUFF_MAX] ={0};//初始化缓冲器
action.action[0] = REG;
write_fd = write(sock_fd,action.action, 1);
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*开始注册*/
/*输入用户信息*/
gettime();
///printf("\n\n\n\n\n\n\n\n\n\n\n");
sleep(1);
printf("请您输入用户名:\n");
scanf("%s",id.name);//stdin标准输入用户名
write_fd = write(sock_fd, id.name, 20); //将信息写入sock给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
sleep(1);
printf("请您输入密码(不少于5位不多于20位):\n");
repassward:
scanf("%s",id.passward);//stdin标准输入密码
if(strlen(id.passward)<5)
{
printf("密码太短\n");
goto repassward;
}
write_fd = write(sock_fd, id.passward, 20); //将信息写入sock给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
printf("reg out!\n");
return;
}
//<chat_reg注册>
//<chat_pto私聊>
void chat_pto(int sock_fd)
{
printf("pto!\n");
ssize_t read_fd, write_fd;//存放读和写的描述符
struct msg_chat action;//用来存放动作
char pto_name[20];//用于存放接收消息的用户
char buffer[BUFF_MAX] = {0};//用于存放发送的信息
action.action[0] = PTO;
int onlin[1] = {0};
msg = 1;
write_fd = write(sock_fd,action.action, 1);//将私聊动作发给服务器
printf("write %d\n",write_fd);
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*开始私聊*/
///printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
sleep(1);
printf("请输入接收该消息的用户:\n");
while(1)
{
scanf("%s",pto_name);
if(strcmp(pto_name,id.name) == 0)
{
sleep(1);
printf("不可以给自己发送信息,请重新输入\n");
continue;
}
break;
}
write_fd = write(sock_fd,pto_name,20);//将接收该消息的用户名写入
if(-1 == write_fd)
{
perror("read");
exit(EXIT_FAILURE);
}
printf("msg %d\n",msg);
if(1 == msg)
{
printf("->%s:",id.name);
bzero(buffer, sizeof(buffer)); /* 清空缓冲区 */
char chr;
int i = 1;
buffer[0] = getchar();
while('\n' != (chr = getchar()))/* 将输入的数据存到buff中 */
{
buffer[i] = chr;
i++;
}
write_fd = write(sock_fd,buffer,sizeof(buffer));//发送消息
if(-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
memset(buffer,0,sizeof(buffer));//清空缓存中的内容
// msg = 0;
}
printf("pto out!\n");
return;
}
//<chat_pto私聊>///
//<chat_cto公聊>///
void chat_cto(int sock_fd)
{
printf("cto!\n");
ssize_t read_fd, write_fd;//存放读和写的描述符
struct msg_chat action;//用来存放动作
char buffer[BUFF_MAX] = {0};//用于存放发送的信息
action.action[0] = CTO;
int onlin[1] = {0};
msg = 1;
write_fd = write(sock_fd,action.action, 1);//将私聊动作发给服务器
printf("write %d\n",write_fd);
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*开始公聊*/
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("->%s:",id.name);
bzero(buffer, sizeof(buffer)); /* 清空缓冲区 */
char chr;
int i = 1;
buffer[0] = getchar();
while('\n' != (chr = getchar()))/* 将输入的数据存到buff中 */
{
buffer[i] = chr;
i++;
}
write_fd = write(sock_fd,buffer,sizeof(buffer));//发送消息
if(-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
memset(buffer,0,sizeof(buffer));//清空缓存中的内容
printf("cto out!\n");
return;
}
//<chat_cto公聊>/
///<chat_vim显示在线用户>//
void chat_vim(int sock_fd)
{
printf("vim!\n");
ssize_t read_fd, write_fd;//存放读和写的描述符
struct msg_chat action;//用来存放动作
char buffer[BUFF_MAX] = {0};//用于存放发送的信息
pthread_t vim_fd;//用于存放接收用户的套接口描述符
action.action[0] = VIM;
int onlin[1] = {0};
write_fd = write(sock_fd,action.action, 1);//将显示在线用户动作发给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*显示在线用户*/
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
gettime();
printf("vim out!\n");
}
///<chat_vim显示在线用户>//
///<chat_vom显示全部用户>/
void chat_vom(int sock_fd)
{
printf("vom in!\n");
ssize_t read_fd, write_fd;//存放读和写的描述符
struct msg_chat action;//用来存放动作
char buffer[BUFF_MAX] = {0};//用于存放发送的信息
action.action[0] = VOM;
int onlin[1] = {0};
write_fd = write(sock_fd,action.action, 1);//将显示在线用户动作发给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*显示全部用户*/
/printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
gettime();
printf("vom out!\n");
}
///<chat_vom显示全部用户>/
///<chat_kic踢人>/
void chat_kic(int sock_fd)
{
printf("kic in!\n");
ssize_t read_fd, write_fd;//存放读和写的描述符
struct msg_chat action;//用来存放动作
char buffer[BUFF_MAX] = {0};//用于存放发送的信息
action.action[0] = KIC;
int onlin[1] = {0};
char klc_name[20] = {0};
write_fd = write(sock_fd,action.action, 1);//将显示在线用户动作发给服务器
printf("write %d\n",write_fd);
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*开始踢人*/
printf("请输入所踢人的姓名\n");
scanf("%s",klc_name);
write_fd = write(sock_fd,klc_name, 20);//将所踢人的姓名发给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
memset(klc_name,0,sizeof(klc_name));//清空缓存中的内容
printf("kic out!\n");
return;
}
///<chat_kic踢人>//
///<chat_scl禁言>//
void chat_scl(int sock_fd)
{
printf("scl in!\n");
ssize_t write_fd;//存放写的描述符
struct msg_chat action;//用来存放动作
char buffer[BUFF_MAX] = {0};//用于存放发送的信息
action.action[0] = SCL;
char scl_name[20] = {0};
write_fd = write(sock_fd,action.action, 1);
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*开始禁言*/
printf("请输入所禁人的姓名\n");
scanf("%s",scl_name);
write_fd = write(sock_fd,scl_name, 20);//将所禁人的姓名发给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
memset(scl_name,0,sizeof(scl_name));//清空缓存中的内容
printf("scl out!\n");
return;
}
///<chat_scl禁言>//
///<chat_rcl撤消禁言>
void chat_rcl(int sock_fd)
{
printf("rcl in!\n");
ssize_t write_fd;//存放写的描述符
struct msg_chat action;//用来存放动作
char buffer[BUFF_MAX] = {0};//用于存放发送的信息
action.action[0] = RCL;
char rcl_name[20] = {0};
write_fd = write(sock_fd,action.action, 1);
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
/*开始j禁言*/
printf("请输入所禁人的姓名\n");
scanf("%s",rcl_name);
write_fd = write(sock_fd,rcl_name, 20);//将所禁人的姓名发给服务器
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
memset(rcl_name,0,sizeof(rcl_name));//清空缓存中的内容
printf("rcl out!\n");
return;
}
///<chat_rcl撤消禁言>
//<o退出o>
void chat_esc(int sock_fd)
{
printf("esc!\n");
struct msg_chat action;//用来存放动作
int write_fd;
action.action[0] = ESC;
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" exit chat room\n");
printf(" ********************************************** \n");
gettime();
printf(" ^_^/~ 您已经退出登录,欢迎下次继续使用。\n");
printf(" ********************************************** \n");
printf("\n\n\n\n\n\n\n\n\n\n\n");
sleep(2);
write_fd = write(sock_fd,action.action, 1);
if (-1 == write_fd)
{
perror("write");
exit(EXIT_FAILURE);
}
printf("esc out!\n");
return;
}
//<o退出o>//
/<o客户机的主要请求部分o>/
void ask_serve(int sock_fd)
{
char buffer[BUFF_MAX] = {0}; //输入指令缓冲器
int ret; //保存线程创建的返回值
pthread_t msg_id;//接收服务器线程的id
relog:
while(1)
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" enter键确认进入聊天室,退出请按Ctrl+c \n");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
getchar();
char a[1];
a[0] = getchar();
if(a[0] == '\n')
{
a[0] = '0';
break;
}
}
// printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" loading . . . \n");
sleep(2);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" ^_^ 欢迎来到我们的聊天室 ^_^ \n");
if(vsr == 0)//显示输入信息
{
help('p');
}
if(vsr == 1)
{
help('v');
}
printf("\n\n\n\n\n\n\n");
printf(" *************请您登录,新用户请先注册*****************\n");
/*用于给其他客户端和服务器发送信息*/
while(1)
{
memset(buffer,0,sizeof(buffer));//清空缓存中的内容
sleep(1);
if(0 == flag)
{
printf("输入hlp后可查看命令帮助\n");
printf("请您输入指令:");
}
if(1 == flag)
{
printf("\n%s.>",id.name);
}
while(1)
{
printf("ask_serve xunhuan.....\n");
scanf("%s",buffer);
int ord = check(buffer);
if(0 == ord)
{
sleep(1);
printf("输入命令有误,请您重新输入\n");
sleep(1);
// printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
continue;
}
break;
}
int ord = check(buffer);
switch(ord)
{
/*帮助*/
case HELP:
{
if(vsr == 0)
{
help('p');
}
if(vsr == 1)
{
help('v');
}
continue;
}
/*登录*/
case LOG:
{
printf("chat_log in\n");
if(1 == flag)
{
printf("您已经登录,请不要重复登录\n");
sleep(1);
// printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("chat_log out\n");
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
continue;
}
chat_log(sock_fd);
continue;
}
/*注册*/
case REG:
{
printf("chat_reg in\n");
if(1 == flag)
{
printf("您已经登录,注册请退出登录状态\n");
sleep(1);
///printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("chat_reg out\n");
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
continue;
}
chat_reg(sock_fd);
printf("chat_reg out\n");
continue;
}
/*私聊*/
case PTO:
{
printf("chat_pto in\n");
if(0 == flag)
{
printf("您还未登录,请先登录\n");
sleep(1);
// printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("chat_pto out\n");
continue;
}
if(1 == stp)
{
printf("您已被禁言\n");
sleep(1);
///printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("chat_pto out\n");
continue;
}
chat_pto(sock_fd);
printf("chat_pto out\n");
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
continue;
}
/*公聊*/
case CTO:
{
printf("chat_cto in\n");
if(0 == flag)
{
printf("您还未登录,请先登录\n");
sleep(1);
//printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("chat_cto out\n");
continue;
}
if(1 == stp)
{
printf("您已被禁言\n");
sleep(1);
/printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("chat_cto out\n");
continue;
}
chat_cto(sock_fd);
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
printf("chat_cto out\n");
continue;
}
/*显示在线用户*/
case VIM:
{
printf("chat_vim in\n");
if(0 == flag)
{
printf("您还未登录,请先登录\n");
sleep(1);
/ printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("chat_vim out\n");
continue;
}
chat_vim(sock_fd);
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
printf("chat_vim out\n");
continue;
}
/*显示全部用户*/
case VOM:
{
printf("chat_vom in\n");
if(0 == flag)
{
printf("您还未登录,请先登录\n");
sleep(1);
///printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
gettime();
printf("chat_vom out\n");
continue;
}
chat_vom(sock_fd);
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
printf("chat_vom out\n");
continue;
}
/*踢人*/
case KIC:
{
printf("chat_kic in\n");
if(1 == vsr)
{
chat_kic(sock_fd);
printf("chat_kic out\n");
continue;
}
if(0 == vsr)
{
printf("您没有该权限\n");
printf("chat_kic out\n");
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
continue;
}
}
/*禁言*/
case SCL:
{
printf("chat_scl in\n");
if(1 == vsr)
{
chat_scl(sock_fd);
printf("chat_scl out\n");
continue;
}
if(0 == vsr)
{
printf("您没有该权限\n");
printf("chat_scl out\n");
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
continue;
}
}
/*撤消禁言*/
case RCL:
{
printf("chat_rcl inn");
if(1 == vsr)
{
chat_rcl(sock_fd);
printf("chat_rcl out\n");
continue;
}
if(0 == vsr)
{
printf("您没有该权限\n");
printf("chat_rcl out\n");
printf("输入hlp后可查看命令帮助\n请您输入指令:\n");
continue;
}
}
/*退出*/
case ESC:
{
printf("chat_esc in\n");
chat_esc(sock_fd);
flag = 0;
printf("chat_esc out\n");
goto relog;
continue;
}
default:
continue;
}
}
printf("error\n");
return;
}
/<main>///
int main(int argc, char *argv[])
{
struct sockaddr_in clinaddr;//客户端地址的结构体
int ret;//用于存放连接的状态
pthread_t msg_id;//接收服务器线程的id
//pthread_mutex_init(&mutex, NULL);
/*查寻客户端的IP是否正确输入*/
if (2 != argc)
{
printf("Usage: ./client <IP address>\n");
exit(EXIT_FAILURE);
}
/*创建一个套接口*/
cilnsock_fd = socket(AF_INET,SOCK_STREAM, 0);
if(-1 == cilnsock_fd)
{
perror("socket");
exit(EXIT_FAILURE);
}
/*初始化客户端结构体*/
memset((struct sockaddr_in*)&clinaddr, 0, sizeof(struct sockaddr_in));
/*客户端的资料*/
clinaddr.sin_family = AF_INET;//协议ipt4
clinaddr.sin_port = htons(PORT);//主机端口号
inet_aton(argv[1], &clinaddr.sin_addr);//主机地址
/*连接服务器*/
ret = connect(cilnsock_fd, (struct sockaddr *)&clinaddr, (socklen_t )sizeof(clinaddr));
if(-1 == ret)
{
printf("connect error!\n");
perror("connect");
exit(EXIT_FAILURE);
}
ret = pthread_create(&msg_id, NULL , (void*)recivemsg,(void*)cilnsock_fd);//创建一个线程来读取服务器发送过来的群聊信息
if(ret != 0)
{
printf("Creat pthread error!\n");
exit(EXIT_FAILURE);
}
//<o客户机的主要请求部分o>//
ask_serve(cilnsock_fd); //用户的功能部分选择与调用区域
<o客户机的主要请求部分o>///
return 0;
}
<main>