文档介绍:网络程序设计与实践大作业实验报告题目:TCP/UDP双协议实现文件传输学号: XXXXXXXXXX 姓名: ™ 扌旨导教师: ™ 学院: XXXXXXXXXXXXXXXXXXX学校: XXXXXXXXXXXXX 一、 实验目的通过学****实践深入理解TCP/UDP等传输协议,掌握socket网络编程,理解它们的工作机制,并在实验屮实现TCP/UDP双协议传输,通过自己的实现方式保证UDP的可靠传输,并使用进程预分配技术提高服务的性能。二、 实验要求同吋运行基于TCP与UDP的双协议基于UDP协议的可靠传输应用进程预分配技术4•不上传,只下载三、 ,C语言四、 实验设计思路1•进程预分配设计创建一个进程的吋间比较长,如果在接收到客户端请求之后,创建一个子进程来处理,这会影响响应客户机的速度,为解决这个问题,采用一种称为“预创建(perfork)"的技术。服务器事先创建一定数H的子进程,对于TCP连接,ept()从倾听套接字完成连接队列屮接收己建立的客户机连接。对于UD卩情况,由于要实现可靠传输,客户机要向服务器发送的数据报确认信息,这就会使其他进程认为这是一个新的连接,所以在这里我采用信号量机制,使得在一段时间内,只有一个进程在处理UDP连接,只有这个UDP连接处理完成后,其他进程才可以接收UDP连接并进行处理。也就是说,采用进程预分配技术后,可以实现TCP并发服务,UDP循环服务。使用预创建技术的服务器如图lo图1预创建了进稈方式服务器预先创建N个子进程,部分子进程正在处理客户机请求,部分子进程正在等待客户机请求。这种服务器的优点是响应客户机的速度比较快,节省创建子进程的吋间。但缺点是服务器预先估计所需创建的子进程数Fl。如果数H太少,那么多余的客户机讲等待,不能及吋得到服务,而太多乂会浪费系统资源。为了解决上面的问题,服务器父进程可以动态的调整子进程数当空闲子进程数H小于下限吋,父进程创建一些新的子进程;当空闲子进程大于上限吋,父进程终止一些子进程。父进程需要两条消息來管理子进程:子进程接收-•个连接和结束一个连接。当父进程接收的前一种消息时,将检查空闲子进程数H是否小于下限;当父进程接收都后一种消息时,将检查空闲子进程是否大于丄限。为了获得这两种消息,父进程和每个子进程建立一个管道。当子进程接收到--条连接后,向这个管道屮发送一字节消息,内容为1;当子进程处理完一个连接之后,向这个管道发送一个字节消息,。迓才呈弓-状态套按字描述符接收连接:丨 ;u ~子子稈客客八八机机图2动态更改了进稈个数为了管理子进程,定义一个结构child_queue,记录活动子进程数FI,空闲子进程数F1和子进程信息队列。子进程信息队列记录了每个子进程的信息:子进程的进程号,与父进程通信的管道和子进程的状态。子进程状态可能是等待客户机请求(CS_WAITING)或处理客户机请求(CS_PROCESSING)。structchild_queue{intchld_no;intchld_avail;structchild_info{intpid;intpipefd;intstate;〃结构:用于管理子进程〃活动子进程数Fl〃空闲子进程数冃〃子进程信息〃子进程进程号//与子进程通信的管道〃子进程状态}ci[CHILD_NUM_MAX];〃子进程信息数组};服务器一直循环动态管理子进程数FI,知道有SIGINT信号出现(CTRL+C),才Kill所以子进程,退出循环,结束。进程预分配的流程图如图3所示。图3进程预分配流程图子进程处理连接及双协议实现当一个子进程被创建后,它循环等待客户机连接请求,当客户机连接请求到达后,它判断是TCP连接,还是UDP连接。如果是TCP连接,子进程调用tcpfileO函数处理连接请求,在tcpf订e()处理请求过程小,ept()函数从倾听套接字完成连接队列屮接收己建立的连接,如果接收成功则通过管道通知父进程开始处理连接,父进程把它的状态置为CS_PROCESSING(处理客户机请求),然后判断空闲子进程数H是否小于下限,如果小于,则创建一定数H新的子进程。当连接处理完成后,子进程通过管道通知父进程连接处理完成,父进程把它的状态置为CSWAITING,然后判断空闲子进程数H是否超过上限,如果超过,Kill-定数H的空闲子进程。而处理此次连接的子进程处理完成后继续等待新的连接。如果是UDP连接子进程先判断是否有其他进程正在调用udpfile()函数处理UDP连接,如果有,则说明这个连接有可能是客户端发送给服务器的数据报确认信息,那么子进程继续等待新的连接。如果没有其他子进程正在调用udpfileO函数处理udp连接,则对信号量执行P操作,然后调用u