好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Linux课程设计报告.doc

9页
  • 卖家[上传人]:cl****1
  • 文档编号:552750666
  • 上传时间:2024-02-20
  • 文档格式:DOC
  • 文档大小:436.18KB
  • / 9 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Linux课程设计报告 班级:电子信息科学与技术一班_ 一、设计目标 .管理员端:1.基本信息录入2.删除信息3.查找信息4.修改信息5.信息排序 学生端:1.查看信息2.修改信息二、 原理分析及实现过程Socket通信原理:操作系统的进程是一个具有独立功能的程序关于某个数据集合的一次运行活动不同的进程运行在各自不同的内存空间中,进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通过进程间通信来完成本机进程之间通信可以通过管道、命名管道、信号等实现通信,网间进程通信就要通过Socket进行通信网间进程通信时通过端口号来唯一标识主机的进程端口号被分为三类,一类是0~1023范围内的端口,被称为熟知端口,这些端口号已被分配给了因特网上的著名应用程序,第二类端口被称为登记端口,范围是1024~49151,为没有熟知端口号的应用程序使用的第三类是客户端口号或短暂端口号,数值为49152~65535,留给客户进程选择暂时使用网络应用进程间通信普遍采用客户/服务器交互模式,该模式通常简记为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,这个时候我们就要思路清晰,找出自己的错误以前对于文件的读写,我一直掌握的不是很好,通过这次课程设计,使我对文件的读取有了较好的掌握在这次课程设计中,系统产生了很多错误,我也遇到很多不懂得知识, 但通过看书上网查找资料,这些困难也一一克服了,让我真正体验了通过不断的努力获得成功的喜悦虽然整个系统还有一些不完善的地方,但通过这次的课程设计我还是收获了很多,不仅锻炼了自己动手操作的能力,更是培养了我们的自学能力以及与同学合作和向别人学习的基本素养通过老师对知识的讲解,我也体会到自己所学的知识和以后在工作中应具备的知识还差很多在今后的学习中,我会更加注重对实践能力的培养。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.