ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:660.36KB ,
资源ID:23023390      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23023390.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(双协议实现文件传输.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

双协议实现文件传输.docx

1、双协议实现文件传输网络程序设计与实践大作业实验报告题目:TCP/UDP双协议实现文件传输学号: xxxxxxxxxx 姓名: xxx 指导教师: xxx 学院: xxxxxxxxxxxxxxxxxxx 学校: xxxxxxxxxxxxx 一、 实验目的通过学习实践深入理解TCP/UDP等传输协议,掌握socket网络编程,理解它们的工作机制,并在实验中实现TCP/UDP双协议传输,通过自己的实现方式保证UDP的可靠传输,并使用进程预分配技术提高服务的性能。二、实验要求1.同时运行基于TCP与UDP的双协议2.基于UDP协议的可靠传输3.应用进程预分配技术4.不上传,只下载三、实验平台与语言Li

2、nux Ubuntu9.04,C语言四、实验设计思路1.进程预分配设计 创建一个进程的时间比较长,如果在接收到客户端请求之后,创建一个子进程来处理,这会影响响应客户机的速度,为解决这个问题,采用一种称为“预创建(perfork)”的技术。服务器事先创建一定数目的子进程,对于TCP连接,每个子进程分别调用函数accept()从倾听套接字完成连接队列中接收已建立的客户机连接。对于UDP情况,由于要实现可靠传输,客户机要向服务器发送的数据报确认信息,这就会使其他进程认为这是一个新的连接,所以在这里我采用信号量机制,使得在一段时间内,只有一个进程在处理UDP连接,只有这个UDP连接处理完成后,其他进程

3、才可以接收UDP连接并进行处理。也就是说,采用进程预分配技术后,可以实现TCP并发服务,UDP循环服务。使用预创建技术的服务器如图1。图1 预创建子进程方式服务器预先创建N个子进程,部分子进程正在处理客户机请求,部分子进程正在等待客户机请求。这种服务器的优点是响应客户机的速度比较快,节省创建子进程的时间。但缺点是服务器预先估计所需创建的子进程数目。如果数目太少,那么多余的客户机讲等待,不能及时得到服务,而太多又会浪费系统资源。为了解决上面的问题,服务器父进程可以动态的调整子进程数目,当空闲子进程数目小于下限时,父进程创建一些新的子进程;当空闲子进程大于上限时,父进程终止一些子进程。父进程需要两

4、条消息来管理子进程:子进程接收一个连接和结束一个连接。当父进程接收的前一种消息时,将检查空闲子进程数目是否小于下限;当父进程接收都后一种消息时,将检查空闲子进程是否大于上限。为了获得这两种消息,父进程和每个子进程建立一个管道。当子进程接收到一条连接后,向这个管道中发送一字节消息,内容为1;当子进程处理完一个连接之后,向这个管道发送一个字节消息,内容为0.服务器的示意图如图2所示。图2 动态更改子进程个数为了管理子进程,定义一个结构child_queue,记录活动子进程数目,空闲子进程数目和子进程信息队列。子进程信息队列记录了每个子进程的信息:子进程的进程号,与父进程通信的管道和子进程的状态。子

5、进程状态可能是等待客户机请求(CS_WAITING)或处理客户机请求(CS_PROCESSING)。struct child_queue /结构:用于管理子进程 int chld_no; /活动子进程数目 int chld_avail; /空闲子进程数目 struct child_info /子进程信息 int pid; /子进程进程号 int pipefd; /与子进程通信的管道 int state; /子进程状态 ciCHILD_NUM_MAX; /子进程信息数组;服务器一直循环动态管理子进程数目,知道有SIGINT信号出现(CTRL+C),才Kill所以子进程,退出循环,结束。进程预分配

6、的流程图如图3所示。图3 进程预分配流程图2.子进程处理连接及双协议实现 当一个子进程被创建后,它循环等待客户机连接请求,当客户机连接请求到达后,它判断是TCP连接,还是UDP连接。如果是TCP连接,子进程调用tcpfile()函数处理连接请求,在tcpfile()处理请求过程中,调用accept()函数从倾听套接字完成连接队列中接收已建立的连接,如果接收成功则通过管道通知父进程开始处理连接,父进程把它的状态置为CS_PROCESSING(处理客户机请求),然后判断空闲子进程数目是否小于下限,如果小于,则创建一定数目新的子进程。当连接处理完成后,子进程通过管道通知父进程连接处理完成,父进程把它

7、的状态置为CS_WAITING,然后判断空闲子进程数目是否超过上限,如果超过,Kill一定数目的空闲子进程。而处理此次连接的子进程处理完成后继续等待新的连接。如果是UDP连接子进程先判断是否有其他进程正在调用udpfile()函数处理UDP连接,如果有,则说明这个连接有可能是客户端发送给服务器的数据报确认信息,那么子进程继续等待新的连接。如果没有其他子进程正在调用udpfile()函数处理udp连接,则对信号量执行P操作,然后调用udpfile处理本次UDP连接,处理完成后对信号量执行V操作,以便其他子进程调用udpfile()函数处理新的UDP连接。在调用udpfile()处理UDP连接时,

8、同样需要通过管道和父进程通信,以便父进程动态管理子进程数目。子进程处理连接流程图如图4所示。图4 子进程处理连接图5 基于TCP协议的通信方式3.基于TCP协议文件传输的设计TCP,UDP属于传输层协议,无法直接应用于传输文件。所以无论基于TCP还是基于UDP都需要单独开发各自独立的应用层协议。由于TCP协议提供可靠地传输,所以我们就不用考虑可靠性。图5是客户端和服务器端基因TCP协议的通信方式。图6 基于TCP的服务器端流程图 客户端首先请求连接,当收到连接确认后,发送要下载的文件名,如果文件在服务器端存在,服务器给客户端发文件存在确认信息,如果文件不存在,服务器给客户端发文件不存在信息。如

9、果文件不存在,客户端提示文件不存在,重新输入文件名并发送。如果文件存在,服务器发送文件数据,客户端接收服务器发送的文件数据,一直循环直到文件传输完毕。然后客户端关闭套接字,端口连接,而服务器端子进程,处理完本次连接后继续等待新的连接到来。图6是基于TCP的服务器端流程图,图7是客户端流程图。由于服务器采用进程预分配,TCP套接字和倾听套接字都是在父进程中创建的,在图6服务器端流程图中没有体现出来。图7 基于TCP的客户端流程图4.基于UDP协议文件传输的设计由于UDP协议不提供可靠传输,所以在这里我们需实现可靠传输机制。在这里应用的是停等超时机制,图8显示了基于UDP协议的客户端和服务器端的通

10、信方式。可靠传输机制可以描述如下:在文件传输过程中,服务器端先给文件数据报进行0或1编号(规定编号从0开始),然后发送数据报,计时等待接收客户端数据报编号ACK,如果服务器端未在规定时间内收到客户端编号ACK,则重新发送本次数据报,如果服务器端在规定时间内接到客户端的编号ACK,则判断编号ACK和本次发送的是否相同,如果相同,则对下一个数据报进行1或0编号并发送;如果客户端的编号ACK与本次发送的不同,则说明客户端没有收到本次数据报,重新发送,计时等待客户端数据报编号ACK。如果重新发送次数超过10次都没有收到客户端编号ACK,则认为客户端断开了连接,服务器子进程返回继续等待新的连接。正常情况

11、到文件发送完毕,然后服务器子进程给客户端发送一个文件发送完毕信息。不等待客户确认,然后返回继续等待新的连接。基于UDP协议服务器端流程图如图9所示。图8 基于UDP的客户端和服务器端通信方式而基于UDP的客户端,一开始发送请求的文件名字并得到存在确认后,就开始等待服务器端的数据报(由于规定数据报编号从0开始,第一个接收到的数据报编号应该为0,然后以后依次为1.0.1.0),接收到一个数据报后,判断是否是希望得到的编号的数据报,如果是,则给服务器端发送本次得到的数据报编号ACK,如果不是就给服务器端发送上次的数据报编号ACK。图10是基于UDP协议的客户端流程图。图9 基于UDP协议的服务器端流

12、程图图10 基于UDP协议的客户端流程图五、实验结果与分析为了方便观察,每次TCP或UDP连接,在服务器端都显示连接类型,IP和端口,以及下载的文件。1. 基于TCP协议的文件传输图11 服务器运行图12 客户端连接图13 服务器端显示TCP连接图14 客户端输入文件名data并下载图15 服务器端TCP连接显示下载文件data2. 基于UDP协议的文件传输图16 UDP客户端运行并输入文件名图17 UDP客户端连接并下载文件图18 服务器端显示UDP连接及下载的文件 从图18可以看出服务器实现了TCP和UDP双协议。当有TCP连接时调用tcpfile()函数进行处理,当有UDP连接时调用ud

13、pfile()函数进行处理。3. 进程预分配图19 有5个TCP客户端同时连接图20 服务器端预分配的5个子进程分别对每个连接处理4. UDP超时重传图21 UDP客户端下载文件图22 服务器超时重传六、实验总结由于时间及经验的关系,设计上还有很多不足之处,但是基本功能都予以实现。本次实验积累了很多经验,熟悉了线程和socket编程,获益匪浅。实验的核心是“基于UDP协议的可靠传输”,关键是实现一种可靠传输的机制,至于传输的效率反而是其次。只要实现了前者,后者只是优化的问题。但实验之初往往本末倒置,希图设计一种高效的传输协议而对可靠的传输机制考虑不足。最后,感谢xxx老师精彩的讲解和耐心的指导,在此向他致敬!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1