计算计网络-FTP客户机程序_第1页
计算计网络-FTP客户机程序_第2页
计算计网络-FTP客户机程序_第3页
计算计网络-FTP客户机程序_第4页
计算计网络-FTP客户机程序_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上摘 要本设计题目是: FTP客户机程序首先介绍了FTP协议工作原理,FTP工作模式,FTP工作过程,FTP传输模式; 其次,说明了该程序需要在DOS命题提示符窗口下输入FTP_Client 来调用程序运行,然后可以输入USER,PASS,PASV,LIST,QUIT等命令来继续执行程序;最后,说明了程序运行的结果和程序的结果分析。关键词: 文件传输协议;C+;建立数据连接目 录专心-专注-专业1 课程设计目的FTP 早已应用在网络的各个方面,比如我们在访问网络上的资源时,经常会遇到需要连接FTP 服务器来下载,或者你制作了一个网站,想要将其上传至服务器,让大家能够访问

2、它,这个时候就会用到FTP 客户端。虽然平时使用windows 自带的IE 浏览器即可实现对FTP 服务器的访问,但是IE 只是个很粗糙的FTP 客户端。IE 浏览器在6.0 以下的版本不支持PASV 方式访问服务器, 而且IE 浏览器在登录FTP 服务器的时候,无法查看返回的信息,在出错的时候,无法找到错误的原因,因此在使用上很不方便。现在大多数的FTP 客户端软件都是收费版的,而且以英文版居多,使用上操作很复杂,目前流行的有CoreFtp、AceFtp 、Ftp Voyager 等,但是大多数用户并不习惯使用这些软件。本文所设计的FTP 客户端则适合大多数用户使用,界面设计的很简单,使用户

3、可以一目了然,而且具备FTP 客户端的基本功能,可以作为下载、上传文件的工具来使用。1)熟悉网络应用层的传输协议,增强对FTP协议的了解2)提高自己的动手能力以及编程能力 2 课程设计要求1)可以输入FTP服务的相关信息(包括IP地址、用户名与密码),输出交互过程中的FTP命令与响应信息,以及从FTP服务器的根目录获得的文件(或目录)列表。2)要求遵循FTP协议规定。只要求实现USER、PASS、PASV、LIST和QUIT命令。3)要求有良好的编程规范与注释信息。4)要求有详细的说明文档,包括程序的设计思想、工作流程、关键问题等。5)要求在Windows操作系统环境中,建议使用Visual&

4、#160;C+编程工具实现。3 FTP相关知识 3.1 FTP 工作原理 FTP(File Transfer Protocol),是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序。用户可以通过它把自己机器与世界各地所有运FTP协议的服务器相连,访问服务器上的资源和信息。FTP协议在TCP/IP协议栈中的位置如表1: 表3-1 TCP/IP协议栈HTTP FTP TELN SMTP DNS TFTP NMP应用层TCP UDP传输层IP互联网络层X25 ISDN LAN WLAN FDDI ATM网络接口层当启动FTP从远程计算机拷贝文件时,事实上启动了

5、两个程序:一个本地机器上的FTP客户端程序,它向FTP服务器提出拷贝文件的请求。另一个是启动在远程计算机的上的FTP服务器程序,它响应请求把你指定的文件传送到你的计算机中。FTP采用“客户端/服务器”方式,用户要在自己的本地计算机上安装FTP客户端程序。从根本上说,FTP协议就是在网络中各种不同的计算机之间按照TCP/IP协议来传输文件。FTP协议采用客户端/服务器(Client/Sever)模式,由FTP客户端程序和FTP服务器端程序组成。使用时,先启动FTP客户端程序与远程主机建立连接,然后向远程主机发出传输命令,远程主机在收到命令后就给予响应,并执行正确的命令。但是FTP有一个根本的限制

6、,那就是,如果用户在某个主机上没有注册获得授权,即没有用户名和口令,就不能与该主机进行文件传输。但匿名FTP服务器除外,它能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名“Anonymous”或“guest”就可有限制地访问远程主机上公开的文件。现在许多系统要求用户将Emai1地址作为口令,以便更好地对访问者进行跟综。出于安全的目的,大部分匿名FTP主机一般只允许远程用户下载文件,而不允许上载文件。也就是说,用户只能从匿名FTP主机拷贝其需要的文件而不能把文件拷贝到匿名FTP主机。另外,匿名FTP主机还采用了其他一些保护措施以保护

7、自己的文件不至于被用户修改和删除,并防止计算机病毒的侵入。匿名FTP一直是Internet上获取信息资源的最主要方式,在Internet成千上万的匿名FTP主机中存储着无以计数的文件,这些文件包含了各种各样的信息、数据和软件。人们只要知道特定信息资源的主机地址,就可以用匿名FTP登陆。3.2 FTP工作模式FTP 采用C/S(客户端/服务器)模式进行通信,但与其他的C/S 模式网络通信协议又有一个很大的区别。通常在进行HTTP 通信或是TELNET 通信的时候,只需要一个端口进行通信。即客户端只需要连接一个端口进行数据通信。如TELNET 的默认端口是23,用户从头到尾都只需使用这个端口。但是

8、FTP 通信除了有一个默认端口21 之外,还需要其他的端口。其中默认端口(21)主要进行控制连接,进行命令协议和服务器端的响应码的传输;另外一个非标准端口主要进行数据传递,如文件的上载、下载等。至于非标准端口的产生则要根据用户选择的连接模式而定:如果客户选择的是主动模式(PORT),则需要用户端提供给服务器一个IP 地址和一个非标准端口;而如果用户采用被动模式(PASV),则服务器端需要提供给客户端一个IP 地址和一个非标准端口。下表是几个著名的TCP 端口号:TCP 端口号关键字描述20 FTP-DATA文件传输协议数据21FTP文件传输协议控制23TELENET远程登录协议25SMTP简单

9、邮件传输协议53DOMAIN域名服务器80HTTP超文本传输协议110POP3邮局协议119NNTP新闻传送协议 图3-1   FTP服务的工作过程表3-2 TCP 端口号FTP 中字节大小有两个:逻辑字节大小和用于传输的字节大小。后者通常是8 位,而前者可不一定是多少了。传输字节不必等于逻辑字节大小,也不必对数据结构进行解释。控制连接是建立在USER-PIT 和SERVER-PI 之间用于交换命令与应答的通信链路。数据连接是传输数据的全双工连接,传输数据可以发生在服务器DTP 和用户DTP之间也可以发生在两个服务器DTP 之间,FTP 可以传输非连续的文件,这些

10、文件的一部分称为页。服务器DTP 代表一种传输过程,它通常处于“主动”状态,它和侦听端口建立数据连接,它还可以为传输和存储设置参数,并根据PI 的指令传输数据。当然,DTP 也可以转入“被动”状态。服务器FTP 进程,它是和用户FTP 进程一起工作的,它由PI 和DTP 组成。在开始阶段,标准FTP 命令由用户PI 产生并通过控制连接传送到服务器进程。服务器PI 向用户PI 返回标准应答。FTP 命令指定数据连接参数和文件系统操作。用户DTP 在特定数据端口侦听,服务器开始数据连接并以指定的参数开始数据传输。数据端口不必在开始FTP 命令的机器上,但用户或用户FTP 进程必须确定它在指定的数据

11、端口上侦听.这个数据连接是全双工的。3.3 FTP 传输模式FTP 协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。假设两台计算机通过ftp 协议对话,并且能访问Internet, 你可以用ftp 命令来传输文件。每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的。FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式。3.3.1 ASCII传输方式假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解

12、释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理。3.3.2 二进制传输方式在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。如果你在ASCII方式下传输二进制文件,即

13、使不需要也仍会转译。这会使传输稍微变慢,也会损坏数据,使文件变得不能用。3.4 部分响应码及其意义110:重新启动标记应答。在这种情况下文本是确定的,它必须是:MARK yyyy=mmmm其中yyyy是用户进程标记,mmmm是服务器标记。120:服务在nnn分钟内准备好。125:数据连接已打开,准备传送。150:文件状态良好,打开数据连接。200:命令成功。202:命令未实现。211:系统状态或系统帮助响应。212:目录状态。213:文件状态。214:帮助信息,信息仅对人类用户有用。215:名字系统类型。220:对新用户服务准备好。221:服务关闭控制连接,可以退出登录。225:数据连接打开,

14、无传输正在进行。226:关闭数据连接,请求的文件操作成功。227:进入被动模式。230:用户登录。250:请求的文件操作完成。257:创建“PATHNAME”。331:用户名正确,需要口令。332:登录时需要账户信息。350:请求的文件操作需要进一步命令。421:不能提供服务,关闭控制连接。425:不能打开数据连接。426:关闭连接,中止传输。450:请求的文件操作未执行。451:中止请求的操作:有本地错误。452:未执行请求的操作:系统存储空间不足。500:格式错误,命令不可识别。501:参数语法错误。502:命令未实现。503:命令顺序错误。504:此参数下的命令功能未实现。530:未登录

15、。532:存储文件需要账户信息。550:未执行请求的操作。551:请求操作中止:页类型未知。552:请求的文件操作中止,存储分配溢出。553:未执行请求的操作:文件名不合4 课程设计分析 1.设计中的重点及难点1)使用send();recv()实现发送和接收数据;2)软件实现人机交互的设计,套接字的使用;3)FTP工作模式的理解。 2.核心代码从FTP服务器接收响应: bool RecvReply()int nRecv;memset(ReplyMsg, 0, MAX_SIZE);nRecv = recv(SocketControl, ReplyMsg, MAX_SIZE, 0); if (nR

16、ecv = SOCKET_ERROR)cout << "接收接口错误!" << endl;closesocket(SocketControl);return false;if (nRecv > 4)char* ReplyCodes = new char3;memset(ReplyCodes, 0, 3);memcpy(ReplyCodes, ReplyMsg, 3);nReplyCode = atoi(ReplyCodes);return true;向FTP服务器发送命令:bool SendCommand()int nSend;nSend =

17、send(SocketControl, Command, strlen(Command), 0);if (nSend = SOCKET_ERROR)cout << "发送接口错误!" << endl;return false;return true;建立连接:bool DataConnect(char* ServerAddr)memset(Command, 0, MAX_SIZE);memcpy(Command, "PASV", strlen("PASV");memcpy(Command + strlen(&q

18、uot;PASV"), "rn", 2);if (!SendCommand()return false;if (RecvReply()if (nReplyCode != 227)cout << "PASV响应错误! " << endl;closesocket(SocketControl);return false;char* part6;if (strtok(ReplyMsg, "(")for (int i = 0; i < 5; i+)parti = strtok(NULL, ",&

19、quot;);if (!parti)return false;part5 = strtok(NULL, ")");if (!part5)return false;elsereturn false;unsigned short ServerPort;ServerPort = unsigned short(atoi(part4) << 8) + atoi(part5);SocketData = socket(AF_INET, SOCK_STREAM, 0);if (SocketData = INVALID_SOCKET)cout << "创建接

20、口错误!" << endl;return false;sockaddr_in serveraddr2;memset(&serveraddr2, 0, sizeof(serveraddr2);serveraddr2.sin_family = AF_INET;serveraddr2.sin_port = htons(ServerPort);serveraddr2.sin_addr.S_un.S_addr = inet_addr(ServerAddr);int nConnect;nConnect = connect(SocketData, (sockaddr*)&

21、;serveraddr2, sizeof(serveraddr2);if (nConnect = SOCKET_ERROR)cout << "服务器请求错误!" << endl;return false;return true; 3.程序流程图4-1 程序流程图命令行参数是否正确?建立控制连接发送USER命令释放数据连接发送LIST命令发送QUIT命令建立数据连接发送PASS命令发送PASV命令开始结束连接应答是否正确?USER应答是否正确?PASS应答是否正确?PASV应答是否正确?LIST应答是否正确?LIST应答是否正确?QUIT应答是否正确?

22、释放控制连接获得服务器的目录进行错误处理获得服务器的端口YYYYYYYYNNNNNNNN5 程序代码#include<conio.h>#include<iostream>#include<string.h>#include<winsock2.h>#pragma comment(lib,"ws2_32.lib")#define MAX_SIZE 4096using namespace std;char CmdBufMAX_SIZE ;/定义指令缓冲char Command MAX_SIZE ;/command:命令char Re

23、plyMsgMAX_SIZE ;/reply:应答/msg:信息int nReplyCode;/replycode:应答密码bool bConnected = false;/connected:连接/falseL:假SOCKET SocketControl;/定义控制接口SOCKET SocketData;/定义数据接口bool RecvReply()/从FTP服务器接收响应/recv:接收/reply:响应/控制连接接收数据int nRecv;memset(ReplyMsg, 0, MAX_SIZE);nRecv = recv(SocketControl, ReplyMsg, MAX_SIZ

24、E, 0); /表头文件:#include<sys/types.h>#include<sys/socket.h>/int PASCAL FAR recv(SOCKET s, char FAR* buf, int len, int flags);/s:一个标识已连接套接口的描述字。/buf:用于接收数据的缓冲区。/len:缓冲区长度。/flags:指定调用方式。if (nRecv = SOCKET_ERROR)cout << "接收接口错误!" << endl;closesocket(SocketControl);/int PA

25、SCAL FAR closesocket( SOCKET s);/s:一个套接口的描述字。return false;/获得响应信息与响应码if (nRecv > 4)char* ReplyCodes = new char3;memset(ReplyCodes, 0, 3);/void *memset(void *s, int ch, size_t n);/将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。/memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法memcpy(ReplyCo

26、des, ReplyMsg, 3);/void *memcpy(void *dest, const void *src, size_t n);/从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中nReplyCode = atoi(ReplyCodes);/int atoi(const char *nptr);/参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 0) 字符时停止转换,返回整型数。否则,返回零,return true;bool SendCommand()/向FTP服务器发送命令/控制

27、连接发送数据int nSend;nSend = send(SocketControl, Command, strlen(Command), 0);/表头文件#include <winsock.h>int PASCAL FAR send(SOCKET s, const char FAR* buf, int len, int flags);/s:一个用于标识已连接套接口的描述字。/buf:包含待发送数据的缓冲区。/len:缓冲区中数据的长度。/flags:调用执行方式。/strlen():计算字符串长度,不包括'0'if (nSend = SOCKET_ERROR)co

28、ut << "发送接口错误!" << endl;return false;return true;bool DataConnect(char* ServerAddr)/数据连接/Server:服务器/向FTP服务器发送PASV命令memset(Command, 0, MAX_SIZE);memcpy(Command, "PASV", strlen("PASV");memcpy(Command + strlen("PASV"), "rn", 2);if (!SendComm

29、and()return false;/获得PASV命令的应答信息if (RecvReply()if (nReplyCode != 227)cout << "PASV响应错误!" << endl;closesocket(SocketControl);return false;/分离PASV命令应答信息char* part6;if (strtok(ReplyMsg, "(")for (int i = 0; i < 5; i+)parti = strtok(NULL, ",");if (!parti)retur

30、n false;part5 = strtok(NULL, ")");if (!part5)return false;elsereturn false;/获取FTP服务器数据端口unsigned short ServerPort;/定义无类型短整型/服务器端口ServerPort = unsigned short(atoi(part4) << 8) + atoi(part5);/创建数据连接SocketSocketData = socket(AF_INET, SOCK_STREAM, 0);/int socket(int domain, int type, int

31、 protocol);/第一个参数指定应用程序使用的通信协议的协议族,对于TCP / IP协议族,该参数置AF_INET;/第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部);/第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的类型决定应使用的传输层协议。/该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回I

32、NVALID_SOCKET。if (SocketData = INVALID_SOCKET)cout << "创建接口错误!" << endl;return false;/定义Socket地址和端口sockaddr_in serveraddr2;/struct sockaddr_in /short sin_family; /* Address family 一般来说 AF_INET(地址族)PF_INET(协议族 )*/unsigned short sin_port; /* Port number (必须要采用网络数据格式,普通数字可以用htons(

33、)函数转换成网络数据格式的数字) */struct in_addr sin_addr; /* Internet address */unsigned char sin_zero8; /* Same size as struct sockaddr 没有实际意义,只是为了跟SOCKADDR结构在内存中对齐 */memset(&serveraddr2, 0, sizeof(serveraddr2);serveraddr2.sin_family = AF_INET;serveraddr2.sin_port = htons(ServerPort);/htons 是将整型变量从主机字节顺序转变成网

34、络字节顺序, 就是整数在地址空间存储方式变为:高位字节存放在内存的低地址处。serveraddr2.sin_addr.S_un.S_addr = inet_addr(ServerAddr);/原型:in_addr_t inet_addr(const char *cp);/参数:字符串,一个点分十进制的IP地址/返回值:如果正确执行将返回一个无符号长整数型数。如果传入的字符串不是一个合法的IP地址,将返回INADDR_NONE。/头文件:Winsock2.h./向FTP服务器发送Connect请求int nConnect;nConnect = connect(SocketData, (socka

35、ddr*)&serveraddr2, sizeof(serveraddr2);/建立与一个端的连接。/#include <winsock.h>int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR* name,int namelen);/s:标识一个未连接套接口的描述字。/name:欲进行连接的端口名。/namelen:名字长度。/返回值:若无错误发生,则connect()返回0。否则的话,返回SOCKET_ERROR错误,if (nConnect = SOCKET_ERROR)cout << &qu

36、ot;n服务器请求错误!" << endl;return false;return true;void main(int argc, char* argv)/argc:命令行参数个数/argv:命令行参数数组/检查命令行参数if (argc != 2)cout << "请输入命令:(Ftp客户服务器地址)" << endl;return;/建立与Socket库绑定WSADATA WSAData;/WSADATA:WSADATA结构被用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息。/s

37、truct WSAData /WORD wVersion;/WORD wHighVersion;/char szDescriptionWSADESCRIPTION_LEN + 1;/char szSystemStatusWSASYSSTATUS_LEN + 1;/unsigned short iMaxSockets;/unsigned short iMaxUdpDg;/char *lpVendorInfo;if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)/WSAStartup:初始化当前线程通信环境/MAKEWORD:合并短整数/int WS

38、AStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );wVersionRequested/ wVersionRequested:一个WORD(双字节)型数值,在最高版本的Windows Sockets支持调用者使用,高阶字节指定小版本(修订本)号, 低位字节指定主版本号。/lpWSAData 指向WSADATA数据结构的指针,用来接收Windows Sockets1实现的细节/返回值:0 成功。否则返回下列的错误代码之一。/WSASYSNOTREADY 指出网络通信依赖的网络子系统还没有准备好。/WSAVERNOTSUPPORTED

39、所需的Windows Sockets API的版本未由特定的Windows Sockets实现提供。/WSAEINVAL 应用程序指出的Windows Sockets版本不被该DLL支持。/函数:WORD MAKEWORD/(BYTE bLow, /指定新变量的低字节序;/BYTE bHigh /指定新变量的高字节序;)/返回值:一个无符号16位整形数/这里返回的结果是514,说明是将前面的2和后面的2组成一个新的WORD。即0000 0010 0000 0010cout << "线程通信环境初始化失败!" << endl;return;/创建控制连

40、接SocketSocketControl = socket(AF_INET, SOCK_STREAM, 0);if (SocketControl = INVALID_SOCKET)cout << "创建接口错误!" << endl;return;/定义Socket地址和端口sockaddr_in serveraddr;memset(&serveraddr, 0, sizeof(serveraddr);serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(21);serverad

41、dr.sin_addr.S_un.S_addr = inet_addr(argv1);/向FTP服务器发送Connect请求cout << "FTP>Control Connect."int nConnect;nConnect = connect(SocketControl, (sockaddr*)&serveraddr, sizeof(serveraddr);if (nConnect = SOCKET_ERROR)cout << endl << "Server connect error!" <&

42、lt; endl;return;/获得Connect应答信息if (RecvReply()if (nReplyCode = 220)cout << ReplyMsg;elsecout << "连接响应错误!" << endl;closesocket(SocketControl);return;/向FTP服务器发送USER命令cout << "FTP>USER:"memset(CmdBuf,0,MAX_SIZE);cin.getline(CmdBuf, MAX_SIZE,'n');mem

43、set(Command, 0, MAX_SIZE);memcpy(Command, "USER", strlen("USER");memcpy(Command + strlen("USER"), CmdBuf, strlen(CmdBuf);memcpy(Command + strlen("USER") + strlen(CmdBuf), "rn", 2);if (!SendCommand()return;/获得USER命令的应答信息if (RecvReply()if (nReplyCode =

44、 230 | nReplyCode = 331)cout << ReplyMsg;elsecout << "用户名错误!" << endl;closesocket(SocketControl);return;if (nReplyCode = 331)/向FTP服务器发送PASS命令cout << "FTP>PASS"memset(CmdBuf, 0, MAX_SIZE);cout.flush();for (int i = 0; i < MAX_SIZE; i+)CmdBufi = getch()

45、;if (CmdBufi = 'r')CmdBufi = '0'break;elsecout << '*'memset(Command, 0, MAX_SIZE);memcpy(Command, "PASS", strlen("PASS");memcpy(Command + strlen("PASS"), CmdBuf, strlen(CmdBuf);memcpy(Command + strlen("PASS") + strlen(CmdBuf), &qu

46、ot;rn", 2);if (!SendCommand()return;/获得PASS命令的应答信息if (RecvReply()if (nReplyCode = 230)cout << ReplyMsg;elsecout << "用户密码错误!" << endl;closesocket(SocketControl);return;/向FTP服务器发送LIST命令cout << "FTP>LIST" << endl;char FtpServerMAX_SIZE;memset(FtpServer, 0, MAX_SIZE);memcpy(FtpServer, argv1, strlen(argv1);if (!DataConnect(FtpServer)return;memset(Command, 0, MAX_SIZE);memcpy(Command, "LIST", strlen("LIST");memcpy(Command + strlen("LIST"), "rn", 2);if (!SendCommand()return;/获得LIS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论