资源简介
本程序主要是针对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文件,三个文件都有
- 下一篇:毕业设计文献综述库存管理系统
相关资源
- Linux操作系统实验教程源码.zip
- linux 0.11 bochs2.6.9配置文件
- socketcan提供的linux下的CAN网络工具包
- linux udev源代码
- libv4l-0.6.2-test.tar.gz
- makefile的详细说明文档
- IOCP服务器、客户端终极网络聊天室代
- 利用信号进行进程间通信
- Linux中的网络数据包捕获
- 基于QT+Linux的网络聊天室
- 银行家算法linux下实现
- linux下哲学家进餐问题实现
- UCloner-10.04.7.tar.gz
- linux libgcc_s.so.1 libgcc_s-4.4.5-20110214.
- uClinux-dist-20070130.tar.tar
- linux 实验7
- Linux iptables防火墙深度理解与实战应用
- 老李的局域网聊天室.rar
- makefile实验——华农Linux实验8
- quartus_II_13.1链接
- zw_(linuxc)linux进程监控和进程守护程
- 消息队列通信设计
- linux 下的无线点菜系统
- libxl注册机源码支持window和linux
- linux操作系统实验二
- qt聊天室程序
- WebSocket .net聊天室源代码
- Linux基线修复
- wiegand维根协议驱动程序
- linux内核中断
评论
共有 条评论