资源简介
采用客户-服务器结构,其中服务器实现各个用户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信。
Linux IPC通信利用消息队列消息机制,多线程通信,字符串处理,链表操作,信号简单处理。消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来接收指定类似mtype的数据,从而实现进程间通信。
在服务器端实现广播功能,以及服务器退出以后通知;所有客户端退出并删除消息队列功能;对所有客户端的统计由链表实现
在客户端实现:上线提醒,下线提醒,服务器断线后子进程都退出。

代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include “msg.h“
int main()
{
key_t key;
pid_t pid;
int msgid;
int TYPE_ME; //由getpid()来指定唯一该进程才有的mtype
struct msgbuf msg;
TYPE_ME = getpid(); //用自己的进程号作为自己接收消息的消息类型
//生成消息队列的key
if((key = ftok(“./“‘s‘))==-1){
perror(“ftok error.“);
exit(0);
}
//如果服务器已创建消息队列才可以打开,客户端无权创建
if((msgid = msgget(keyMSG_Q_PERM))==-1){
printf(“[server maybe not on line...]\n“);
exit(1);
}
//实现登录操作
printf(“请输入登录用户名:“);
fgets(msg.user_nameMSG_SIZEstdin);
msg.user_name[strlen(msg.user_name)-1]=‘\0‘;
msg.mtype = MSG_TO_SERVER;
msg.subtype = 1;
msg.pid = getpid();
msgsnd(msgid&msgMSG_LEN0); //MSG_SIZE是消息正文大小
//客户端双进程实现读写操作
if((pid = fork())==-1){
perror(“fork error.“);
exit(1);
}else if(pid == 0){ //子进程负责读
while(1){
msgrcv(msgid&msgMSG_LENTYPE_ME0);
//判断接收到的消息是否为quit
if(strncmp(msg.mtext“quit“4) == 0){
printf(“[server will close in 3 seconds...]\n“);
kill(TYPE_MESIGUSR1); //若接收到服务端关闭,kill所有进程
exit(0);
}
//检测用户是否输入exit退出操作
if(strncmp(msg.mtext“exit“4) == 0){
msg.subtype = 3;
}
//写成switch方便功能扩展
switch(msg.subtype){
case 1:
printf(“[%s Login]\n“msg.user_name);
break;
case 2:
printf(“[%s]: %s“msg.user_namemsg.mtext);
break;
case 3:
printf(“[%s Logout]“msg.user_name);
break;
default :
break;
}
}
}else{ //父进程用于发送消息
msg.mtype = MSG_TO_SERVER;
msg.subtype = 2; //设为广播模式
while(1){
printf(“[%s]:\n“msg.user_name);
fgets(msg.mtextMSG_SIZEstdin);
msgsnd(msgid&msgMSG_LEN0);
//当此进程输入exit时,表示进程推出聊天
//由服务器通知其他进程,该进程已下线
if(strncmp(msg.mtext“exit“4)==0){
msg.subtype = 3;
msgsnd(msgid&msgMSG_LEN0);
sleep(2);
kill(pidSIGKILL);
exit(0);
}
}
}
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-12-01 10:22 源代码\
文件 2355 2016-12-29 17:01 源代码\client.c
文件 299 2016-12-28 08:54 源代码\msg.h
文件 14 2016-12-29 17:22 源代码\sensitive.txt
文件 4648 2016-12-29 17:12 源代码\server.c
文件 267776 2017-12-01 10:28 多人聊天室.doc
- 上一篇:MFC 动态创建按钮
- 下一篇:PCA融合算法C++代码
相关资源
- 操作系统c语言模拟文件管理系统844
- C语言开发实战宝典
- C++中头文件与源文件的作用详解
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- 个人日常财务管理系统(C语言)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- C语言实现的一个内存泄漏检测程序
- DES加密算法C语言实现
- LINUX下命令行界面的C语言细胞游戏
- 用单片机控制蜂鸣器播放旋律程序(
- 学校超市选址问题(数据结构C语言版
- 电子时钟 有C语言程序,PROTEUS仿真图
- 尚观培训linux许巍老师关于c语言的课
评论
共有 条评论