您的位置:首页 > 理论基础 > 计算机网络

TCP/IP多线程——聊天室(客户端 )

2017-12-29 10:53 309 查看
项目要求

 实现目标

一个在Linux下可以使用的聊天软件,要求至少实现如下功能:

1. 采用Client/Server架构

2. Client A 登陆聊天服务器前,需要注册自己的ID和密码

3. 注册成功后,Client A 就可以通过自己的ID和密码登陆聊天服务器

4. 多个Client X 可以同时登陆聊天服务器之后,与其他用户进行通讯聊天

5. Client A成功登陆后可以查看当前聊天室内其他在线用户Client x

6. Client A可以选择发消息给某个特定的Client X,即”悄悄话”功能

7. Client A 可以选择发消息全部的在线用户,即”群发消息”功能

8. Client A 在退出时需要保存聊天记录

9. Server端维护一个所有登陆用户的聊天会的记录文件,以便备查

可以选择实现的附加功能:

1. Server可以内建一个特殊权限的账号admin,用于管理聊天室

2. Admin可以将某个Client X “提出聊天室”

3. Admin可以将某个Client X ”设为只能旁听,不能发言”

4. Client 端发言增加表情符号,可以设置某些自定义的特殊组合来表达感情.如输入:),则会自动发送”XXX向大家做了个笑脸”

5. Client段增加某些常用话语,可以对其中某些部分进行”姓名替换”,例如,输入/ClientA/welcome,则会自动发送”ClientA 大侠,欢迎你来到咱们的聊天室”

/*****************************************************
> File name: client.h
> Author: Mr.XU
> 日期: 2017-12-12 19:57
*****************************************************/

#ifndef CLIENT_H_
#define CLIENT_H_

#include <stdio.h>
#include <sqlite3.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
#include <semaphore.h>
#include <termios.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>

#define SE_PORT    8888

#define reg             1         //注册
#define log             2         //登录
#define exit            4         //退出
#define existing_acc    5         //账号已存在
#define logged_acc      6         //账号已登录
#define error           7         //账号或密码错误
#define log_success     8         //登录成功
#define reg_success     9         //注册成功
#define Exit            10        //退出

#define private_chat    11        //私聊
#define group_chat      12         //群聊
#define group_result    13        //群聊接受
#define online_member   15        //查看在线人数
#define expression      16        //表情
#define phrases         17        //常用语
#define Vip             21        //开会员
#define Shutup          22        //禁言
#define lifted          23        //解禁
#define kick            24        //踢人

#define vip_success     25        //开会员成功
#define Shutup_success  26        //禁言成功
#define Send_success    27         //发送信息成功
#define Send_error      28         //发送信息失败
#define kick_fail       29        //踢人失败
#define kick_success    30        //踢人成功

extern int tcp_init();
extern int tcp_accept(int sfd);
extern int tcp_connect();

#endif


/*****************************************************
> File name: client.c
> Author: Mr.XU
> 日期: 2017-12-12 18:58
*****************************************************/

#include "client.h"
struct send
{
char name[20];
char toname[20];
char account[20];
char password[20];
int  vip;                   //是否是会员
int  cmd;                   //提取操作符
char msg[200];              //发送、接收消息
char e_s;                   //确认发送的表情
char p_s;                   //确认发送的常用语

};

struct recv
{
char from_name[20];
char to_name[20];           //名字
int  result;                //返回操作结果
int  online_num;            //在线人数
char num[20][20];           //在线人名
char msg[200];              //发送、接收消息
char password[20];          //密码
int  vip;                   //是否是会员
char e_s;                   //确认发送的表情
char p_s;                   //确认发送的常用语

};

struct send userIn;
struct recv userBack;

char Name[20];
int  ret;
int  READEN=0;
int  OUT=0;
int  State;
char fan[20];

//初始化socket
int tcp_init()
{
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(-1==sfd)
{
perror("socket");
return -1;
}
int ret;
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(struct sockaddr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SE_PORT);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

ret=bind(sfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
if(-1==ret)
{
perror("bind");
return -1;
}
ret=listen(sfd,10);
if(-1==ret)
{
perror("listen");
close(sfd);
return -1;
}
return sfd;
}
//接收
int tcp_accept(int sfd)
{
struct sockaddr_in client_addr;
memset(&client_addr,0,sizeof(struct sockaddr));
int length=sizeof(struct sockaddr);
int sfd2=accept(sfd,(struct sockaddr *)&client_addr,&length);
if(-1==sfd2)
{
perror("accept");
close(sfd);
return -1;
}
printf("%s %d connet success!\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
return sfd2;
}
//连接
int tcp_connect(const char* ip)
{
int ret;
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(-1==sfd)
{
perror("socket");
return -1;
}
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(struct sockaddr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SE_PORT);
server_addr.sin_addr.s_addr=inet_addr(ip);

ret=connect(sfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));
if(-1==ret)
{
perror("connect");
close(sfd);
return -1;
}
return sfd;
}

void now_time()
{
time_t now;    //实例化time_t结构
struct tm  *timenow;    //实例化tm结构指针
time(&now);//time函数读取现在的时间(国际标准时间非北京时间),然后传值给now
timenow = localtime(&now);//localtime函数把从time取得的时间now换算成你电脑中的时间(就是你设置的地区)
printf("\t\t\t Time :%s\n",asctime(timenow));//asctime函数把时间转换成字符,通过printf()函数输出"")
}

void SCAN_N()//清除回车的缓存
{

char ch;
while((getchar())!='\n'&&ch!=EOF);
}

void menu()
{
system("clear");
printf("\n\n\n");
now_time();
printf("\t\t\t**************************************************************\n");
printf("\t\t\t                                                              \n");
printf("\t\t\t                      徐神的简易聊天室                        \n");
printf("\t\t\t                      1.登录                                  \n");
printf("\t\t\t                      2.注册                                  \n");
printf("\t\t\t                      3.退出                                  \n");
printf("\t\t\t                                                              \n");
printf("\t\t\t                      请选择:");
}

int log_in()//注册界面
{
char pass1[20];
char pass2[20];
int i=0;
int j=0;
State=0;
userIn.cmd=reg;
userIn.vip=0;
system("clear");
printf("\n\n\n\n");
printf("\t\t\t请输入帐号:\n");
printf("\t\t\t");
scanf("%s",userIn.account);

printf("\t\t\t请输入密码:\n");
printf("\t\t\t");
while(i<20)
{
pass1[i]=mygetch();
if(pass1[i]==10)
{
if(j==0)//防止最后回车影响
{
j++;
continue;
}
break;
}
printf("*");
i++;
}
pass1[i]='\0';
i=0;
printf("\n\t\t\t请确认你的密码:\n");
printf("\t\t\t");
while(i<20)
{
pass2[i]=mygetch();
if(pass2[i]==10)
{
break;
}
printf("*");
i++;
}
pass2[i]='\0';
printf("\n\t\t\t请输入你的昵称:\n");
printf("\t\t\t");
scanf("%s",userIn.name);
system("clear");
printf("\n\t\t\t正在注册...\n");
sleep(1);
if(strcmp(pass1,pass2)!=0)
{
printf("\n\t\t\t密码有误,请重新注册!\n");
sleep(1);
return -9;
}
else
{
strcpy(userIn.password,pass1);
}

}
int log_on()//登录界面
{
char pass1[20];
int i=0;
int j=0;
system("clear");
printf("\n\n\n\n");
printf("\t\t\t请输入帐号:\n");
printf("\t\t\t");
scanf("%s",userIn.account);
printf("\t\t\t请输入密码:\n");
printf("\t\t\t");
while(i<20)
{
pass1[i]=mygetch();
if(pass1[i]==10)
{
if(j==0)//防止最后回车影响
{
j++;
continue;
}
break;
}
printf("*");
i++;
}
pass1[i]='\0';
strcpy(userIn.password,pass1);
printf("\n\t\t\t正在登录...\n");
sleep(2);
}

int log_chat()//登录后界面
{
system("clear");
printf("\n\n\n");
now_time();
printf("\t\t\t**************************************************************\n");
printf("\t\t\t                                                              \n");
printf("\t\t\t                      a.悄悄话                                \n");
printf("\t\t\t                      b.群聊                                  \n");
printf("\t\t\t                      c.查看在线人数                          \n");
printf("\t\t\t                      d.查看本地聊天记录                      \n");
printf("\t\t\t                      e.升至管理员                            \n");
printf("\t\t\t                      f.管理员踢人                            \n");
printf("\t\t\t                      g.管理员禁言                            \n");
printf("\t\t\t                      h.管理员解禁                            \n");
printf("\t\t\t                      i.发送表情                              \n");
printf("\t\t\t                      j.发送常用语                            \n");
printf("\t\t\t                      q.下线                                  \n");

}
int deal_log(int sfd)
{
char ecf[12];//输入选择
char x[2];//支付
char xzf[40];//聊天文本名字
char czf[2048];//聊天记录
while(1)
{
if(READEN==1)
{
READEN=0;
switch(userBack.result)
{
case (Send_success):
system("clear");
printf("\n\t\t\t发送成功\n");
memset(&userBack.result,0,sizeof(userBack.result));
fgets(fan,20,stdin);
break;
case (vip_success):
system("clear");
printf("\n\t\t\t恭喜你成为管理员!\n");
memset(&userBack.result,0,sizeof(userBack.result));
fgets(fan,20,stdin);
break;
case (Shutup_success):
system("clear");
printf("\n\t\t\t用户已被禁言\n");
memset(&userBack.result,0,sizeof(userBack.result));
fgets(fan,20,stdin);
break;
case (kick_success):
system("clear");
printf("\n\t\t\t用户已被踢下线\n");
memset(&userBack.result,0,sizeof(userBack.result));
fgets(fan,20,stdin);
break;
case (Send_error):
system("clear");
printf("\n\t\t\t用户不在线\n");
memset(&userBack.result,0,sizeof(userBack.result));
fgets(fan,20,stdin);
break;
}
}

if(1==OUT)//判断是否被踢
{
OUT--;
return 4;
}
log_chat();

printf("\n\t\t\t\t\t\t请选择功能\n");
printf("\t\t\t\t\t\t");
scanf("%s",ecf);
SCAN_N();
switch(ecf[0])
{
case 'a'://悄悄话
system("clear");
int fd1;
printf("\n\n\n");
if(State==Shutup)
{
printf("\n\t\t\t你已被禁言!\n");
fgets(fan,20,stdin);
break;
}
memset(czf,0,strlen(czf));
memset(xzf,0,strlen(xzf));
printf("\t\t\t你想发送给谁?对方昵称:");
scanf("%s",userIn.toname);
SCAN_N();
printf("\n\n\t\t\t你想发送:");
scanf("%[^\n]",userIn.msg);//可以输入空格
SCAN_N();
userIn.cmd=private_chat;
strcpy(userIn.name,Name);
if(strcmp(Name,userIn.toname)==0)
{
sleep(1);
system("clear");
printf("\n\t\t\t不可以给自己发送消息");
fgets(fan,20,stdin);
break;
}
ret=write(sfd,&userIn,sizeof(userIn));
if(ret==-1)
{
perror("write");
return -1;
}
sprintf(xzf,"%s与%s的聊天记录.txt",Name,userIn.toname);
fd1=open(xzf,O_CREAT|O_RDWR|O_APPEND,S_IRUSR|S_IWUSR);
if(-1==fd1)
{
perror("open");
return -1;
}
sprintf(czf,"%s 对 %s 发送了一句悄悄话:%s ",Name,userIn.toname,userIn.msg);
ret=write(fd1,czf,strlen(czf));
if(-1==ret)
{
perror("write");
return -1;
}
printf("\n\t\t\t正在发送...\n");
sleep(1);
break;
case 'b'://群聊
system("clear");
printf("\n\n\n");
int i=0;
if(State==Shutup)
{
printf("\n\t\t\t你已被禁言\n");
printf("\n任意键返回");
fgets(fan,20,stdin);
break;
}
printf("\n\n\n\t\t\t你想发送:");

scanf("%[^\n]",userIn.msg);//可以输入空格
SCAN_N();
userIn.cmd=group_chat;
strcpy(userIn.name,Name);
ret=write(sfd,&userIn,sizeof(userIn));
if(-1==ret)
{
perror("write");
return -1;
}

f7ad
system("clear");
printf("\n\n\n\n\n\t\t\t正在发送...\n");
sleep(1);
break;
case 'c'://查看在线人数
system("clear");
userIn.cmd=online_member;
ret=write(sfd,&userIn,sizeof(userIn));
if(-1==ret)
{
perror("write");
return -1;
}
printf("\n\n\n\n\n\t\t\t...\n");
sleep(1);
break;
case 'd'://查看本地聊天记录
system("clear");
char n[20];
char mcf[60];
char ncf[2048];
char k1;
int fd2;
i=0;
printf("\n\n\n\t\t\t你想看和谁的聊天记录?");
scanf("%s",n);
SCAN_N();
sprintf(mcf,"%s与%s的聊天记录.txt",Name,n);
fd2=open(mcf,O_RDONLY,S_IRUSR|S_IWUSR);
if(-1==fd2)
{
system("clear");
printf("\n\n\n\t\t\t暂时没有和%s的聊天记录\n",n);
printf("\n\n\n任意键返回");
fgets(fan,20,stdin);
break;
}
while(1)
{
memset(&k1,0,sizeof(k1));
ssize_t read_bytes=read(fd2,&k1,sizeof(k1));//字节读取
if(-1==read_bytes)
{
perror("read");
return -1;
}
if(0==read_bytes)
{
break;
}
ncf[i]=k1;
i++;
}
ncf[i]='\0';
printf("\n%s\n",ncf);
printf("\n\n\n任意键返回");
fgets(fan,20,stdin);
sleep(1);
break;
case 'e'://升级至管理员
if(userBack.vip==1)
{
system("clear");
printf("\n\n\n\t\t\t你已经是管理员了\n");
printf("任意键返回");
fgets(fan,20,stdin);
break;
}
else
{
system("clear");
printf("\n\n\n\t\t\t确认要成为管理员吗\n");
printf("\n\n\n\t\t\t再次确认?(y/n)");
scanf("%s",x);
SCAN_N();
if(x[0]=='y')
{
strcpy(userIn.name,Name);
userIn.vip=1;
userIn.cmd=Vip;
ret=write(sfd,&userIn,sizeof(userIn));
if(-1==ret)
{
perror("write");
return -1;
}
printf("\n\n\n\t\t\t请稍后...\n");
sleep(2);
}
break;
}
case 'f'://管理员踢人
if(userBack.vip==0)
{
system("clear");
printf("\n\n\n\t\t\t你不是管理员\n");
printf("\n\n\n\t\t\t任意键返回\n");
fgets(fan,20,stdin);
}
else
{
system("clear");
printf("\n\n\n\t\t\t你想踢谁下线");
scanf("%s",userIn.toname);
SCAN_N();
strcpy(userIn.name,Name);
userIn.cmd=kick;
if(strcmp(Name,userIn.toname)==0)
{
sleep(1);
system("clear");
printf("\n\n\n\t\t\t不可以踢自己");
printf("\n\n\n\t\t\t任意键返回");
fgets(fan,20,stdin);
break;
}
ret=write(sfd,&userIn,sizeof(userIn));
if(-1==ret)
{
perror("write");
return;
}
printf("\n\n\n\t\t\t请稍等...\n");
sleep(1);
}
break;
case 'g'://管理员禁言
if(userBack.vip==0)
{
system("clear");
printf("\n\n\n\t\t\t你不是管理员\n");
printf("\n\n\n\t\t\t任意键返回\n");
fgets(fan,20,stdin);
}
else if(userBack.vip==1)
{
system("clear");
printf("\n\n\n\t\t\t你想让谁禁言");
scanf("%s",userIn.toname);
SCAN_N();
userIn.cmd=Shutup;
strcpy(userIn.name,Name);
if(strcmp(Name,userIn.toname)==0)
{
sleep(1);
system("clear");
printf("\n\n\n\t\t\t不可以禁言自己");
printf("\n\n\n\t\t\t任意键返回");
fgets(fan,20,stdin);
break;
}
ret=write(sfd,&userIn,sizeof(userIn));
if(-1==ret)
{
perror("write");
return;
}
printf("\n\n\n\t\t\t请稍等...\n");
}
break;
case 'h'://管理员解禁
if(State==0)
{
system("clear");
printf("\n\n\n\t\t\t你没有被禁言\n");
printf("\n\n\n\t\t\t任意键返回");
fgets(fan,20,stdin);
}
else if(State==Shutup)
{
if(userBack.vip==0)
{
system("clear");
printf("\n\n\n\t\t\t你不是管理员,仅限管理员解禁\n");
printf("\n\n\n\t\t\t任意键返回");
fgets(fan,20,stdin);
}
else if(userBack.vip==1)
{
system("clear");
printf("\n\n\n\t\t\t你想解禁吗(y/n)");
scanf("%s",x);
SCAN_N();
if(x[0]='y')
{
State=0;
system("clear");
printf("\n\n\n\t\t\t你已被解禁\n");
printf("\n\n\n\t\t\t任意键返回");
fgets(fan,20,stdin);
}
}
}
break;
case 'i': //发送表情
deal_send_expr(sfd);
break;
case 'j'://发送常用语
deal_phrases(sfd);
break;
case 'q'://退出
userIn.cmd=exit;
strcpy(userIn.name,Name);
ret=write(sfd,&userIn,sizeof(userIn));
if(-1==ret)
{
perror("write");
return -1;
}
//pthread_cancel(ReadId);
return Exit;
default:
printf("\n\t\t\t请输入正确选项!\n");
printf("\n\n\n\t\t\t任意键返回");
fgets(fan,20,stdin);
break;
}
}
}

//用于将密码数字转换为*
int mygetch( )
{
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;
}

void* Read_from_server(int sfd)
{
int i;
while(1)
{
ret=read(sfd,&userBack,sizeof(userBack));
if(-1==ret)
{
perror("read");
return;
}
READEN=1;
switch(userBack.result)
{
case (private_chat):
system("clear");
printf("\n\n\t\t\t%s 对你说了一句悄悄话:%s\n",userBack.from_name,userBack.msg);
memset(&userBack.result,0,sizeof(userBack.result));
break;
case (group_chat):
system("clear");
printf("\n\n\t\t\t%s发送了一条消息:%s\n",userBack.from_name,userBack.msg);
memset(&userBack.result,0,sizeof(userBack.result));
break;
case (online_member):
system("clear");
printf("\n\t\t\t当前在线人数:%d\n",userBack.online_num);
for(i=0;i< userBack.online_num;i++)
{
printf("\n\t\t\t%s\n",userBack.num[i]);
}
memset(&userBack.result,0,sizeof(userBack.result));
break;
case (expression):
back_ep();
memset(&userBack.result,0,sizeof(userBack.result));
break;
case (phrases):
back_ph();
memset(&userBack.result,0,sizeof(userBack.result));
break;
case (Shutup):
State=Shutup;
system("clear");
printf("\n\t\t\t%s把你禁言了\n");
memset(&userBack.result,0,sizeof(userBack.result));
break;
case (kick):
OUT=1;
system("clear");
printf("\n\t\t\t%s把你强制下线了\n");
memset(&userBack.result,0,sizeof(userBack.result));
break;
//case (log_success):

}
}
}

int deal_send_expr(int sfd)//发送表情
{
char e[10];
system("clear");
printf("\n\n\n");
if(State==Shutup)
{
printf("\n\t\t\t你已被禁言\n");
fgets(fan,20,stdin);
return Shutup;
}
printf("\n\t\t\t发送表情给谁?:\n");
printf("\t\t\t");
scanf("%s",userIn.toname);
strcpy(userIn.name,Name);
userIn.cmd=expression;
printf("\n\t\t\t1.萌萌     =v=");
printf("\n\t\t\t2.生气    #= =!");
printf("\n\t\t\t3.哭泣     T_T");
printf("\n\t\t\t请输入发送的表情");
scanf("%s",e);
SCAN_N();
userIn.e_s=e[0];
if(strcmp(Name,userIn.toname)==0)
{
sleep(1);
system("clear");
printf("\n\t\t\t不可以给自己发送表情");
fgets(fan,20,stdin);
return -1;
}
ret=write(sfd,&userIn,sizeof(userIn));
if(-1==ret)
{
perror("write");
return -1;
}
system("clear");
printf("\n\t\t\t正在发送\n");
sleep(1);
}

int back_ep()
{
char er[20];
switch (userBack.e_s)
{
case '1':
strcpy(er,"=v=");
system("clear");
printf("\n\t\t\t%s给你发送了一个表情",userBack.from_name);
printf("\n\t\t\t%s\n",er);
printf("\n\t\t\t请按回车返回\n");
fgets(fan,20,stdin);
break;
case '2':
strcpy(er,"#= =!");
system("clear");
printf("\n\t\t\t%s给你发送了一个表情",userBack.from_name);
printf("\n\t\t\t%s\n",er);
printf("\n\t\t\t请按回车返回\n");
fgets(fan,20,stdin);
break;
case '3':
strcpy(er,"T_T");
system("clear");
printf("\n\t\t\t%s给你发送了一个表情",userBack.from_name);
printf("\n\t\t\t%s\n",er);
printf("\n\t\t\t请按回车返回\n");
fgets(fan,20,stdin);
break;
default :
system("clear");
printf("\n\t\t\t请输入正确的选项\n");
printf("\n\t\t\t请按回车返回\n");
fgets(fan,20,stdin);
break;
}
}

int deal_phrases(int sfd)
{
char p[10];
system("clear");
printf("\n\n\n");
if(State==Shutup)
{
printf("\t\t\t你已被禁言\n");
fgets(fan,20,stdin);
return Shutup;
}
printf("\n\t\t\t你想给谁发常用语:");
scanf("%s",userIn.toname);
strcpy(userIn.name,Name);
userIn.cmd=phrases;
printf("\n\t\t\t1.初次见面\n");
printf("\n\t\t\t2.请多关照\n");
printf("\n\t\t\t3.是吗\n");
printf("\n\t\t\t4.是的\n");
printf("\n\t\t\t5.欢迎\n");
printf("\n\t\t\t6.不用客气\n");
printf("\n\t\t\t7.早上好\n");
printf("\n\t\t\t8.中午好\n");
printf("\n\t\t\t9.晚上好\n");
printf("\n\t\t\t请输入你想发送的常用语:\n");
scanf("%s",p);
SCAN_N();
userIn.p_s=p[0];
if(strcmp(Name,userIn.toname)==0)
{
sleep(1);
system("clear");
printf("\n\t\t\t不可以给自己发送常用语");
printf("\n");
fgets(fan,20,stdin);
return -1;
}
ret=write(sfd,&userIn,sizeof(userIn));
if(-1==ret)
{
perror("write");
return -1;
}
system("clear");
printf("\n\t\t\t正在发送...");
sleep(1);
}

int back_ph()
{
char ph[60];
switch (userBack.p_s)
{
case '1':
strcpy(ph,"初次见面");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
case '2':
strcpy(ph,"请多关照");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
strcpy(ph,"请多关照");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
case '3':
strcpy(ph,"是吗");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
case '4':
strcpy(ph,"是的");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
case '5':
strcpy(ph,"欢迎");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
case '6':
strcpy(ph,"不用客气");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
case '7':
strcpy(ph,"早上好");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
case '8':
strcpy(ph,"中午好");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
case '9':
strcpy(ph,"晚上好");
system("clear");
printf("\n\t\t\t%s给你发送了一句常用语",userBack.from_name);
printf("\n\t\t\t%s\n",ph);
printf("\n\t\t\t请按回车返回\n");
break;
default:
system("clear");
printf("\n\n\n\t\t\t请输入正确选项");
printf("\n\t\t\t请按回车返回\n");
break;
}
}

int main(int argc,char **argv)
{
int sfd;
if(argc!=2)
{
printf("\n请输入ip\n");
return -1;
}
pthread_t ReadId;
sfd=tcp_connect(argv[1]);
int choice;

while(1)
{
sleep(1);
menu();
scanf("%d",&choice);
printf("\n");
switch(choice)
{
case 1://登录
userIn.cmd=log;
log_on(&userIn);
sleep(1);
ret=write(sfd,&userIn,sizeof(struct send));
if(-1==ret)
{
perror("write");
}
ret=read(sfd,&userBack,sizeof(userBack));
if(-1==ret)
{
perror("read");
}
if(userBack.result==log_success)
{
strcpy(Name,userBack.from_name);
printf("\n\t\t\t登录成功\n");
sleep(1);
pthread_create(&ReadId,NULL,(void *)Read_from_server,(void *)sfd);
pthread_detach(ReadId);
ret=deal_log(sfd);
if(ret==10)
{
pthread_cancel(ReadId);
break;
}
}
else if(userBack.result==error)
{
printf("\n\t\t\t密码不符,请重新登录\n");
sleep(1);

}
else if(userBack.result==logged_acc)
{
printf("\n\t\t\t此用户已登录\n");
sleep(1);
}
break;
case 2:
if(log_in()==-9)
{
break;
}
else
{
write(sfd,&userIn,sizeof(userIn));
memset(&userIn,0,sizeof(userIn));

memset(&userBack,0,sizeof(userBack));
read(sfd,&userBack,sizeof(userBack));
if(userBack.result==reg_success)
{
printf("\n\t\t\t注册成功\n");
sleep(1);
}
else if(userBack.result==existing_acc)
{
printf("\n\t\t\t该账户已被注册\n");
sleep(1);
}
sleep(1);
break;
}
case 3:
sleep(1);
system("clear");
close(sfd);
return 0;
default:
printf("\n\t\t\t请输入正确选项");
sleep(1);
break;
}
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: