資源簡介
本程序主要是針對Linux IPC通信初學者對Linux下消息隊列通信機制,多線程編程,字符串處理,鏈表操作等基本概念的練習。通過多個終端登錄,不同終端上登錄用戶實現私聊,群聊,查看在線用戶,簡單注冊(沒有實現用戶保存,類似于公共聊天室)

代碼片段和文件信息
/*?msg_client.c?*/??
#include?“msg.h“???
int?userid?=?0;
char?name[32]?=?““;
void?print_menu(void){
printf(“\t+----------------------------------+\n“);
printf(“\t+????Chat?Room?V1.0?2013.01.08?????+\n“);
printf(“\t+----------------------------------+\n“);
printf(“\t+?User?Commands?as?follows:????????+\n“);
printf(“\t+??????????????????????????????????+\n“);
printf(“\t+?l:?list?all?online?user??????????+\n“);
printf(“\t+?i:?Login?????????????????????????+\n“);
printf(“\t+?o:?logOut????????????????????????+\n“);
printf(“\t+?c:?Chat?with?other?online?user???+\n“);
printf(“\t+?a:?Chat?with?all?online?user?????+\n“);
printf(“\t+?f:?transfer?a?File?to?others?????+\n“);
printf(“\t+?h:?Help??????????????????????????+\n“);
printf(“\t+----------------------------------+\n“);
}
int?get_choice(){
printf(“%s#?“?name);
int?answer?=?getchar(); //?eat?
while(getchar()?!=?‘\n‘); //?eat?
//putchar(answer);
return?answer;
}
void?func(int?sig){
printf(“\n%s#?“?name);
fflush(stdout);
}
int?send_to(int?target?int?cmd?char?*data){
return?send_msg(target?cmd?userid?data);
}
int?send_server(int?cmd?char?*data){
return?send_msg(TYPE_SERVER?cmd?userid?data);
}
int?chat(){
if(strlen(name)?==?0){
printf(“You?are?not?login!\n“);
return?ERR;
}
char?id[32];
char?data[256];
char?buf[256];
printf(“To:?[USR_ID]?“);
fflush(stdout);
if(fgets(id?sizeof(id)?stdin)?==?NULL){
perror(“fgets“);
return?ERR;
}
sprintf(data?“?%s?>?“?name);
id[strlen(id)?-?1]?=?0;
printf(“>>?“);
fflush(stdout);
if(fgets(buf?sizeof(buf)?stdin)?==?NULL){
perror(“fgets“);
return?ERR;
}
strcat(data?buf);
data[strlen(data)?-?1]?=?0;
send_to(atoi(id)?CMD_CHAT?data);
}
int?chat_all(){
if(strlen(name)?==?0){
printf(“You?are?not?login!\n“);
return?ERR;
}
char?data[256];
char?buf[256];
sprintf(data?“?%s?To?all?>?“?name);
printf(“To?all?>>?“);
fflush(stdout);
if(fgets(buf?sizeof(buf)?stdin)?==?NULL){
perror(“fgets“);
return?ERR;
}
strcat(data?buf);
data[strlen(data)?-?1]?=?0;
send_to(TYPE_SERVER?CMD_TOALL?data);
}
int?login(){
printf(“username:?\n“);
if(fgets(name?sizeof(name)?stdin)?==?NULL){
perror(“fgets“);
return?ERR;
}
name[strlen(name)?-?1]?=?0;
int?rand_type?=?random();
time_t?t;
time(&t);
sprintf(msg_snd.buffer?“%c:%s:%ld:%d“?CMD_LOGIN?name?t?rand_type);
#ifdef?_DEBUG
printf(“%s\n“?msg_snd.buffer);
#endif
//?get?a?random?type?to?login?server
msg_snd.mtype?=?TYPE_SERVER;
if(msgsnd(msgid?&msg_snd?strlen(msg_snd.buffer)+1?0)?0){
perror(“msgsnd“);
return?ERR;
}
//?wait?server?response
if(msgrcv(msgid?&msg_rcv?sizeof(msg_rcv)?rand_type?0)?0){
return?ERR;
}?else{
userid?=?atol(msg_rcv.buffer);
printf(“Login?OK?id?=?%d\n“?userid);
return?OK;
}
}
int?logout(){
if(strlen(name)?==?0){
return?ERR;
}
send_server(CMD_LOGOUT?“Logout“);
//?wait?server?response
if(msgrcv(msgid?&msg_rcv?sizeof(msg_rcv)?userid?0)?0){
return?ERR;
}else
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2013-01-09?11:30??chat\
?????文件???????12859??2013-01-09?10:56??chat\client
?????文件?????????159??2013-01-09?10:30??chat\Makefile
?????文件????????2709??2013-01-09?10:29??chat\msg.h
?????文件????????5731??2013-01-09?10:57??chat\msg_client.c
?????文件????????2470??2013-01-09?10:33??chat\msg_svr.c
?????文件???????12331??2013-01-09?10:56??chat\server
- 上一篇:hibernate的DTD文件,三個文件都有
- 下一篇:畢業設計文獻綜述庫存管理系統
評論
共有 條評論