已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
韶 关 大 学毕 业 设 计毕业论文题目:linux下远程考试服务器处理系统姓 名:xxx学 号:061101321083系(院):计算机科学学院专 业:计算机科学与技术班 级:2006级计算机科学与技术3班 指导教师姓名及职称:张地 副教授 起止时间:2009年11月 2010年 1 月(教务处制表)linux下远程考试服务器端处理系统 摘要:本设计分析了考试服务器的工作原理和工作机制以及linux的网络编程环境,对文件的操作,多进程(并发)管理,实现了一个linux局域网的考试服务器系统。本设计实现的考试服务器处理系统可在版本为freebsd 7.1的redhat linux9等各种类unix操作系统上编译成功,具体代码用gnu c语言编程实现的。系统分为客户端和服务器端两大模块。论文首先对考试服务系统的原理和机制以及linux socket网络编程环境作了一个介绍,然后描述考试服务系统开发的整个过程,包括系统需求分析、总体分析、详细设计以及部分关键代码解析。采用演化模型,设计时首先在短时间内建立系统应用原型,然后对初始原型系统进行需求迭代,不断修正和改进,直到形成满意的实际可行的系统。关键字: 多进程;linux;网络编程;socket;服务器端;文件操作under linux the remote test server-side development abstract: the design and analysis of the test servers working principle and working mechanism, and linux network programming environment, the file operations, multi-process (concurrent) management, implements a linux lan server system examination. the design and implementation of the examination server processing system is available on freebsd 7.1 version of redhat linux9 and other unix-operating system compilation is successful, a specific code with gnu c programming language implementation. system is divided into two main client and server-side modules. first, the examination papers of the principles and mechanisms of service systems, as well as linux socket network programming environment made a presentation and then describe the test system development services to the entire process, including system requirements analysis, the overall analysis, detailed design, as well as some of the key code to parse. use of evolutionary model, designed to create a system in a short time when the first application of a prototype, and then iterate the initial prototype of the system requirements, and constantly revised and improved, until the formation of a satisfactory practical system.key words: multi-process; linux; network programming; socket; server; file operations 目 录引言61 简述71.1远程考试服务器的发展及现状71.2考试服务系统与linux网络编程环境分析71.3 tcp协议简介81.4开发平台简介81.5套接字简介91.6 socket编程的基本流程91.7 系统使用的主要函数介绍101.7.1 socket()函数101.7.2 accept()函数101.7.3 connect()函数111.7.4 read()和write()函数111.7.5 lseek()函数121.7.6 alarm()函数121.7.7 signal()函数121.7.8 fork()函数132 系统需求分析132.1服务器端功能需求132.2服务器端性能需求142.3客户端功能需求142.4客户端性能需求152.5系统错误处理需求153 系统概要设计153.1系统概要设计准则153.1.1功能简洁实用性163.1.2系统结构紧凑性163.1.3系统可扩展性163.1.4系统可靠性163.2 系统模块设计173.2.1系统总体工作模型173.2.2服务器父进程模块173.2.3服务器子进程模块193.2.4客户端父进程模块203.2.5客户端子进程模块214 数据库设计224.1数据库总体设计224.2用户信息数据文本234.3保存答案数据文本234.4存放试题数据文本244.5保存登录过的用户数据文本244.6保存提交答案出错信息文本244.7临时存放客户答案数据文本245 系统详细设计255.1服务器父进程监听连接255.2服务器父进程系统管理275.3服务器父进程回收子进程325.4服务器子进程验证用户登录325.5服务器子进程等待接收答案355.6客户父进程处理考试时间回收子进程375.7客户子进程读取试题回送答案395.8客户子进程处理超时没提交答案406 系统测试406.1 测试方法与结果407 总结417.1系统存在的不足与展望41致谢42参考文献43引 言传统考试是以纸为媒介的,摆脱不了印刷试卷,课堂考试,人工判卷,填写成绩单,输入考试成绩等一系列环节。不仅浪费纸张,而且占用了老师的大量时间,导致教学效率低下。远程考试系统使用计算机建立统一的试题库,统一考核,统一评卷,节省了教师的宝贵时间,提高了工作效率,而且消除了人为的主观意志影响,使考试更加标准化,更能真实地反映教学情况,提高教学质量。在诸多支持网络的操作系统中,linux以其优秀的性能越来越引起人们的关注。linux目前已经进入了许多主流公司的事业,电信、金融、政府、军事等领域也广泛采用它。使用linux作为考试服务器,可以与各种开源开源软件共同使用,在满足用户需求的基础上降低了系统价格,且非常稳定。这次毕业设计就是探讨文件管理技术,多进程并发与linux的网络编程开发,并实现一个基于linux局域网的实时考试系统,为将来在这方面的发展打下一个基础。考试服务器系统的设计与实现需要有多进程并发管理,文件传输读写管理和linux网络编程的相关背景知识,这样才能对考试服务器系统的特性有了解,才能了解考试服务器系统的架构和工作原理。考试服务器离不开网络,网络通信是考试服务器技术的关键所在,只有具有网络编程方面的知识和实践才能具有实现数据的网络传输功能的能力。软件的实现并不只是简单的编程过程,一个系统的设计实现需要用软件工程的思想,将正确的管理技术和技术方法结合起来,采用工程的概念、原理、技术和方法来开发和维护。软件的开发是一个规范的过程。利用这次毕业设计的机会把课堂上学来的东西,加以消化加以验证,理论与实践相结合。作为计算机专业的学生,若要提高自己的编程水平,除了从书本以及其他媒介吸取好的编程思维和方法之外,自己动手实践是一个必不可少的过程,只有这样才能够将理论知识加以消化为己所用。在毕业设计的过程中,多学习理论知识并且尽可能的自己动手实践,在实际的环境下去锻炼自己实际的能力,这就是本次毕业设计的意义与目的所在。1 简述1.1 远程考试服务器的发展及现状网上考试在国外一些国家已经得到了蓬勃发展,人们选学课程和考试都是通过网上进行的。例如国外一些著名的考试,如microsoft公司的mcse(microsoft系统工程师认证考试)、gmat(工商管理硕士入学考试)、托福考试等,都是采用网上考试的形式进行的。在国内,目前绝大多数考试还停留在传统考试方式上,对网络的真正应用仅限于一些考试的网上报名工作和网上成绩查询,还没有真正形成网上考试规模。网络技术的发展使得考试的技术手段和载体发生了划时代的变化,考试从传统的纸笔考试到计算机辅助考试再发展到基于互联网的网上考试成为现实。现阶段,网上考试系统的主流开发技术已经相当成熟,且很好地适应了考试服务器的安全性,实时性和可靠性要求,是当前网上考试软件得以实现的主流技术之一。在对大量关于网上考试系统资料的研究和学习后,根据工作的需要,针对本校实际情况特别是教学的需求,利用学校校园网已有的基础条件,研究开发适合本校使用的基于校园网的网上考试服务器端处理系统,有助于加快学校现代化的发展,提高教学效率。1.2 考试服务系统与linux网络编程环境分析作为考试服务器,要有足够的安全性,可靠性,稳定性。数据库要实现保存用户信息,保存试题,保存用户提交的答案。功能上能提供设置合法的考试时间,验证用户的登录,拒绝非法用户登录,若用户登录成功,回送试题和服务器设定的考试时间,等待用户提交答案,对考试时间进行限制,对用户提交的答案进行评分,添加删除用户等。linux网络编程中使用的socket数据传输是一种特殊的i/o,socket也是一种文件描述符。socket也具有一个类似于打开文件的函数调用socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket实现的。常用的socket类型有两种:流式socketsock_stream和数据报式socketsock_dgram。流式是一种面向连接的socket,针对于面向连接的tcp服务应用;数据报式socket是一种无连接的socket,对应于无连接的udp服务应用。socket()的参数中domain的值一般为af_inet族,它的结构体类型是: struct sockaddr_in sa_family_t sin_family; unit 16_t sin_port; struct in_addr sin_addr; unsigned char sin_zero8; struct in_addr unit 32_t s_addr;1.3 tcp协议简介tcp提供了完全可靠的通信服务,它能够自动重传;计算校验和以保证数据的正确性;tcp协议保证数据在接受端按在发送端的次序接收,不会出现后发送数据先到达的情况;能自动地丢弃那些重复传输的数据;它提供了流量控制机制,保证发送者发送的数据不要太快以至于接收者来不及处理它们,甚至还考虑了不以过快的速度发送数据以防止整个网络拥塞。当由于某种原因tcp通信无法进行时,会通过一定的手段通知应用程序,但tcp是一个面向字节流的协议,为了提高传输或重转效率,tcp可能会把应用程序多次write的一段段数据,粘接在一起作为一个数据包,或者分解成多个数据包传送,tcp协议无法为传输的数据提供边界记录,故应用程序应设法利用这个可靠字节流传送设计自己的数据表示格式以保持记录边界。1.4 开发平台简介linux系统下的gcc(gnu c compiler)是gnu推出的功能强大、性能优越的多平台编译器,是gnu的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。gcc包含完整的出错检查和警告提示功能,它们可以帮助linux程序员尽快找到错误代码,从而写出更加专业和优美的代码。代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能,故在linux平台下用c编写高质量的程序,gcc编译平台是一个很好的选择。调试器gdb能让你观察另一个程序在执行时的内部活动,或程序出错时发生了什么。gdb主要能做四件事(包括为了完成这些事而附加的功能),帮助用户找出程序中的错误。运行程序,设置所有的能影响程序运行的东西。保证程序在指定的条件下停止。当程序停止时,让用户检查发生了什么,那样用户可以试着修正某个bug引起的问题,然后继续查找另一个bug。1.5 套接字简介 套接字,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程 。应用层通过传输层进行数据通信时,tcp和udp会遇到同时为多个应用程序进程提供并发服务的问题。多个tcp连接或多个应用程序进程可能需要通过同一个 tcp协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与tcpip协议交互提供了称为套接字(socket)的接口。 区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的ip地址、使用的传输层协议(tcp或udp)和使用的端口号。socket原意是 “插座”。通过将这3个参数结合起来,与一个“插座”socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。1.6 socket编程的基本流程每一个socket有一个本地的唯一socket号,由操作系统分配。套接字有3种类型:流式套接字(sock_stream)、数据包套接字(sock_dgram)和原始套接字。流式套接字可以提供可靠的、面向连接的通信流。如果通过流式套接字发送了顺序的数据:1、2。那么数据到达远程时候的顺序也是1、2。流式套接字可用于telnet远程连接、www服务等需要使数据顺序传递的应用,它使用tcp协议保证数据传输的可靠性。流式套接字的工作原理如下图所示: 图1.1流式套接字的工作原理图数据包套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠性。数据包套接字使用者数据包协议udp,数据只是简单地传送到对方。数据包套接字的工作原理如下图所示:图1.2数据包套接字的工作原理图1.7 系统使用的主要函数介绍1.7.1 socket()函数int socket(int domain,int type,int protocol)第一个参数domain设置为“af_inet”。第二个参数是套接口的类型:sock_stream或sock_dgram。第三个参数设置为0。系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。 1.7.2 accept()函数int accept(intsockfd,void*addr,int*addrlen)第一个参数是正在监听端口的套接口文件描述符。第二个参数addr是指向本地的数据结构sockaddr_in的指针。调用connect()中的信息将存储在这里。通过它你可以了解哪个主机在哪个端口呼叫你。第三个参数同样可以使用sizeof(structsockaddr_in)来获得,如果出错,accept()也将返回-1。1.7.3 connect()函数int connect(int sockfd,struct sockaddr* serv_addr,int addrlen)第一个参数还是套接口文件描述符,它是由系统调用socket()返回的。第二个参数是serv_addr是指向数据结构sockaddr的指针,其中包括目的端口和ip地址。第三个参数可以使用sizeof(structsockaddr)而获得。1.7.4 read()和write()函数ssize_t read(int filedes, void *buf, size_t nbytes)返回值:读取到的字节数;0(读到 eof);-1(出错)read 函数从 filedes 指定的已打开文件中读取 nbytes 字节到 buf 中。以下几种情况会导致读取到的字节数小于 nbytes : a. 读取普通文件时,读到文件末尾还不够 nbytes 字节。例如:如果文件只有 30 字节,而我们想读取 100 字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0 。 b. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。 c. 从网络读取时,网络缓存可能导致读取的字节数小于 nbytes 字节。 d. 读取 pipe 或者 fifo 时,pipe 或 fifo 里的字节数可能小于 nbytes 。 e. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。f. 在读取了部分数据时被信号中断。ssize_twrite(intfd,constvoid*buf,size_tnbytes) write函数将buf中的nbytes字节内容写入文件描述符fd。成功时返回写的字节数。失败时返回-1。并设置errno变量。在网络程序中,当我们向套接字文件描述符写时有俩种可能: a.write的返回值大于0,表示写了部分或者是全部的数据。 b.返回的值小于0,此时出现了错误.我们要根据错误类型来处理。如果错误为eintr表示在写的时候出现了中断错误,如果为epipe表示网络连接出现了问题(对方已经关闭了连接。1.7.5 lseek()函数off_t lseek(int filedes, off_t offset, int whence)返回值:新的偏移量(成功),-1(失败)参数 offset 的含义取决于参数 whence:1. 如果 whence 是 seek_set,文件偏移量将被设置为 offset。2. 如果whence 是seek_cur,文件偏移量将被设置为当前文件偏移量加上 offset,offset 可以为正也可以为负。3. 如果 whence 是 seek_end,文件偏移量将被设置为文件长度加上 offset,offset 可以为正也可以为负。seek_set、seek_cur 和 seek_end 是 system v 引入的,在这之前使用的是 0、1 和 2。1.7.6 alarm()函数int alarm(unsigned int seconds)函数说明 alarm()用来设置信号sigalrm在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds 为0,则之前设置的闹钟会被取消,并将剩下的时间返回。返回值:返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。1.7.7 signal()函数typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler) 参数: signum:信号编码。handler:新的信号处理句柄。返回说明:成功执行时,返回以前的信号处理句柄。失败返回sig_err。 功能描述: 为指定的信号安装新的处理句柄。信号处理句柄可能是用户指定的函数,sig_ign 或 sig_dfl。当信号到达时,如果其处理句柄是sig_dfl,那么会以默认的方式处理信号;如果其处理句柄是sig_ign,那么信号会被忽略;最后,如果处理句柄是用户指定的函数,此时先将信号处理方式重置为sig_dfl,接着有可能阻塞处理中的信号,最后是调用信号处理句柄。 1.7.8 fork()函数pid_t fork(void);正确返回:在父进程中返回子进程的进程号,在子进程中返回0错误返回:父进程中返回-1,没有子进程创建下面是发生错误时,可能设置的错误代码errno:eagain:系统调用fork不能得到足够的内存来复制父进程页表。或用户是超级用户但进程表满,或者用户不是超级用户但达到单个用户能执行的最大进程数。enomem:对创建新进程来说没有足够的空间,该错误是指没有足够的空间分配给必要的内核结构。2 系统需求分析2.1 服务器端功能需求基于liunx作为服务器的稳定性,数据库要实现保存用户信息,保存试题,保存用户提交的答案。功能上能提供设置合法的考试时间,验证客服端的合法登陆,拒绝非法用户登录,若用户登录成功,回送试题和服务器设定的考试时间,等待用户提交答案,对考试时间进行限制,对用户提交的答案进行评分,添加删除用户,实现在客户提交答案或考试完成后,终止终端再登陆,正确的实现添加删除用户,既要对添加的用户学号的长度进行限制,也要对口令长度进行限制,防止添加相同学号的用户。本系统不够完善的地方就是没能提供在服务器端保存多套试题,同时发放或任意抽取一份用于实际考试,此为不足之一;作为远程考试系统,系统维护管理中应该提供权限设置,题库管理,考试管理等功能,其中题库管理应该包括试题的录入,删除,修改,浏览等功能。本系统没有对服务器上管理用户的权限进行设置,为不足之二;采用c开发,由于时间仓促,对c操作数据库的各种函数不够熟悉,没能采用正规的数据库,此为不足之三;最后未能提供很好的网络出错故障的处理能力,此乃不足之四。本人正努力学习相关知识,致力于应用正规数据库开发考试服务器,希望能够更好地改善系统,争取能取得长足的进步。2.2 服务器端性能需求作为考试服务器,应该承受起大负荷的工作量,因为在为整个网络服务时,服务器端的工作量是普通工作站的几倍甚至几十倍。考试服务器端处理系统与普通客户端应用系统性能的主要区别如下:并发性(要求运算速度快);数据库要求存储容量大(包括内存容量和硬盘容量);可靠性和稳定性;安全性和实时性由于考试服务器面对的客户数量是几十甚至上百千,故对服务器的并发处理能力要求很高,运算速度快,内存容量和硬盘容量大作为服务器的硬件基础,是满足多用户数据并发计算的前提条件。当用户大批量登录时,对读取本地用户数据信息的能力要求非常迅速和可靠,故要求设计一个比较安全和健壮,运算速度快的算法或者循环实现这项功能;对非法用户的登录要严格识别,对客户传过来的数据要判断是否完整,如果是在internet上,还要判断用户的数据是否被更改。对传输中突然断线的用户数据要进行相应处理,即要有对网络出错故障的处理能力;对用户回送的答案要进行正确的保存,拒绝已提交答案用户再登录成功。安全关闭相应用户的连接,释放相应的内存空间,正确的实现添加删除用户,既要对添加的用户学号的长度进行限制,也要对口令长度进行限制,防止添加相同学号的用户。更重要的是:要对考试时长进行正确的判断。linux本来就是一种运行非常稳定的系统,在它之下开发的考试服务器相信也会运行稳定和可靠。同时,网络通信技术的成熟也为可靠性和实时性提供了有力的保障。2.3 客户端功能需求客户端要求实现安全登录服务器,读取服务器回送的试题和考试时长,根据这个时长设定时钟信号,然后创建一个本地临时文件,将该用户的学号先保存到这个文件中,然后进行试题的回答,每回答一题就写到本地临时文件中,答卷完毕,当用户提交答案时就把临时文件中的所有内容上传到服务器相关的文件中保存,服务器响应保存答案成功消息,然后客户端可删除本地这个临时文件,安全退出。当客户端超过一定时间不提交答案时,客户端会有主动提示考试所剩时间,在客户超时没有提交答案的情况下,会因设定的时钟信号而被强制退出。作为客户端,在未提交答案的情况下,要实现当想更改回答问题的答案时可随时更改,本系统客户端能很好地实现此功能。此外,当收到服务器保存答案的消息是不成功时,要实现重建连接,再次提交,直到提交成功为止,本系统客户端未能很好地提供此功能,即客户端的网络故障处理能力,此乃客户端的不足。2.4 客户端性能需求客户端最重要的是要求有很好的网络出错处理能力,因为单靠服务器端的出错处理是远远不够的,当本地客户因网络故障或者别的原因断线时,要正确地再次发起连接,判断数据是否已经传送完整,在传送不完整或者不成功的情况下要自动重传,当服务器接收答案不成功时也要重传,在确保所有信息都被服务器正确保存的前提下才能安全地关闭连接。然后,正确删除本地临时文件。超时情况下,要正确可靠地退出程序。最理想的是本地客户端也可实现禁止再登录。2.5 系统错误处理需求无论任何系统都有多多少少的bug存在,更别说一个没有经过系统测试的软件。故系统的错误处理需求也是很重要和必要的。在系统设计时,要设计各种出错时返回的识别码,系统要正确接收和处理这些识别码,返回相关的出错原因信息,方便程序编写调试,写出更高质量的代码。同时要很好地处理这些错误,防止系统崩溃。必要时候可以自动重启服务器程序,防止系统资源被过度消耗,安全地退出死循环,对每个连接的用户可以正确地分配一定限度的资源,对tcp/ip协议栈和接收缓冲区有很可靠的故障处理能力。同时要设计很完善的网络出错判断模块,系统要根据不同的原因采取不同的处理办法,防止因网络故障而丢弃客户端提交的答案或者使合法的用户无法登录。3 系统概要设计3.1 系统概要设计准则3.1.1 功能简洁实用性服务器端无需很友好的界面,主要是考虑简单实用和稳定,稳定既要系统的代码健壮,更要求没有必要的代码花销,故直接采用控制台的形式可以快速启动服务器,节约服务器资源,避免无需的额外花销。直接输入相应命令的方式可以很方便快捷地和系统进行交互,得到快速的响应,同时实用性表现在系统可以满足一个作为考试服务器的软件应有的功能需求,达到作为一个服务器软件应有的标准。由于客户端也采用控制台命令模式,故在设计时,尽量避免过多复杂的操作,且在相关的地方也会有系统提示,可满足用户的需求。3.1.2 系统结构紧凑性紧凑性就是一个设计能否装进人脑中的特性,测试软件紧凑性的一个很实用的好方法是:有经验的用户通常需要操作手册的辅助吗?如果不需要,那么这个设计就是紧凑的。本系统设计时基本上都是采用系统调用,而linux系统调用api是半紧凑的,且linux程序员很容易记住满足大多数应用编程(文件系统操作、信号和进程控制)的系统调用子集。要提高设计的紧凑性,有一个精妙但强大的方法,就是围绕“解决一个定义明确的问题”的强核心算法组织设计,避免臆断和捏造。本系统设计时,针对服务器软件应该提供的最主要功能,围绕这个功能不足深化和完善系统,尽量实现系统结构的紧凑性。3.1.3 系统可扩展性设计良好的代码允许更多的功能在必要时可以被插入到适当的位置中。这样做的危险是为了应对未来可能需要进行的修改,而造成代码被过度工程化地开发。可扩展性反映了软件适应“变化”的能力。在软件开发过程中,“变化”是司空见惯的事情,如需求、设计的变化,算法的改进、程序的变化等。在设计并发性时,采用多进程并发处理的方式,就是为了以后方便程序功能的扩展,模块化的设计思想也使系统有很好的可扩展性。3.1.4 系统可靠性可靠性(reliability)是产品在规定的条件下和规定的时间内完成规定功能的能力,他的概率度量称为可靠度。软件可靠性(software reliability)是软件系统固有特性之一,它表明了一个软件系统按照用户的要求和设计的目标,执行其功能的正确程度。软件可靠性与软件缺陷有关,也与系统输入和系统使用有关。理论上说,可靠的软件系统应该是正确、完整、一致和健壮的。但是实际上任何软件都不可能达到百分之百的正确,而且也无法精确度量。在系统设计时,要充分考虑对各种出错情况的处理,包括网络错误,用户输入的错误,系统本身的缺陷等,特别是要对用户的错误输入敏感,能够很好地处理各种错误是系统可靠性的必要条件。3.2 系统模块设计3.2.1 系统总体工作模型系统工作模型: 图3.1系统工作模型图3.2.2服务器父进程模块服务器父进程处理流程图: 图3.2服务器父进程处理流程图在主菜单中选择1时,父进程在考试开始时启动监听且只负责监听,在用户成功登录后,和对应的某一用户建立连接,之后父进程创建子进程之后把连接交给子进程,马上返回继续监听下一个用户的请求。在考试后期,还要处理回收退出的子进程。这里要设计的模块有:一是提供获取系统当前时间的模块(将当前的时和分转为整型);二是获取设置的时间的长度(并将设置的时间的格式设为时分格式且分别将时和分转为整型)并实现判断设置的时间是否合法,在设置的时间还没到来之前要进行计时;三是将模块二设置的考试时间长度作为一个时钟信号的长度,实现超时停止服务(定时器);四是将设置的时间和当前获取的系统时间比较,时间到将启动服务,没到之时计时器在工作;五是定时器处理模块,处理考试结束;五是系统管理大模块,包括对用户评分,显示结果之后返回主菜单;用户管理模块,此模块又可分为删除用户小模块和添加用户小模块,在设计这两个模块时要实现可循环操作,添加用户时还要实现不能添加数据库已有的用户;六是子进程回收模块,处理退出了的子进程,避免僵尸进程出现。3.2.3 服务器子进程模块服务器子进程处理流程图:图3.3服务器子进程处理流程图子进程关闭继承来的监听套接口描述符,使用继承而来的连接套接口和客户通信,负责验证用户的合法性,回传试题和接收对应用户的答案,返回相关信息。这里要设计的模块有:一是接收用户发送过来的用户名和口令,读取本地用户信息进行验证,若比较成功,则返回相应的成功标识,不成功返回失败标识;二是在前面返回成功标识的前提下申请对logged.txt文本加锁,加锁成功时读取本地的logged.txt文本信息,加锁不成功时等待,logged.txt文本保存了曾经成功登录过的用户的用户名,再进行一次比较,若成功(文本里没有此用户)则返回相应的成功标识,将该用户名写入logged.txt文本后解锁,不成功返回失败标识,解锁;三是根据返回的标识,该模块进行读取和回送试题的判断;四是成功回送试题后,进行一段时间的睡眠(可以把这段时间想为是登录时间,该时间段不接收提交的答案),时间到,终止睡眠,开始等待用户提交答案,在用户没有超时的情况下成功接收用户的答案进行保存,回应相关信息,成功退出;在超时没接收到用户答案的情况下(收到客户端返回的超时标识)会强行退出,此时用户再也无法提交答案,该模块接着会进行默认答案(零分的答案)的写入;在用户连接出现异常(比如是用户突然中断客户端运行)时,该模块也会写入默认答案,记录错误,然后成功退出。3.2.4 客户端父进程模块客户端父进程流程图: 图3.4客户端父进程流程图客户端父进程要设计的主要模块有:一是登录验证模块,先连接服务然后输入学号,口令发送过去,接收服务器回送的登录结果,然后产生相应的成功或者失败标识;二是考试时间处理模块,读取服务器回送的时间,根据本客户端成功登录时间,用考试结束时间减去成功登录时间,返回考试所剩时间;三是派生子进程模块,父进程成功派生子进程时关闭数据连接,若失败则退出,然后设定一个时钟信号和子进程退出信号和设定它们的信号处理函数,开始等待信号的到来,时钟信号到来时,进行考试时间提示,子进程信号到来时,回收子进程,再成功退出。3.2.5客户端子进程模块客户端子进程流程图: 图3.5客户端子进程流程图客户端子进程要设计的模块主要有:一是答题和提交答案模块,继承父进程的考试时间长度,设定时钟信号,显示试题等待用户输入答案,用户进行回答,子进程在本地创建一个临时文件,先将用户名(唯一的)写入,在用户确认提交的情况下,再将用户的答案写入临时文件,然后再一起读取发送给服务器,当用户不想提交时要实现答案的更改,直到用户再次确认提交为止。最后读取服务器返回的响应信息,当返回的是成功信息时,提示用户是否想保留作答记录,进行相应操作。当读取的是传输答案失败信息时(或网络故障而产生的信息),实现重建连接再次提交答案直到服务器返回成功信息;二是时钟信号处理模块,到用户超时没提交答案的情况下要对服务器返回客户端超时的信息,这很重要,会影响服务器子进程的相关操作,因为服务器子进程是据此判断它连接的这个客户是否超时,当然只依靠客户端的这个信息是不可靠的,故我在服务器的父进程里也设了超时时钟信号,当向服务器返回这个超时信息时便因超时而退出。4 数据库设计4.1 数据库总体设计数据库总体设计e-r图: 图4.1数据库总体设计e-r图系统数据流图: 图4.2系统数据流图作为一个实时考试系统无需过于复杂的数据表项,用户数据文本保存用户的登录学号与登录口令,要实现在添加用户时防止添加相同学号的用户。用户成功登录之后读取的是试题数据文本中的试题;用户在连接中出错时要将用户的学号与错误原因记录到保存用户错误原因的数据文本;用户成功登录时还要将用户学号记录到保存用户登录痕迹的数据文本;用户提交答案时,将用户学号与该用户的答案保存到答案数据文本;最后的一个临时答案数据文本是保存在客户端的,方便客户查看自己的作答记录,当然客户也可选择不要保留它。4.2 用户信息数据文本图4.3 user.txt文本e-r图用户学号和口令被定义是char类型,用户学号长度是9字节,口令长度是5字节,每个用户之间用“n”标识。4.3 保存答案数据文本 图4.4 answer.txt文本e-r图用户学号是char类型,长度9字节,用户答案也是char类型,长度为预设的试题的答案的总长度,每个用户答案之间用“n”标识。4.4 存放试题数据文本图4.5 question.txt文本e-r图所有字符为char类型,长度为输入结束的长度。4.5 保存登录过的用户数据文本图4.6 logged.txt文本e-r图保存成功登录过的用户的学号,用户之间用“n”标识。4.6 保存提交答案出错信息文本 图4.7 logerr.txt文本e-r图保存用户连接中的错误,包括用户的学号,每个用户的错误之间用“n”标识。4.7 临时存放客户答案数据文本图4.8 canswer.txt文本e-r图在客户端的数据文本,保存用户的学号与答案,都为char类型,学号与答案之间用“n”标识,长度为设定的长度。5 系统详细设计5.1 服务器父进程监听连接服务器获取当前小时的函数,返回小时的整型值:int hour_intf(void) int h_int; char str13; time_t t; struct tm *lt; t = time(null); lt = localtime(&t); strftime(str1,3,%h,lt); /save hour to str1 h_int=atoi(str1);/char time to int time return h_int; 服务器获取当前分钟的函数,返回分钟的整型值: int min_intf(void) int m_int; char str23; time_t t; struct tm *lt; t = time(null); lt = localtime(&t); strftime(str2,3,%m,lt); /save minute to str2 m_int=atoi(str2);/char time to int time return m_int; 接着服务器要求设置考试的开始与结束时间: printf(设置考试开始时间(hh:mm): ); scanf(%s,strt1); printf(设置考试结束时间(hh:mm): ); scanf(%s,strt2); start_int0=strt10; start_int1=strt11; start_int2=0; start_dec0=strt13; start_dec1=strt14; start_dec2=0; over_int0=strt20; over_int1=strt21; over_int2=0; over_dec0=strt23; over_dec1=strt24; over_dec2=0; st_i=atoi(start_int); st_d=atoi(start_dec); ov_i=atoi(over_int); ov_d=atoi(over_dec); if(st_i=ov_i&ov_d=st_d|ov_ist_i) printf(设置时间有误,请重试); exit(0); if(ov_d-st_d) clock() ) ; 在输入合法的情况下计时器开始工作: while(1) hour_int=hour_intf(); /now the int hour time min_int=min_intf(); /now the int minute time mys
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大班主题公开课教案及教学反思《文明购物》
- 长沙地铁车站安全监控施工方案
- 外架防护棚施工现场管理方案
- 临时工地防护网安全方案
- 《第七单元复习》(学案)人教版一年级数学上册
- 一年级下册数学教案-第1单元 认识平面图形 人教版
- 大班健康教案及教学反思《过桥摘果》
- 2022年小学生心理素质提升方案
- 2024年北京汽车技术研发服务合同
- 建筑工程质量检查方案
- 车位及允许施工证明模板
- 水泥砂浆砌石体单元评定表
- NB/T 10745-2021选煤用浮选药剂通用技术条件
- SB/T 10021-2008糖果凝胶糖果
- GB/T 33562-2017信息安全技术安全域名系统实施指南
- GB/T 3280-1992不锈钢冷轧钢板
- 小学纪念孙中山诞辰日班会PPT
- KAQCLS-120立式超声波洗瓶机说明书
- 浙江心理健康C证-面试资料大全(高中组)
- 2022年盘锦北方沥青股份有限公司招聘笔试试题及答案解析
- 小学作文思维导图-课件(完美版)
评论
0/150
提交评论