linux下用线程实现的聊天室 客户端部分

#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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户端,采用多线程。一个接收服务器消息,一个发送消息给服务器。 服务器,采用select()进行IO复用。 编译文件是Makefile。 (1)用户登录: 【1】client端接收用户名和密码->存于结构体中->将结构体发送给server端。 【2】server端接收client发送的结构体->打开存储用户名密码的文件->文件写入链表中->遍历链表验证用户信息。 【3】server端验证正确发送“登陆成功”消息,错误发回“登陆失败”消息。client端接收,“登陆成功”则进入聊天,“登陆失败”则跳出。 【4】若验证成功,server端产生一个新的套接字newfd,将它与用户名封装于同一个结构体中,存储在线用户的信息。 消息、存储在线用户信息结构体: typedef struct message { int type; //服务器用于判断该执行的功能 int fd; int mode; //标志位,表示用户的发言权限,1为正常,0为禁言 char name[NAMELEN]; char mima[NAMELEN]; char from[20]; char to[20]; //聊天时的收信人 char file_name[20]; //发送文件时的文件名 char mtext[100]; //聊天时发送的消息内容 struct message *next; }Mess; (2)一对多聊天: 【1】client端发送欲发送的信息给server端。 【2】server端遍历在线人信息链表,找到每个在线人的套接字描述符,将消息发送给链表中的每个人。 【3】可以通过输入“:)”, “:(”, “bye”来发送笑脸,悲伤脸和退出聊天;检测敏感词汇“fuck”、“shit”,禁止发送。 (3)一对一聊天: 【1】client端发送欲发送的信息和信息的接收者给server端。 【2】server端根据收到的接收者名字在在线人链表中查找该接收者的套接字描述符,找到后就将消息发送给该接收者。 【3】可以通过输入“:)”, “:(”, “bye”来发送笑脸,悲伤脸和退出聊天;检测敏感词汇“fuck”、“shit”,禁止发送。 (4)文件传输 【1】client端发送预发送的文件名和接收者名字到server端。 先打开(不存在则创建)一个文件,将文件内容读到缓冲区buffer,再将buffer的内容复制到结构体Mess中,最后将结构体发送给server端。 【2】server端先将接收到的文件重命名(因为相同文件目录下不能存在同名文件),再将收到的文件和新的文件名一同放入tab1中(并且在tab1开头写“#”)发送给client端。 【3】当client端收到以“#”开头的消息,执行文件接收,先创建一个文件,再写入相应内容。 (5)管理员模式 【1】禁言 【2】解禁

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值