资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
Linux课程设计报告 班级:电子信息科学与技术一班_ 一、设计目标.管理员端:1.基本信息录入2.删除信息3.查找信息4.修改信息5.信息排序 学生端:1.查看信息2.修改信息二、 原理分析及实现过程Socket通信原理:操作系统的进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。不同的进程运行在各自不同的内存空间中,进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通过进程间通信来完成。本机进程之间通信可以通过管道、命名管道、信号等实现通信,网间进程通信就要通过Socket进行通信。网间进程通信时通过端口号来唯一标识主机的进程。端口号被分为三类,一类是01023范围内的端口,被称为熟知端口,这些端口号已被分配给了因特网上的著名应用程序,第二类端口被称为登记端口,范围是102449151,为没有熟知端口号的应用程序使用的。第三类是客户端口号或短暂端口号,数值为4915265535,留给客户进程选择暂时使用。网络应用进程间通信普遍采用客户/服务器交互模式,该模式通常简记为C/S模式。在该模式中,通信双方中发起通信的一方被称为客户端,被动接受通信请求的一方被称为服务器。服务器方必须先启动,并时刻监听是否有客户端的请求到达。服务器通过多线程技术实现一对多通信。本系统是基于TCP/IP协议栈使用C语言来实现进程间的通信。进程通信过程:服务器端:1.先用socket函数来建立一个套接字,用这个套接字完成通信的监听。2.用bind函数来绑定一个端口号和IP地址。3.调用listen函数,使服务器的这个端口和IP处于监听状态,等待客户机的连接。4.用accept函数来接受远程计算机的连接,建立起与客户机之间的通信。 主要代码解析:#define PORT 4000 /定义端口号为4000,使用宏定义方便以后的修改int main(int argc, char *argv)int sockfd = -1, ret = -1;struct sockaddr_in sockaddr;if(sockfd = socket(AF_INET, SOCK_STREAM, 0) 0)/使用socket()建立套接字,并返回套接字号perror(create socket failed);return -1;memset(&sockaddr, 0, sizeof(sockaddr);sockaddr.sin_family = AF_INET; /地址信息sockaddr.sin_port = htons(uint16_t)PORT);sockaddr.sin_addr.s_addr = INADDR_ANY;if(ret = bind(sockfd, (const struct sockaddr *)&sockaddr, /套接字和本地地址绑定sizeof(sockaddr) 0)perror(bind failed);return -1;if(listen(sockfd, MAX_UNRESOLVE_LINK_NUMBER) 0)/通知服务器准备接受连接perror(listen failed);return -1;clntfd = accept(sockfd, (struct sockaddr *)&clntaddr, &len);/接受连接,创建子进程,用于处理客户端的请求客户端:1.用socket函数建立一个套接字,设定远程IP和端口。2.调用connect函数连接远程计算机指定的端口。3.建立连接以后,客户机用send函数通过socket发送数据。也可以用recv函数从socket读取服务器发送来的数据。服务器同样也可以用recv函数和send函数来收发数据。 主要代码解析:#define PORT 4000int main()int sockfd = -1, ret = -1;struct sockaddr_in clntaddr;sockfd = socket(AF_INET, SOCK_STREAM, 0); /创建套接字if(sockfd 0)perror(create failed);return -1;memset(&clntaddr, 0, sizeof(clntaddr);clntaddr.sin_family = AF_INET; /地址信息clntaddr.sin_port = htons(uint16_t)PORT);inet_pton(AF_INET, 127.0.0.1, &clntaddr.sin_addr.s_addr);ret = connect(sockfd, (const struct sockaddr *)&clntaddr, /将套接字与服务器端进行连接sizeof(clntaddr);if(ret 0)perror(connect failed); write(sockfd, &msg, sizeof(msg);/向服务器发送信息memset(buf, 0, sizeof(buf);read(sockfd, buf, sizeof(buf);/接受服务器端的信息功能实现的过程:整体功能框架图蓝色部分为未实现Client 网络通信的客户端,分别定义了不同用户的不同菜单,在这没有实现operiont,采用直接像服务器传递客户端的请求。Server 管理端,实现管理者的功能及网络通信的服务器端Manage 定义了实现学生成绩管理系统的一系列函数,在这由于一开始时没有设计file和linklist的功能,以后会增加linklis和file,file实现对文本文件中的信息的读取和写入,linklist用于实现读取的信息形成链表,已经对链表进行操作。Makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,makefile就像一个shell脚本一样。CC:=gcc CPP:=g+SOBJ=server.o manage.oCOBJ=client.oTARGET=server clientFLAG = -02server:$(SOBJ)$(CC) $ -o $ $(FLAG)client:$(COBJ)$(CC) $ -o $ $(FLAG)%.o:%.c$(CC) $ -o $ -c $(FLAG)%.o:%.cpp$(CPP) $ -o $ -c $(FLAG)clean:rm *.o -fr /删除所有的.o文件三、 测试与总结(结果如何)客户端连接服务器端,连接成功后进入主菜单界面学生菜单界面管理员菜单添加学生信息修改学生信息删除学生信息查询学生信息遇到的问题:我们以前就学习过网络编程,这次课程设计,老师又教会我们一些新的东西。系统中最主要的问题还是怎么实现服务器端和客户端的通信。一开始的时候实现了简单的通信,但是当实现服务器和客户端的多次通信时,我便在这里出现了问题,后来发现时while(1)放错了位置,调整顺序后变能实现服务器和客户端的连续通信。遇见最多的问题便是乱码,后来发现是读取文本时用的是char型变量,在字符串末尾没有添加0。总结:以前做过多次学生成绩管理系统,每次都会有新的收获。我们课上所学习的东西总是侧重于理论,很多时候做系统时,会遇到很多的bug,这个时候我们就要思路清晰,找出自己的错误。以前对于文件的读写,我一直掌握的不是很好,通过这次课程设计,使我对文件的读取有了较好的掌握。在这次课程设计中,系统产生了很多错误,我也遇到很多不懂得知识, 但通过看书上网查找资料,这些困难也一一克服了,让我真正体验了通过不断的努力获得成功的喜悦。虽然整个系统还有一些不完善的地方,但通过这次的课程设计我还是收获了很多,不仅锻炼了自己动手操作的能力,更是培养了我们的自学能力以及与同学合作和向别人学习的基本素养。通过老师对知识的讲解,我也体会到自己所学的知识和以后在工作中应具备的知识还差很多。在今后的学习中,我会更加注重对实践能力的培养。1
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号