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 大侠,欢迎你来到咱们的聊天室”
实现目标
一个在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; }
相关文章推荐
- TCP/IP多线程——聊天室(服务器)
- TCP/IP 多线程服务端多客户端通信 readLine
- Android_TCP/IP开发——聊天室模型(客户端与服务器进行通信)
- 多线程TCP/IP通讯的客户端
- 网络编程_TCP_Socket通信_聊天室_客户端多线程_群聊JAVA191-192
- 多线程TCP/IP通讯的客户端
- Linux下面基于TCP多线程聊天室(客户端)
- [网络编程]——TCP_Socket通信_聊天室_客户端多线程
- 多线程TCP/IP通讯的客户端
- linux网络编程练习---聊天室(TCP/IP实现)
- java客户端与服务端通信Tcp/Ip
- C#网络编程(一)——C#开发TCP/IP聊天室
- TCP/IP网络编程_echo回声服务器端与/客户端
- linux下多线程tcp服务器、客户端程序
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- 基于TCP/IP的手机聊天游戏(附带源码和解释)之客户端类
- 以异步的方式操作TCP/IP套接字——以异步方式实现简单的聊天室
- 嵌入式每日学习心得 基于TCP/IP的聊天室程序
- C# 异步TCP Socket聊天室(1服务器,N客户端)
- (原创)TCPIP的二次封装,可同时多客户端收发数据