- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
利用消息队列实多进程通信过程
课程设计报告
课程名称: Unix课程设计 设计题目: 利用消息队列实现多进程通信过程 姓 名: 专 业: 网络工程 班 级: 学 号:
计算机科学与技术学院
网络系
2013 年 12月 30 日
选题背景
在UNIX程序设计中消息队列是使用频率最高的几个对象之一,它常应用于对等进程间的通
信和客户—服务器之间的通信。
采用消息队列作为货物托运渠道可以弥补以下缺陷:
消息队列是一种先进先出的队列型数据结构,可以保证先送的货物先到达,后送的
货物后到达,避免了插队现象。
消息队列将输出的信息进行了打包处理,这样就可以保证以每个消息为单位进行接收了。
消息队列还可以将货物进行分类服务,标记各种类别的服务,这样就可以根据货物
类别分别出货。
消息队列是IPC对象的一种与同样提供先进先出服务的管道相比,它有如下特点:
(1)消息队列提供了消息的自动拆分功能,同时不能接收两次发送的消息。
(2)消息队列提供了不完全随机读取的服务,引入消息类型后,一个消息队列在逻辑上可以化身为多个不同消息类型的链表,用户可以自主选择接收某条逻辑链表上的消息,而不必依次接收队列的首条消息。
(3)消息队列提供了完全异步的读写服务。
基于以上背景,我们发现利用消息队列实现进程间的通信可以为我们提供方便,也会是通信效率更为提高。
设计思路
可以采用客户-服务器结构,其中服务器端实现各个用户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信。
编程实现两个进程间的通信,一个server(服务器)进程,一个client(客户)进程。
在client(客户)进程下选择注册或者登陆。
若是注册,则server(服务器)进程分给该客户一个新的登陆账号。多个客户的账号存储在register.txt文件中。
若是选择登陆,登陆成功后服务器进程会显示登陆成功,否则显示登陆失败。登陆后输入你要发送消息的对方的账号,输入账号后,服务器方显示该账号是否合理,如合理,即可实行通信。
主要问题的解决方法和关键技术
实现密码格式登录与注册,通过帐号显示用户名,显示发送消息的日期
程序流程图
原程序清单
//client.c
#includestdio.h
#includeunistd.h
#includesys/types.h
#includesys/stat.h
#includesys/ipc.h
#includesys/msg.h
#includetermio.h
#includetime.h
struct msgbuf{
long type;
char buf[1024];
};
struct msgbuf0{
long type;
pid_t pid;
char username[48];
char password[48];
char number[28];
};
void func();
void regist();//注册
void passw();
void inputpassw(char *P);
void enter();//登录
void data();
void stol(char*);//加密
void ltos(char*);//解密
struct msgbuf _msgbuf ;
struct msgbuf0 _msgbuf0,_msgbuf1;
int msgid,index,flag ;
long number;
pid_t pid,pid1;
FILE * fpr;
char username[16],password[16],buf[64],inde[4],flg[4];
void main(){//28
pid_t pid = getpid();
if((msgid = msgget(0x4321,0666|IPC_CREAT)) 0){
fprintf(stderr,msgget() failed.\n);
return ;
}
fprintf(stderr,注册please input z,登录 input d:);
scanf(%s,buf);
memset(_msgbuf0,0,sizeof(_msgbuf0));
if(buf[0] == 100){
enter();//登录
}
else if(buf[0] == 122){
re
文档评论(0)