1 / 17
文档名称:

双协议实现文件传输.doc

格式:doc   大小:1,175KB   页数:17页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

双协议实现文件传输.doc

上传人:260933426 2017/9/10 文件大小:1.15 MB

下载得到文件列表

双协议实现文件传输.doc

相关文档

文档介绍

文档介绍:网络程序设计与实践
大作业实验报告
题目:TCP/UDP双协议实现文件传输
学号: xxxxxxxxxx
姓名: xxx
指导教师: xxx
学院: xxxxxxxxxxxxxxxxxxx
学校: xxxxxxxxxxxxx
实验目的
通过学****实践深入理解TCP/UDP等传输协议,掌握socket网络编程,理解它们的工作机制,并在实验中实现TCP/UDP双协议传输,通过自己的实现方式保证UDP的可靠传输,并使用进程预分配技术提高服务的性能。
二、实验要求



,只下载
三、实验平台与语言
Linux ,C语言
四、实验设计思路

创建一个进程的时间比较长,如果在接收到客户端请求之后,创建一个子进程来处理,这会影响响应客户机的速度,为解决这个问题,采用一种称为“预创建(perfork)”的技术。服务器事先创建一定数目的子进程,对于TCP连接,ept()从倾听套接字完成连接队列中接收已建立的客户机连接。对于UDP情况,由于要实现可靠传输,客户机要向服务器发送的数据报确认信息,这就会使其他进程认为这是一个新的连接,所以在这里我采用信号量机制,使得在一段时间内,只有一个进程在处理UDP连接,只有这个UDP连接处理完成后,其他进程才可以接收UDP连接并进行处理。也就是说,采用进程预分配技术后,可以实现TCP并发服务,UDP循环服务。使用预创建技术的服务器如图1。
图1 预创建子进程方式
服务器预先创建N个子进程,部分子进程正在处理客户机请求,部分子进程正在等待客户机请求。
这种服务器的优点是响应客户机的速度比较快,节省创建子进程的时间。但缺点是服务器预先估计所需创建的子进程数目。
如果数目太少,那么多余的客户机讲等待,不能及时得到服务,而太多又会浪费系统资源。
为了解决上面的问题,服务器父进程可以动态的调整子进程数目,当空闲子进程数目小于下限时,父进程创建一些新的子进程;当空闲子进程大于上限时,父进程终止一些子进程。父进程需要两条消息来管理子进程:子进程接收一个连接和结束一个连接。当父进程接收的前一种消息时,将检查空闲子进程数目是否小于下限;当父进程接收都后一种消息时,将检查空闲子进程是否大于上限。为了获得这两种消息,父进程和每个子进程建立一个管道。当子进程接收到一条连接后,向这个管道中发送一字节消息,内容为1;当子进程处理完一个连接之后,向这个管道发送一个字节消息,。
图2 动态更改子进程个数
为了管理子进程,定义一个结构child_queue,记录活动子进程数目,空闲子进程数目和子进程信息队列。子进程信息队列记录了每个子进程的信息:子进程的进程号,与父进程通信的管道和子进程的状态。子进程状态可能是等待客户机请求(CS_WAITING)或处理客户机请求(CS_PROCESSING)。
struct child_queue{ //结构:用于管理子进程
int chld_no; //活动子进程数目
int chld_avail; //空闲子进程数目
struct child_info{ //子进程信息
int pid; //子进程进程号
int pipefd; //与子进程通信的管道
int state; //子进程状态
}ci[CHILD_NUM_MAX]; //子进程信息数组
};
服务器一直循环动态管理子进程数目,知道有SIGINT信号出现(CTRL+C),才Kill所以子进程,退出循环,结束。进程预分配的流程图如图3所示。
图3 进程预分配流程图

当一个子进程被创建后,它循环等待客户机连接请求,当客户机连接请求到达后,它判断是TCP连接,还是UDP连接。如果是TCP连接,子进程调用tcpfile()函数处理连接请求,在tcpfile()处理请求过程中,ept()函数从倾听套接字完成连接队列中接收已建立的连接,如果接收成功则通过管道通知父进程开始处理连接,父进程把它的状态置为CS_PROCESSING(处理客户机请求),然后判断空闲子进程数目是否小于下限,如果小于,则创建一定数目新的子进程。当连接处理完成后,子进程通过管道通知父进程连接处理完成,父进程把它的状态置为CS_WAITING,然后判断空闲子进程数目是否超过上限,如果超过,Kill一定数目的空闲子进程。而处理此次连接的子进程处理完成后继续等待新的连接。如果是UDP连接子进程先判断是否有其他进程正在调用udpfile()函数处理UDP连接,如果有,则说明这个连接有可能是客