Linux课程设计-网络音频点播器.doc_第1页
Linux课程设计-网络音频点播器.doc_第2页
Linux课程设计-网络音频点播器.doc_第3页
Linux课程设计-网络音频点播器.doc_第4页
Linux课程设计-网络音频点播器.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux课程设计报告Linux课程设计报告报告题目: 网络音频点播器 作者所在系部: 计算机科学与遥感信息技术学院 作者所在专业: 计算机科学与技术 作者所在班级: B12511 作 者 姓 名 : 王硕 作 者 学 号 : 20124051117 指导教师姓名: 王慧娟 完 成 时 间 : 2015年6月29日 Linux课程设计报告Linux下C语言高级编程课程设计任务书一、设计目的本课程设计是学生学习完Linux C高级编程课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。二、课程设计基本要求每人从所给题目中任选一个(如自拟题目,需经教师同意,可以多选,鼓励多做),每个学生必须独立完成课程设计,不能相互抄袭;设计完成后,将所完成的工作交由老师检查;要求写出一份详细的设计报告。三、设计内容及设计要求题目一: 基于Linux的网络实时音频组播系统网络音频多播系统有客户端和服务器两部分组成。服务器主要负责把不同频道的数据发送到相应的多播组,服务器采用多线程模型以提高运行质量,音频数据使用流媒体。客户端采用多进程模式,进程间通信方式采用管道或者本地套接字,主进程负责从多播组接收数据并写入管道,子进程从管道中读出数据并调用播放器播放音频。题目二:基于Linux的企业内部通信工具企业内部通信工具由客户端和服务器组成,多个客户端对应一个服务器,该项目能够保证公司的秘密资料只在公司内部流动,并且能够让员工之间方便通信。服务器包括注册处理、聊天处理、登陆处理、传输文件处理四个模块。客户端包括注册、登陆、聊天、传输文件四个模块。客户端之间的通信由服务器转发并做好记录。题目三:自拟题目要符合课程设计的难度和工作量(要求学生如自拟题目提前与老师沟通)。 四、课程设计考核方式课程设计成绩评定的依据有设计文档资料、具体实现设计方案的程序及课程设计考勤登记表,其中平时成绩占总成绩的20%。(注:最后需要验收)优:有完整的符合标准的文档,文档有条理、文笔通顺,格式正确,其中有总体设计思想的论述;程序完全实现设计方案,设计方案先进,软件可靠性好;良:有完整的符合标准的文档,文档有条理、文笔通顺,格式正确;有完全实现设计方案的软件,设计方案较先进;中:有完整的符合标准的文档,有基本实现设计方案的软件,设计方案正确;及格:有完整的符合标准的文档,有基本实现设计方案的软件,设计方案基本正确;不及格:没有完整的符合标准的文档,软件没有基本实现设计方案,设计方案不正确。提交的电子文档和软件必须是由学生自己独立完成,雷同者教师有权视其情况扣分或记零分。五、提交的资料1、文档有关的分析设计文档要求使用计算机打印A4纸上,同时提交电子文档。2、软件软件需提供加注释的源程序,并能正常运行。注:对于分析设计中未能实现的部分需要加以说明。对于软件中所参考的部分模块或代码需要加以声明,并说明出处。摘 要 随着Internet的日益普及,在网络上学会配置网络服务器,有着非常重要的意义。综合网络服务器基于Linux操作系统之上,进行服务器与客户端的连接,实现服务器为客户端提供服务。其实训内容包括Linux服务器搭建与测试,服务器搭建与应用网络访问,以及流控令牌桶等等。综合网络服务器的功能强大,操作简单,扩展性强,稳定性高;方便不同操作系统平台之间的移植,网站最大限度的实现易维护和易操作性。Linux是一套免费使用和自由传播的操作系统,以其稳定性和灵活性著称。完善的内置网络是Linux的一大特点。Linux为用户提供了完善的、强大的网络功能。作为一种网络操作系统,它在网络服务器上得到了广泛的应用。关键词: 域名访问、Linux、网络服务器、服务器配置目 录第1章 系统分工- 1 -1.1系统总体功能简介- 1 -1.2实验内容- 1 -第2章 系统的总体设计- 2 -2.1技术支持- 2 -2.2设计方案- 2 -2.3服务器概述- 2 -2.4 客户端概述- 3 -第3章 服务器设计- 4 -3.1管道- 4 -3.2令牌桶TBF流控- 4 - 3.3创建频道链表- 4 -3.4频道广播- 5 -3.5数据发送- 6 -第4章 客户端设计- 7 -4.1选择频道- 7 -4.2接收数据- 8 -第5章 系统调试- 9 -5.1 系统的调试- 9 -5.2 客户端调试- 9 -5.3 服务器调试- 10 -第6章 总结- 12 -系统使用说明书- 13 -部分代码说明:- 13 -.H文件- 13 -Proto.h- 13 -site_types.h- 14 -Client端:- 14 -Server端:- 19 -评语- 22 -成绩:- 22 - 3 -第1章 系统分工1.1系统总体功能简介 本软件实现了基于客户机和服务器模型的网络音频点播系统,是嵌入式系统在音频领域中的一个典型应用。本音频点播系统可以广泛应用在卡拉OK厅、语音教室和公共广播等多种场所。该软件分为服务器和客户机两个部分,服务器运行在PC机上,客户机运行在嵌入式设备上,服务器以多播的方式向局域网中所有的客户机发送数据,客户机可以根据自己的选择来决定要接收的数据。1.2实验内容 在VMware Workstation 11.0平台下,使用Red Hat Enterprise Linux 6.2终端,基于socket开发网络音频点播程序,服务端能够捕捉音频流并发送到需要点播的客户端,客户端接收到音频并播放,并且客户端可以自由切换频道。 第2章 系统的总体设计2.1技术支持虚拟机环境:VMware Workstation 11.0Linux系统: Red Hat Enterprise Linux 6.2 2.2设计方案 该软件分为服务器和客户机两个部分,服务器运行在PC机上,客户机运行在嵌入式设备上,服务器以多播的方式向局域网中所有的客户机发送数据,客户机可以根据自己的选择来决定要接收的数据,示意图如图2-1所示。图2-1 总体布局2.3服务器概述 音频的捕捉:开始父进程建立一个匿名管道用于父子进程之间的通信,建立一个临时文件用于当作接收音乐数据的缓存文件。 音频数据的缓存:令牌桶TBF流控,由于本设计是在局域网中实现的,如果不限速的话会因服务器发送数据太快而使客户机音乐播放失真,因此加入了令牌桶TBF限速技术,限速的原理是根据mp3音乐的播放码率控制服务器父进程单位时间内写入管道的数据流,这样配合上述的管道就可实现与mp3音乐播放速度相同的数据流发送。 多客户支持和管理:能够支持多个客户机同时接收网络音频。2.4 客户端概述音频数据的接收:能够接受服务端发送的音频信息。音频数据的播放:能够播放所接收的音频。频道的切换:能够实现切换频道。第3章 服务器设计3.1管道管道是Linux中很重要的一种通信方式,是把一个进程的输出直接连接到另一个进程的输入, 常说的管道多是指无名管道,实际上,管道是一个固定大小的缓冲区,在Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。在本设计中使用了自己由队列实现的管道,遵循先进先出的原则,在该程序中服务器程序父进程把音乐或者频道文件发到管道中,然后其他子进程从管道中读取数据发到网络上。3.2令牌桶TBF流控由于本设计是在局域网中实现的,如果不限速的话会因服务器发送数据太快而使客户机音乐播放失真,因此加入了令牌桶TBF限速技术16,限速的原理是根据mp3音乐的播放码率控制服务器父进程单位时间内写入管道的数据流,这样配合上述的管道就可实现与mp3音乐播放速度相同的数据流发送。3.3创建频道链表该软件服务器端的核心部分是创建一个频道链表,在这个频道链表中存放着和频道数一样多的链表节点,每个链表节点中存放着对应频道的所有信息,如:频道号,创建该频道的线程id,本频道的描述等,创建频道链表的流程图如图4-2所示。 图4-2 创建频道链表的流程3.4频道广播在服务器程序启动后,父进程会首先创建一个频道线程,这个线程专门负责向网络上发送服务器端的音乐音乐列表,每隔0.5秒更新一次,音乐列表的数据包的id为0。3.5数据发送服务器父进程会创建与频道数量相同的数量的频道线程,这些频道线程各自负责本频道音乐数据的发送,音乐数据包的id与频道编号相等,这样便于客户机的选择接收。发送流程图如图4-3所示。 图4-3发送流程图 第4章 客户端设计4.1选择频道在服务器已经运行的基础上打开客服端时,客户机会收到由服务器发来的多播包,内容是音乐频道列表,音乐频道的id是0,所以此时客户机只接收id等于0的数据包,该实现的核心函数是rcv_channel(),首先用一个while死循环来等待接收音乐频道列表,当列表收到退出循环,此时程序应该阻塞等待用户输入频道id,当用户输入频道id后父进程创建一个子进程,这个子进程拿着用户输入的频道id去调用接收音乐数据接收函数rcv_music()。当切换频道后,父进程会杀死正在播放音乐的子进程,然后重新创建一个子进程去执行rcv_music()函数播发新的频道。接收频道列表流程图如图4-4所示。 图4-4 客户机接收频道列表流程图4.2接收数据开始父进程建立一个匿名管道用于父子进程之间的通信,建立一个临时文件用于当作接收音乐数据的缓存文件。接收音乐数据函数拿到频道id后,每次接收到来自服务器的多播包时都会把包中的id与频道id进行比较,如果id相等则说明该包是客户机所点播的音乐数据包,父进程把陆续收到的音乐数据包都写到已经创建好的缓存文件中,父进程再创建一个子进程(以下称之为小父进程)用于音乐的播放,该小父进程再创建一个子进程,小父进程从缓存文件中读取音乐数据放到匿名管道中,子进程把管道的标准输出重定向到标准输出,此时在该进程中从标准输入读数据便相当于从管道中读数据,然后用excel调用mplayer进程去标准输入读数据进行播发。接收音乐数据包流程图如图4-5所示。 图4-5 接收音乐数据包流程图第5章 系统调试5.1 系统的调试完成系统的软硬件设计后,就可以进行系统的调试了。基于客户端与服务器两部分,其服务器较为复杂,需要redhat安装交叉编译环境。5.2 客户端调试客户端部分的代码是在redhat中编译,在终端上运行的。频道选择函数static void *choose_thr(void *unused)char ch;while (1) ch = getchar();getchar();if (ch 0)break;chooseid = ch - 0;pthread_exit(NULL);inet_pton(AF_INET, client_conf.mgroup, &mreqn.imr_multiaddr);/client_conf.mgroup加入多播组,有发就可以收接收数据:while (1) /*收包*/len = recvfrom(sd, msg_list, MSG_LIST_MAX, 0, (void *)&listaddr, &listaddr_len);if (len id != CHNLISTID) fprintf(stderr, this is not matchn);continue;break;5.3 服务器调试服务器模块的代码全部在redhat中编译和运行。static void sock_init(void)struct ip_mreqn reqn;serversd = socket(AF_INET, SOCK_DGRAM, 0);if (serversd 0) fprintf(stderr, socket() ERRORn);exit(1);inet_pton(AF_INET, DEFAULT_MGROUP, &reqn.imr_multiaddr);inet_pton(AF_INET, 0.0.0.0, &reqn.imr_address);reqn.imr_ifindex = if_nametoindex(eth0);if (setsockopt(serversd, IPPROTO_IP, IP_MULTICAST_IF, (void *)&reqn, sizeof(reqn) 0) fprintf(stderr, setsockopt() errorn);exit(1);sndaddr.sin_family = AF_INET;sndaddr.sin_port = htons(atoi(DEFAULT_RCVPORT);inet_pton(AF_INET, DEFAULT_MGROUP, &sndaddr.sin_addr);主函数:int main(void)/getoptint err;int i;sock_init();err = mlib_getchnlist(&list, &listsize);if (err) fprintf(stderr, mlib_getchnlist error);exit(1);thr_list_create(list, listsize);#if 1for (i = 0; i listsize; i +)thr_channel_create(list + i);#endifwhile (1) pause();第6章 总结本文提出了一套完整的网络音频点播器的方案,本软件实现了基于客户机和服务器模型的网络音频点播系统14,是嵌入式系统在音频领域中的一个典型应用。本音频点播系统可以广泛应用在卡拉OK厅、语音教室和公共广播等多种场所。该软件分为服务器和客户机两个部分,服务器运行在PC机上,客户机运行在嵌入式设备上,服务器以多播的方式向局域网中所有的客户机发送数据,客户机可以根据自己的选择来决定要接收的数据。通过这次设计,我理解了嵌入式开发的流程,以及开发过程中需要考虑的关键问题,能熟练使用redhat进行基本操作。在设计过程中,配置了虚拟机和WIN7之间的共享文件,安装了redhat,搭建了socket服务,在网络中链接,方便调试。在网上查找各种redhat的配置资料,建立了交叉编译环境。通过以上努力,基本完成了系统设计的环境搭建,并且从中学习了许多redhat操作系统的使用方法和系统用到的技术:(1) 学会使用makefile文件进行自动化编译。(2) 明白了令牌桶基本原理。(3) 学会分析wireshark数据帧格式。(4) 了解了eclipse界面设计过程。(5) 能够正确设置多播组,并读取管道中发来的数据。系统中还有很多不足之处需要改进:(1) 客户端读取歌曲信息时,播放时会出现断断续续的情况,流控不是很好。系统使用说明书部分代码说明:.H文件Proto.h#ifndef PROTO_H#define PROTO_H#include #define DEFAULT_RCVPORT 1999#define DEFAULT_MGROUP192.168.43.123#define CHANNR200#define MINCHNID1#define MAXCHNID(CHANNR + MINCHNID -1)#define CHNLISTID0#define MSG_CHANNEL_MAX(65536 - 20 -8)struct msg_channel_st chnid_t id;/*MUST BETWEEN MIXCHNID AND MAXCHNID*/uint8_t data1;_attribute_(packed);struct msg_listentry_st chnid_t id;/*MUST BETWEEN MIXCHNID AND MAXCHNID*/uint16_t len;uint8_t desc1;_attribute_(packed);#define MSG_LIST_MAX(65536 - 20 -8)struct msg_list_st chnid_t id;/*MUST BE CHNLISTID*/struct msg_listentry_st entry1;_attribute_(packed);#endifsite_types.h #ifndef SITE_TYPES_H #define SITE_TYPES_H #include typedef uint8_t chnid_t; #endifClient端:Main函数:#include #include #include #include #include #include #include #include #include #include #include #include client_conf.h/socket绑定后,加入多播组,父进程从管道收菜单包,收频道包,子进程从管道读。/*getopt *-M 指定多播组 *-P 指定端口 *-p 指定播放器 *-H 显示帮助 */struct client_conf_st client_conf = .rcvport = DEFAULT_RCVPORT,.mgroup = DEFAULT_MGROUP,.player = DEFAULT_PLAYER;/注意结构体赋值之间用逗号隔开。定义时用分号。static void print_help(void) printf(-M 指定多播组n -P 指定端口n -p 指定播放器n -H 显示帮助n);static int writen(int fd, const char *buf, int len)int ret, pos;pos = 0;while (len 0) ret = write(fd, buf + pos, len);len -= ret;pos += ret;if (pos = 0) return -1;return pos;static int chooseid = -1;static void *choose_thr(void *unused)char ch;while (1) ch = getchar();getchar();if (ch 0)break;chooseid = ch - 0;pthread_exit(NULL);int main(int argc, char *argv)char ch;int sd;pid_t pid;int pfd2;struct sockaddr_in myaddr, listaddr, chnaddr;socklen_t listaddr_len, chnaddr_len;struct ip_mreqn mreqn;struct msg_list_st *msg_list;struct msg_channel_st *msg_channel;int ret;int len;pthread_t tid;while (1) if (ch = getopt(argc, argv, M:P:p:H) 0) break;switch (ch) case M:client_conf.mgroup = optarg;break;case P:client_conf.rcvport = optarg;break;case p:client_conf.player = optarg;break;case H:print_help();break;default:break;sd = socket(AF_INET, SOCK_DGRAM, 0);if (sd 0) perror(socket();exit(1);inet_pton(AF_INET, client_conf.mgroup, &mreqn.imr_multiaddr);/client_conf.mgroup加入多播组,有发就可以收inet_pton(AF_INET, 0.0.0.0, &mreqn.imr_address);mreqn.imr_ifindex = if_nametoindex(eth0);/*if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn) 0) perror(setsockopt();exit(1);*/myaddr.sin_family = AF_INET;myaddr.sin_port = htons(atoi(client_conf.rcvport);inet_pton(AF_INET, 192.168.43.123, &myaddr.sin_addr);if (bind(sd, (struct sockaddr *)&myaddr, sizeof(myaddr) 0) perror(bind();exit(1);if (pipe(pfd) 0) perror(pipe();exit(1);pid = fork();if (pid 0) close(pfd0);execl(/bin/sh, sh, -c, client_conf.player, NULL);perror(execl();exit(0);close(pfd0);msg_list = malloc(MSG_LIST_MAX);if (msg_list = NULL) fprintf(stderr, msg_list malloc()n);exit(1);listaddr_len = sizeof(listaddr);while (1) /*收包*/len = recvfrom(sd, msg_list, MSG_LIST_MAX, 0, (void *)&listaddr, &listaddr_len);if (len id != CHNLISTID) fprintf(stderr, this is not matchn);continue;break;struct msg_listentry_st *pos;for (pos=msg_list-entry; (char *)poslen) printf(channel %d : %sn, pos-id, pos-desc);free(msg_list);/*选择频道*/pthread_create(&tid, NULL, choose_thr, NULL);msg_channel = malloc(MSG_CHANNEL_MAX);if (msg_channel = NULL) fprintf(stderr, msg_channel malloc()n);exit(1);chnaddr_len = sizeof(chnaddr);int fdt = open(test, O_RDWR | O_CREAT, 0666 );printf(chooseid = %dn, chooseid);while (1) /*收包*/len = recvfrom(sd, msg_channel, MSG_CHANNEL_MAX, 0, (void *)&chnaddr, &chnaddr_len);if (len id = chooseid) /*写进管道*/ret = write(fdt, msg_channel-data, len-sizeof(chnid_t);ret = writen(pfd1, msg_channel-data, len-sizeof(chnid_t);if (ret 0) fprintf(stderr, write pipe errorn);exit(1);printf(channel %d recive %d datan, chooseid, ret); return 0;Server端:Main函数#inc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论