版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上成绩:课程设计报告课程名称:Unix课程设计设计题目:利用消息队列实现多进程通信过程姓 名:专 业:网络工程班 级:学 号:计算机科学与技术学院网络系2013 年 12月 30 日专心-专注-专业一、 选题背景在UNIX程序设计中消息队列是使用频率最高的几个对象之一,它常应用于对等进程间的通信和客户服务器之间的通信。采用消息队列作为货物托运渠道可以弥补以下缺陷:(1) 消息队列是一种先进先出的队列型数据结构,可以保证先送的货物先到达,后送的货物后到达,避免了插队现象。(2) 消息队列将输出的信息进行了打包处理,这样就可以保证以每个消息为单位进行接收了。(3) 消息队列
2、还可以将货物进行分类服务,标记各种类别的服务,这样就可以根据货物类别分别出货。消息队列是IPC对象的一种与同样提供先进先出服务的管道相比,它有如下特点:(1)消息队列提供了消息的自动拆分功能,同时不能接收两次发送的消息。(2)消息队列提供了不完全随机读取的服务,引入消息类型后,一个消息队列在逻辑上可以化身为多个不同消息类型的链表,用户可以自主选择接收某条逻辑链表上的消息,而不必依次接收队列的首条消息。(3)消息队列提供了完全异步的读写服务。基于以上背景,我们发现利用消息队列实现进程间的通信可以为我们提供方便,也会是通信效率更为提高。二、 设计思路可以采用客户-服务器结构,其中服务器端实现各个用
3、户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信。编程实现两个进程间的通信,一个server(服务器)进程,一个client(客户)进程。在client(客户)进程下选择注册或者登陆。若是注册,则server(服务器)进程分给该客户一个新的登陆账号。多个客户的账号存储在register.txt文件中。若是选择登陆,登陆成功后服务器进程会显示登陆成功,否则显示登陆失败。登陆后输入你要发送消息的对方的账号,输入账号后,服务器方显示该账号是否合理,如合理,即可实行通信。三、 主要问题的解决方法和关键技术实现密码格式登录与注册,通过帐号显示用户名,
4、显示发送消息的日期四、 程序流程图五、 原程序清单/client.c#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/ipc.h>#include<sys/msg.h>#include<termio.h>#include<time.h>struct msgbuf long type; char buf1024;struct msgbuf0 long type; pid_t
5、pid; char username48; char password48; char number28; 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
6、,pid1; FILE * fpr; char username16,password16,buf64,inde4,flg4;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&qu
7、ot;,buf); memset(&_msgbuf0,0,sizeof(_msgbuf0); if(buf0 = 100) enter();/登录 else if(buf0 = 122) regist(); /注册 void func() memset(&_msgbuf,0,sizeof(_msgbuf); _msgbuf.type = atoi(_msgbuf0.username)+100; while(msgrcv(msgid,&_msgbuf,sizeof(_msgbuf.buf),_msgbuf.type,IPC_NOWAIT) != -1) fprintf(s
8、tderr,"%s receice.n",_msgbuf); memset(&_msgbuf,0,sizeof(_msgbuf); /signal(KILL,func);void regist() memset(_msgbuf0.username,0,16); memset(_msgbuf0.password,0,16); fprintf(stderr,"please input username (注册):"); scanf("%s",_msgbuf0.username); getchar(); if(strlen(_msg
9、buf0.username) < 3|strlen(_msgbuf0.username) > 16) fprintf(stderr,"the length of username cann't less 3(注册) and more 16.n"); regist(); _msgbuf0.pid = getpid(); _msgbuf0.type = 2;/查询 stol(_msgbuf0.username);/加密 passw();/密码_msgbuf0.type = 2 ; _msgbuf0.pid = getpid();stol(_msgbuf0.p
10、assword);/加密 fprintf(stderr,"do you want to get a number for chat:(y/n)"); if(getchar() = 'y') msgsnd(msgid,&_msgbuf0,128,0); memset(&_msgbuf0,0,sizeof(_msgbuf0); msgrcv(msgid,&_msgbuf0,128,getpid()+10000,0); ltos(_msgbuf0.number); fprintf(stderr,"恭喜你获得一个聊天账号:%s.n&
11、quot;,_msgbuf0.number); fprintf(stderr,"登录 please input 'd':"); scanf("%s",buf); if(buf0 = 100) enter();/登录 void passw() fprintf(stderr,"please input password (注册):"); inputpassw(_msgbuf0.password); /scanf("%s",_msgbuf0.password); while(strlen(_msgbuf0
12、.password) < 3|strlen(_msgbuf0.password) > 16) fprintf(stderr,"the length of password cann't less 3(注册) and more 16.n"); fprintf(stderr,"please input password (注册):"); inputpassw(_msgbuf0.password); /scanf("%s",_msgbuf0.password); fprintf(stderr,"please i
13、nput password again (注册):"); inputpassw(password); /scanf("%s",password); if(strcmp(_msgbuf0.password,password) memset(_msgbuf0.password,0,49); memset(password,0,17); fprintf(stderr,"两次输入的密码不一致,请从新填写信息。n"); passw();void enter() memset(&_msgbuf0,0,sizeof(_msgbuf0); fprint
14、f(stderr,"please input number (登录):"); scanf("%s",_msgbuf0.number); getchar();while(strlen(_msgbuf0.number) != 8)|(atoi(_msgbuf0.number) > )|(atoi(_msgbuf0.number) < ) fprintf(stderr,"please input number (登录):"); scanf("%s",_msgbuf0.number); getchar(); f
15、printf(stderr,"please input password (登录):"); inputpassw(_msgbuf0.password); _msgbuf0.type = 1 ; number = atoi(_msgbuf0.number) ; stol(_msgbuf0.number);/加密 stol(_msgbuf0.password);/加密 msgsnd(msgid,&_msgbuf0,128,0); memset(&_msgbuf,0,sizeof(_msgbuf); msgrcv(msgid,&_msgbuf,sizeof
16、(_msgbuf.buf),number,0); ltos(_msgbuf.buf); sscanf(_msgbuf.buf,"%01:%s",buf,username); if(!(strcmp(buf,"n") fprintf(stderr,"%s 登陆失败.n.n",username); enter(); fprintf(stderr,"%s 登陆成功.n.n",username); if(pid1 = fork() < 0) fprintf(stderr,"fork() failed.n&q
17、uot;); return ; if(pid1 > 0) data(); if(pid1 = 0) while(1) memset(&_msgbuf,0,sizeof(_msgbuf); if(msgrcv(msgid,&_msgbuf,sizeof(_msgbuf.buf),number+,MSG_NOERROR) != -1) ltos(_msgbuf.buf);/解密 fprintf(stderr,"n %snnsend:",_msgbuf.buf); memset(&_msgbuf,0,sizeof(_msgbuf); void dat
18、a() long number1 ; char username116; struct tm when ; time_t now ; while(1) fprintf(stderr,"please input 你要发送对方的账号 :"); memset(&_msgbuf1,0,sizeof(_msgbuf1); scanf("%s",_msgbuf1.number);while(strlen(_msgbuf1.number) != 8)|(atoi(_msgbuf1.number) > )|(atoi(_msgbuf1.number) &l
19、t; )|(atoi(_msgbuf1.number) = number) fprintf(stderr,"please input number again:"); scanf("%s",_msgbuf1.number); _msgbuf1.type = 4 ; _msgbuf1.pid = getpid(); number1 = atoi(_msgbuf1.number) ; stol(_msgbuf1.number);/加密 msgsnd(msgid,&_msgbuf1,128,0); msgrcv(msgid,&_msgbuf,s
20、izeof(_msgbuf.buf),getpid(),MSG_NOERROR); ltos(_msgbuf.buf); sscanf(_msgbuf.buf,"%01:%s",buf,username1); if(!(strcmp(buf,"y") while(1) memset(&_msgbuf,0,sizeof(_msgbuf); time(&now); when = *localtime(&now); fprintf(stderr,"send %s %02d:%02d:%02d %02d,%02d,%04d:&q
21、uot;,username1,when.tm_hour,when.tm_min,when.tm_sec,when.tm_mon+1,when.tm_mday,when.tm_year+1900); scanf("%s",_msgbuf.buf); if(!strcmp(_msgbuf.buf,"switch") data(); break; if(!strcmp(_msgbuf.buf,"exit") return ; time(&now); when = *localtime(&now); sprintf(_msgb
22、uf.buf,"%s:receive-%s-%d-%02d:%02d:%02d-%02d,%02d,%04dnnn",_msgbuf.buf,username,number,when.tm_hour,when.tm_min,when.tm_sec,when.tm_mon+1,when.tm_mday,when.tm_year+1900); stol(_msgbuf.buf);/加密 _msgbuf.type = number1 + ; msgsnd(msgid,&_msgbuf,strlen(_msgbuf.buf),0);/加密void stol(char *bu
23、f) long i ; char buf11024; sscanf(buf,"%s",buf1); memset(buf,0,sizeof(buf); for(i = 0;i < strlen(buf1);i+) sprintf(buf,"%s%03d",buf,buf1i+456);/解密void ltos(char *buf) int i ,n = strlen(buf); char buf14,data1024; memset(data,0,sizeof(data); for(i = 0 ;i < n;) memset(buf1,0,s
24、izeof(buf1); sscanf(buf,"%03s%s",buf1,buf); i = i+3 ; sprintf(data,"%s%c",data,atoi(buf1)-456); sprintf(buf,"%s",data);void inputpassw(char *buf) struct termio tm_new,tm_old; int fd = 0,c = 0; memset(buf,0,sizeof(buf); ioctl(fd,TCGETA,&tm_old) ; tm_new = tm_old ; tm
25、_new.c_lflag &=(ECHO|ICANON);/ECHO 显示输入字符 ICANON 使用标准输入模式 ioctl(fd,TCSETA,&tm_new) ; while(c = getchar() != 10) fprintf(stderr,"*"); sprintf(buf,"%s%c",buf,c); ioctl(fd,TCSETA,&tm_old) ; fprintf(stderr,"n");/Server.c#include<stdio.h>#include<unistd.
26、h>#include<sys/types.h>#include<sys/stat.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/ipc.h>#include<sys/sem.h>#include<sys/shm.h>struct msgbuf long type; char buf1024;struct msgbuf0 long type; pid_t pid; char username48; char password48; char num
27、ber28; void func(); void function(); void stol(char*);/加密 void ltos(char*);/解密 int rand1();/随机产生一个9位数 struct msgbuf _msgbuf ; struct msgbuf0 _msgbuf0,_msgbuf1 ; struct sembuf _buf; / pthread_t pid ; FILE *fpr,*fpw ; char buf64,username16,password16,inde4,flg4,*p,number10; int msgid,semid,shmid,index
28、 = 0,flag = 0,sum; pid_t pid ,pid_c;void main() if(semid = semget(0x1234,2,0666|IPC_CREAT) < 0) fprintf(stderr,"semget() failed.n"); return ; semctl(semid,0,SETVAL,1); semctl(semid,1,SETVAL,1); _buf.sem_flg = _buf.sem_flg & IPC_NOWAIT ; if(shmid = shmget(0x123,4,0666|IPC_CREAT) <
29、 0) fprintf(stderr,"shmget() failed.n"); return ; p = shmat(shmid,0,0); (*p) = 0 ; if(msgid = msgget(0x4321,0666|IPC_CREAT) < 0) fprintf(stderr,"msgget() failed.n"); return ; func();void func()if(msgrcv(msgid,&_msgbuf0,128,-2,0) != -1) if(pid = fork() < 0) fprintf(stder
30、r,"fork() failed.n"); return ; if(pid = 0) fprintf(stderr,"解密前 receive number is %s, username is %s, password is %s.n",_msgbuf0.number,_msgbuf0.username,_msgbuf0.password); ltos(_msgbuf0.username);/解密 ltos(_msgbuf0.number);/解密 ltos(_msgbuf0.password);/解密 pid_c = _msgbuf0.pid ; if
31、(_msgbuf0.type = 1) /denglu function(); if(_msgbuf0.type = 2) /zhuce _buf.sem_num = 0 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)+ ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signa
32、l(); if(fpr = fopen("./register.txt","r") = NULL) fprintf(stderr,"fopen() failed.n"); return ; memset(buf,0,sizeof(buf); see(); fclose(fpr); _buf.sem_num = 0 ;/ _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)- ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid
33、,&_buf,1);/signal(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); _buf.sem_num = 1 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); if(fpw = fopen("./register.txt","a+") = NULL) fprintf(stderr,"fopen() failed.n"); return
34、; index+ ; memset(buf,0,sizeof(buf); sprintf(buf,"%d %s %s %s %d",index,_msgbuf0.number,_msgbuf0.username,_msgbuf0.password,flag); fputs(buf,fpw); fputs("n",fpw); fclose(fpw); _buf.sem_num = 1 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); fprintf(stderr,"user %s re
35、gister success.n",_msgbuf0.username); _msgbuf0.type = _msgbuf0.pid + 10000 ;/ stol(_msgbuf0.number); memset(&_msgbuf0.username,0,sizeof(_msgbuf0.username); memset(&_msgbuf0.password,0,sizeof(_msgbuf0.password); fprintf(stderr,"nn%d-%s",_msgbuf0.type,_msgbuf0.number); msgsnd(ms
36、gid,&_msgbuf0,128,0); exit(1); else fprintf(stderr,"msgrcv() failed.n"); return ; func(); void function() _buf.sem_num = 0 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)+ ; _buf.sem_num = 0
37、; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(fpr = fopen("./register.txt","r") = NULL) fprintf(stderr,"fopen() failed.n"); return ; memset(buf,0,sizeof(buf); while(fgets(buf,sizeof(buf),fpr) sscanf(buf,"% % % % % ",inde,number,username,password,f
38、lg); memset(buf,0,sizeof(buf); if(!strcmp(number,_msgbuf0.number) && !strcmp(password,_msgbuf0.password) memset(&_msgbuf,0,sizeof(_msgbuf); _msgbuf.type = atoi(_msgbuf0.number) ; sprintf(_msgbuf.buf,"y:%s",username); stol(_msgbuf.buf); msgsnd(msgid,&_msgbuf,sizeof(_msgbuf.b
39、uf),0); flag = 2; break ; fclose(fpr); _buf.sem_num = 0 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)- ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(flag = 2) fprintf(std
40、err,"user %s 登录成功.nnn",username); data(); if(flag != 2) memset(&_msgbuf,0,sizeof(_msgbuf); _msgbuf.type = atoi(_msgbuf0.number) ; strcpy(_msgbuf.buf,"n:enter-failed"); stol(_msgbuf.buf); msgsnd(msgid,&_msgbuf,sizeof(_msgbuf.buf),0); fprintf(stderr," %s 登录failed.nnn&q
41、uot;,_msgbuf0.number); void data() while(1) memset(&_msgbuf,0,sizeof(_msgbuf); if(msgrcv(msgid,&_msgbuf1,128,4,MSG_NOERROR) != -1) ltos(_msgbuf1.number);/解密 _buf.sem_num = 0 ; _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); if(*p = 0) _buf.sem_num = 1 ; _buf.sem_op = -1 ; semop(semid,&a
42、mp;_buf,1);/wait(); (*p)+ ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(fpr = fopen("./register.txt","r") = NULL) fprintf(stderr,"fopen() failed.n"); return ; memset(buf,0,sizeof(buf); while(fgets(buf,sizeof(buf),fpr) sscanf(buf,"% %
43、 % % % ",inde,number,username,password,flg); if(!strcmp(number,_msgbuf1.number) memset(&_msgbuf,0,sizeof(buf); flag = 1; _msgbuf.type = _msgbuf1.pid; sprintf(_msgbuf.buf,"y:%s",username); stol(_msgbuf.buf); msgsnd(msgid,&_msgbuf,sizeof(_msgbuf.buf),0); fprintf(stderr,"%s exist.n",_msgbuf1.number); break ;/if /while fclose(fpr); _buf.sem_num = 0 ;/ _buf.sem_op = -1 ; semop(semid,&_buf,1);/wait(); (*p)- ; _buf.sem_num = 0 ; _buf.sem_op = 1 ; semop(semid,&_buf,1);/signal(); if(*p = 0) _buf.sem_num = 1 ;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年食品安全管理员测试题库(含参考答案)
- 片区排水管网整治项目技术方案
- 光伏组件运输与安装方案
- 负极材料生产过程监控与分析
- 2025防电信诈骗测试题及答案
- 2025年“安全生产活动月”《安全知识》竞赛答题活动题库(附答案)
- 会服考试试题及答案
- 车队安全 培训课件
- 淮滨教师遴选笔试真题及答案
- 五金加工项目风险管控方案
- 广铁校招机考题库
- GMP附录中药饮片培训
- 微视频短剧制作流程分析
- 好未来分析报告
- 审计资料交接清单
- 10-第10章-彩色图像处理
- 2023年安徽省中考历史试卷及答案开卷
- GB/T 33636-2023气动用于塑料管的插入式管接头
- 工程审计手册完整版
- 2019年11月中石油招聘考试笔试真题及参考答案
- 以工代赈乡村公路建设项目可行性研究报告(完整版)资料
评论
0/150
提交评论