第十二次课Socket网络编程.ppt_第1页
第十二次课Socket网络编程.ppt_第2页
第十二次课Socket网络编程.ppt_第3页
第十二次课Socket网络编程.ppt_第4页
第十二次课Socket网络编程.ppt_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

第三部分UNIX网络编程,第一章Socket接口与网络编程第二章客户/服务器程序设计,第一章socket接口与网络编程,、TCP/IP概述(复习)一、网络环境中分布式进程通信的基本概念二、套接字socket三、socket系统调用四、client/server计算模型五、UNIX域协议(了解)六、并发服务器与超级服务器,TCP/IP概述,TCP/IP与Internet历史OSI与TCP/IPTCP/IP协议栈与数据包IP地址与端口号,TCP/IP与Internet历史,DOD:AdvancedResearchProjectAgency-ARPA发起要求:站点间连接可靠;容易增删节点;连接不同类型的计算机;结果:产生了许多新的概念和方法:异种机互联,资源共享,分组交换,分布控制,通信处理机,协议分层1969年,建立ARPANET1972年,发布ARPANET开始NCP(NetwareContralProtocol)设计编辑RFC(RequestForComment)(60-70年代通信线路变化:租用线无线网-卫星网-网络互联)1975年,ARPANET从试验到运营开始TCP/IP开发(TrasmissionControlProtocol/InternetProtocol)1981年,TCP/IP加入4.1BSDUNIX内核TCP/IP取代NCP以ARPA为主建立Internet,1983年,ARPA向TCP/IP的转换结束;TCP/IP成为军用标准;MILNET从ARPANET中分离出来(后者用于研究);ARPA低价出售TCP/IP;1985年,NSF(NationalSicenceFoundation)围绕6台超级计算机建立TCP/IP网;1986年,NSFNET建成,取代ARPA成为主干网;1988年,NSFNET对一般的研究者开放;1990年,ARPANET停止运行;Internet定义(A.S.Tanenbanm)一台计算机若有TCP/IP协议栈,有IP地址,有能力向其它机器发送IP包,则称它在Internet上。Internet与传统应用EmailNewsRemotelogin90年代以后,WWW出现迅速把Internet用户从学术机构,政府,工业界推广到普通用户.,OSI与TCP/IP,OSI:OpenSystemsInterconnection,ApplicationPresentationSessionTransportNetworkDatalinkPhysical,ApplicationTransportNetworkHost-toNetwork,OSI,TCP/IP,7654321,先有模型后有协议网络层:连接/非连接传输层:连接,先有协议后有模型(不适用于其它网络)网络层:只有非连接传输层:连接/非连接,TCP/IP协议栈与数据包,rlogin,data,tcpportdata,ipaddrtcpportdata,etherheaderipheadertcpheaderdatatail,报文message,分组package,数据报datagram,帧frame,14,20,20,4,bytes,etherheader:48位sourceaddr48位dest.addrIPheader:32位sourceaddr32位dest.addrTCPheader:16位sourceportno.16位dest.portno.,cable,ethernet,IP,TCP,rlogin,cable,ethernet,IP,TCP,IP地址与端口号,0netaddrhostaddr,10netaddrhostaddr,110netaddrhostaddr,1110Multicastaddr(多播组ID),11110reserved,A类,B类,C类,D类,E类,55,55,55,55,55,Ipaddr=INADDR_ANY(全0)表示多宿地址(multihomed)端口号(port)分配(BSD,16位)1-255保留256-5114.3BSD保留512-1023rresvport()分配(client用)1024-50000自动分配(port=0时bind在此范围指定port值)50001-65535BSDserver,一、网络环境中分布式进程通信的基本概念,网络层及以下的各层实现了网络中主机之间的通信,但是主机间数据通信不是最终的目的;网络最本质的活动是分布在不同地理位置的主机之间的进程通信,以实现各种网络服务功能;设置传输层的主要目的就是要实现分布式进程通信。,单机环境下的进程通信,文件锁、管道(pipe)、命名管道(namedpipe)和软中断信号(signal)机制;消息队列(messagequeue)、信号量(semaphore)和共享存储区(sharedmemory),统称为进程通信(interprocesscommunicationIPC)机制;IPC机制也不适应于网络环境中的进程通信。,网络环境中的进程通信与单机系统内部的进程通信的主要区别:网络中主机的高度自治性;不是在同一个主机系统之中,没有一个统一的高层进行控制与管理;网络中一台主机对其它主机的如下情况一概无从知道活动状态位于其它主机系统中的各个进程状态这些进程什么时间参与网络活动希望与网络中哪一台主机的什么进程通信,网络环境中分布式进程通信需要解决:,进程命名与寻址方法多重协议的识别进程间相互作用的模式,(1)网络环境中进程标识,在一台计算机中,不同的进程用进程号或进程标识(processID)唯一地标识出来网络环境中完整的进程标识应该是:本地主机地址-本地进程标识远程主机地址-远程进程标识不同主机上的进程标识,需要主机地址(如IP地址)和端口号的参与。,(2)多重协议的识别,Unix网络编程接口支持的通信协议包括:TCP/IP协议族的TCP和UDP施乐网络系统(XeroxNS)的顺序分组协议(SequentialPacketProtocol,SPP,类似于TCP)互联网数据报协议(InternetworkingDatagramProtocol,IDP,类似于UDP)ARPANET的接口报文处理机链路协议(IMPLINK)Unix系统的内部进程协议一个特定的网络间进程通信只能使用相同的网络通信协议,网络环境中一个进程的全网唯一的标识需要一个三元组(half-association)来表示:(协议,本地地址,本地端口号).网络环境中一个完整的进程通信标识需要一个五元组(association)来表示:(协议,本地主机地址,本地端口号,远端主机地址,远端端口号),(3)进程间相互作用模式:Client/Server模型,在TCP/IP协议体系中,进程间的相互作用采用客户/服务器(Client/Server)模型;客户与服务器分别表示相互通信的两个应用程序的进程;客户向服务器发出服务请求,服务器响应客户的请求,提供客户机所需要的网络服务;,网络应用程序采用客户/服务器模式的原因,网络环境中资源、计算能力和信息分布的不均匀性。网络环境中进程通信的异步性。必须要建立一个体制,为准备通信的进程之间建立起连接,在进程交换数据的过程中维护连接,为数据交换提供同步。(不存在一个高层的调度与协调),在客户/服务器模式中,每次通信均由随机启动的客户进程发起,而服务器进程从开机起就处于等待状态,这样可以保证服务器随时对客户请求做出响应。,二.套接字(socket),套接字接口与套接字套接字地址结构INET与UNIX协议族地址结构套接字对(socketpair),Socket概念,套接字接口是应用层与TCP/IP协议族通信的中间软件抽象层。它是一组网络编程接口,包括一系列系统和库调用,头文件和数据结构。套接字接口的主要对象是套接字,可以把它看作本地应用进程与网络的接入点。,套接字地址结构,SocketAPI中提供了三种类型的地址:sockaddr是通用的套接字结构;sockaddr_in为Internet协议族的地址描述结构;sockaddr_un则是Unix协议族的地址描述结构;structsockaddru_shortsa_family;/*地址族*/charsa_data14;/*与协议有关的地址*/;Sa_family可以取值:AF_INET/internet协议Ipv4AF_UNIX/unixinternal协议,posix.1g定义为AF_LOCALAF_INET6/internet协议Ipv6AF_NS/XeroxNS协议AF_IPX/Novell网络协议,INET与UNIX协议族地址结构,AF_INET协议族地址结构:structsockaddr_inshortsin_family;/*AF_INET*/u_shortsin_portstructin_addrsin_addr;charsin_zero8;structin_addru_longs_addr;/*32位netid/hostid地址*/;AF_UNIX协议族地址结构:structsockaddr_unshortsin_famity;/*AF_UNIX*/charsin_path108;/*文件名,不代表真正文件*/;,unsignedlonginet_addr(char*address);address是以NULL结尾的点分IPv4字符串。该函数返回32位的地址。例:in_addraddr;addr.s_addr=inet_addr(3);char*inet_ntoa(structin_addraddress);address是IPv4地址结构,函数返回一指向包含点分IP地址的静态存储区字符指针,如果错误则函数返回NULL。,地址转换函数(inet_addr()和inet_ntoa(),套接字对(socketpair),套接字:标志每个端点的两个值(ip地址和port号)通常称为一个套接字(socket).套接字对是一个四元组:本地IP地址,本地端口号,远地IP地址,远地端口号。一个套接字对唯一标识一个TCP连接,但此概念也可扩展到UDP。套接字对表示:本地IP地址,本地端口,远地IP地址,远地端口例如:,1500,5,21,三.socket系统调用,socketbindlistenacceptconnectclose读写函数,socket系统调用简介,套接字接口的主要对象是套接字,可以把它看作本地应用进程与网络的接入点,接口定义了各种操作:(1)创建套接字(2)将套接字连到网上(3)通过套接字发送/接收消息(4)关闭套接字,socket,intsocket(intfamily,inttype,intprotocol);建立套接字,指定通信类型,返回套接字描述字family:协议族AF_INET(IPV4)AF_INET6(IPV6)AF_UNIX(AF_LOCAL)type:套接字类型SOCK_STREAM:字节流(使用TCP实现)SOCK_DGRAM:数据报(使用UDP实现)SOCK_RAW:原始(裸层socket,允许特权进程直接访问低层通信协议)protocol:协议名,常缺省为0;,bind,intbind(intsockfd,conststructsockaddr*myaddr,socket_taddrlen);给socket分配本地协议地址(ipaddr和port).sockfd:表示已获得的套接字号ipaddr=0(INADDR_ANY):在连接(TCP)或发送数据报(UCP)时核心指定.port=0:核心指定临时端口号.非连接协议也可以使用bind,但较少使用。INADDR_ANY通配符地址告诉系统假如有多个接口,本服务器进程将接受任意一个Internet接口的连接。具体含义是绑定到。此时,对所有的地址都将是有效的,如果系统采用多个网卡,那么将在所有网卡上进行绑定,可以收到发送到所有有效地址上数据包。,listen,intlisten(intsockfd,intbacklog);表明服务器进程愿意接收客户进程的连接请求,为套接字建立一个连接请求侦听队列。backlog:定义在指定的套接字上可以有多少个待处理的连接。通常最大为5(1=backlog=5)。指定了正在等待连接的最大队列长度,它的作用在于处理可能同时出现的几个连接请求。例如,假定backlog参数为2,如果三个客户机同时发出请求,那么头两个会被放在等待处理的队列中,以便服务器程序依次为它们提供服务,而第三个连接的客户则会收到WSAECONNREFUSED错误。listen()一般在accept()之前调用。,accept,intaccept(intsockfd,structsockaddr*cliaddr,socklen_t*addrlen);用于服务器进程接收客户进程的连接请求。sockfd:用于收听的套接字,即监听套接字;cliaddr:返回客户端协议地址(可以为Null);addrlen:cliaddr结构的长度;函数返回值为新生成的用于连接的套接字(四元组形成)。,connectclose,intconnect(intsockfd,conststructsockaddr*servaddr,socklen_taddrlen);客户建立与服务器的连接。servaddr含有服务器的协议地址;本地(客户)的协议地址由核心指定;intclose(intsockfd);关闭套接字,发送队列中的余留数据,终止TCP连接。,socket(),bind(),listen(),accept(),close(),调用socket创建一个套接字,并在传输层实体中分配表空间,返回一个文件描述符,用于以后调用中使用。,调用bind将某地址赋予,使得远程应用程序能访问本地应用程序。,调用listen分配数据空间,以便存储多个用户的连接建立请求。,调用accept将本地应用程序阻塞起来,等待接收客户端发来的连接请求。接收到请求时,将生成一个新的socket。,释放连接:使用close原语单独释放连接。,服务器端(TCP),socket(),close(),connect(),调用socket创建一个套接字,并在传输层实体中分配表空间,返回一个文件描述符,用于以后调用中使用。,调用connect阻塞应用程序,传输层实体开始建立连接,当连接建立完成时,取消阻塞。,释放连接:使用close原语单独释放连接。,客户端(TCP),服务器程序实例,SOCKETs,clientSocket;/监听Socket/客户Socketsockaddr_inaddr,clientAddr;/服务器的绑定地址/客户地址in_addrclientIn;/客户IP地址intnClientAddrLen;/客户地址结构长度/创建流Sockets=socket(AF_INET,SOCK_STREAM,0);if(s!=INVALID_SOCKET)/填充地址信息addr.sin_family=AF_INET;addr.sin_port=htons(2000);addr.sin_addr.s_addr=htonl(INADDR_ANY);/绑定Socketif(bind(s,(sockaddr*)/接受连接clientSocket=accept(s,(sockaddr*)/.,客户同服务器建立连接示例,SOCKETs;sockaddr_inserverAddr;s=socket(AF_INET,SOCK_STREAM,0);serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(2000);serverAddr.sin_addr.s_addr=inet_addr(5);if(connect(s,(sockaddr*)else/.,字节序,不同的计算机系统采用不同的字节序存储数据,同样一个两字节的16位整数,在内存中存储的方式就不同:一种方式是将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;另一种是将高字节存储在起始地址,称为“Big-Endian”字节序,由Macintosh、Motorola等所采用;,0 x04,0 x03,0 x03,0 x04,内存地址增大方向,Big-Endian,Little-Endian,0 x0304,0001,字节序转换函数,把给定系统所采用的字节序称为主机字节序。为了避免不同类别主机之间在数据交换时由于对于字节序解释的不同而导致的差错,引入了网络传输所采用的字节序,即网络字节序。规定网络字节序使用“Big-Endian”方式。主机到网络u_longhtonl(u_longhostlong);/for32bitsu_shorthtons(u_shortshort);/for16bits网络到主机u_longntohl(u_longhostlong);/for32bitsu_shortntohs(u_shortshort);/for16bits,地址转换函数,inet_aton,inet_addr和inet_ntoa在点分十进制数串(如“0”)与其32位网络字节二进制值之前转换IPV4地址。有2个比较新的函数inet_pton和inet_ntop,这2个对IPV4和IPV6地址都能处理将点分十进制串转换成网络字节序二进制值。intinet_pton(intfamily,constchar*strptr,void*addrptr);将网络字节序二进制值转换成点分十进制串。constchar*inet_ntop(intfamily,constvoid*addrptr,char*strptr,size_tlen);family可以是AF_INET或AF_INET6;,读写函数,标准文件读写函数:write、readssize_twrite(intfd,void*buff,size_tnbytes);ssize_tread(intfd,void*buff,size_tnbytes);面向连接的socket读写函数:intsend(intsd,constvoid*msg,size_tlen,intflags);intrecv(intsd,void*msg,size_tlen,intflags);msg:指向用于发送/接收数据的缓冲区的指针。len:是缓冲区的字节数。flags:如果flags为0,则和read,write一样的操作。MSG_DONTROUTE|不查找路由表MSG_OOB|接受或者发送带外数据(需要优先处理)MSG_PEEK|查看数据,并不从系统缓冲区移走数据MSG_WAITALL|等待所有数据,非连接读写函数:intsendto(intsd,constvoid*msg,size_tlen,intflags,structsockaddr*to,intaddrlen);允许进程显式指定消息目的。当调用成功,返回被成功发送的字节数。如客户端未曾执行bind,则sendto分配本地IP地址和临时port号;to指向server协议地址。intrecvfrom(intsd,void*msg,size_tlen,intflags,structsockaddr*from,socklen_t*addrlen);允许应用程序接收通信对等层的地址。当调用成功,返回被接收的字节数。,TCPSockets编程基本流程,socket(),bind(),listen(),accept(),send(),recv(),close(),send(),socket(),recv(),close(),connect(),recv(),建立连接,数据请求,数据响应,断连指示,Client,Server,Server,socket(),bind(),recvfrom(),Blocksuntildatareceived,Processrequest,sendto(),Client,socket(),(bind(),sendto(),Blocksuntildatareceived,Processreply,recvfrom(),close(),close(),无连接协议的Socket编程基本流程,四.client/server计算模型,面向连接与socket函数非连接与socket函数,面向连接与socket函数,TCPserversocket()bind()listen()accept()(等待client连接)read()处理请求write()read()close(),TCPclientsocket()connect()write()read()close(),建立连接,request,reply,endoffile,socket函数与四元组的建立,非连接与socket函数,UDPClientsocket()(bind()sendto()recvfrom(),UDPServersocket()bind()recvfrom()处理请求sendto(),socket函数与四元组的建立,request,repley,五.UNIX域协议(了解),流管道和命名流管道,流管道,socket,无名流管道:同一家族进程间通过socket自动同步,file,file,sd1,sd0,fork复制,send,send,recv,recv,缓冲区,打开文件表,打开文件表,socketpair函数,#includeintsocketpair(intfamily,inttype,intprotocol,intsockfd2);生成两个互相连接的套接字,在sockfd2返回。family必须是AF_LOCAL,protocol必须是0。type可以是SOCK_STREAM或SOCK_DGRAM。例:#include#includeints_pipe(intfd2)return(socketpair(AF_LOCAL,SOCK_STREAM,0,fd);,有名流管道,例:建立有名流管道,借助于bind函数为无名流管道指定一个名字。intns_pipe(char*name,intfd2)intlen;structsockaddr_ununix_addr;if(s_pipe(fd)0)return(-1);unlink(name);bzero(char*),四种管道比较,单向双向4.3BSDSystemVpipeyyesyesnamedpipe(FIFO)ysomeyesstreampipeyyesyesNamedstreampipeyyesyessocketpair与pipe:socketpair类似于unix的pipe。(BSD的pipe就是用socketpair实现的。)SOCK_STREAM的socketpair也叫做streampipe(流管道),与unix的pipe的单双工不同,socketpair是全双工的(full-duplex),即每个描述字(sockfd)都可以读写。,六.并发服务器与超级服务器,服务器分类并发服务器多路IO(SELECT)超级服务器inetd,客户机/服务器模型的工作实质是“请求驱动”;在网络环境中,客户进程发出请求完全随机。在同一个时刻,可能有多个客户进程向一个服务器发出服务请求;为了实现服务器的功能,在服务器的设计中要解决服务器的:并发请求处理能力并发服务器的进程标识服务器安全,服务器分类,循环,iterative:服务器亲自循环处理各项请求(短时间可处理完)。并发,concurrent:服务器fork子进(线)程处理各项请求(不知需处理多少时间);父进程等待下个请求。,并发服务器:并发服务器可以处理多个客户的服务请求;从服务器不依赖主服务器而独立处理客户服务请求;不同的从服务器可以分别处理不同的客户的服务请求;系统的实时性好;重复服务器:处理客户的服务请求的数量受到请求队列长度的限制,但可以有效地控制请求处理的时间;并发服务器适应于面向连接的服务类型;重复服务器适应于无连接的服务类型。,connect(),client,listenfd,connfd,listenfd,connfd,2.请求连接,3.连接成功,5.fork()子server复制打开文件表,6.close(listenfd),1.accept(listenfd),4.connfd=accept()成功返回6.close(connfd),父server打开文件表,实现框架:1.父服务器接收连接(accept);2.客户请求连接(connet);3.客户连接成功(connect返回);4.服务器连接成功(accept返回connfd);5.父服务器fork子服务器,复制打开文件表;6.父子进程分别关闭connfd和listenfd;,并发服务器,并发服务器举例,client,server,.1500,5.21,客户主机:,*.21,*.*收听,多宿主机:56,连接请求,5.21,多宿主机(multihomedhost):拥有多个IP地址(多块网络接口板)的主机。server端:套接字对*.21,*.*用于收听客户机连接:第一个*表示自己是多宿主机,即不绑定(bind)IP地址。21号端口是保留的ftp服务器端口号。后面的*.*表示返回的客户端的套接字。客户端:端口号1500(1501)号是自动分配的一个临时的port号。,不同主机上两个client程序举例,client,.1500,5.21,客户主机:,连接请求,5.21,client,.1500,5.21,客户主机:,建立连接,.,child2,child1,server,*.21,*.*,5.21.1500,5.21.1500,多宿主机:56,fork,fork,.,同一主机上两个client程序举例,client1,client2,child2,child1,server,,15005.21,.15016.21,*.21,*.*,5.21.1500,6.21.1501,1个客户机:,多宿主机:56,fork,fork,程序模型,pid_tpid;intlistenfd,connfd;listenfd=socket();bind(listenfd,);/*绑定本服务器的ipaddr和port*/listen(listenfd,LISTENQ);for(;)connfd=accept(listenfd,)if(pid=fork()=0)/*建立子进程*/close(listenfd);/*子进程关闭监听socket*/doit(connfd);/*处理客户请求*/close(connfd);exit(0)close(connfd);/*父进程关闭连接socket*/,并发服务器的优点,改善响应时间和客户机总吞吐量;排除潜在死锁;可实现多协议多服务;支持多种硬件平台,多cpu实现.并发服务器的进一步发展:并发线程;进程池;线程池,;多个监听套接字(多路I/O)超级服务器,.,阻塞与非阻塞,对一个文件描述符指定的文件或设备,有两种工作方式:阻塞与非阻塞。所谓阻塞方式的意思是指,当试图对该文件描述符进行读写时,如果当时没有东西可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止。而对于非阻塞状态,如果没有东西可读,或者不可写,读写函数马上返回,而不会等待。缺省情况下,文件描述符处于阻塞状态。实现一个聊天室程序server需要轮流查询与各client建立的socket,一旦可读就将该socket中的字符读出来并向所有其他client发送。还要随时查看是否有新的client试图建立连接。如果server在任何一个地方阻塞了,其他client发送的内容或新client试图建立连接都会受到影响。所以不能使用缺省的阻塞的文件工作方式,而需要将文件的工作方式变成非阻塞方式。,fcntl()改变阻塞与非阻塞状态,在UNIX下,函数fcntl()可以用来改变文件I/O操作的工作方式,函数描述如下:fcntl(sockfd,F_SETFL,O_NONBLOCK);/sockfd是要改变状态的文件描述符./F_SETFL表明要改变文件描述符的状态/O_NONBLOCK表示将文件描述符变为非阻塞的.,使用SELECT方法,虽然我们不希望在某一个用户没有反应时阻塞其他的用户,但我们却应该在没有任何用户有反应的情况之下停止程序的运行,让出抢占的系统资源,进入阻塞状态。现在的UNIX系统中都提供了select方法,具体实现方式如下:select方法中,所有文件描述符(或套接字)都是阻塞的。使用select判断一组文件描述符(或套接字)中是否有一个可读(写),如果没有就阻塞,直到有一个的时候就被唤醒。,多路IOSELECT,select函数告诉核心,当前进程要等待若干事件之一的发生,当其中的事件发生或超时时,该进程被唤醒,函数返回。这里的事件分为三类:文件描述字(或套接字)可读,可写和有例外条件。intselect(intmaxfdpl,fd_set*readset,fd_set*writeset,fd_set*exceptset,conststructtimeval*timeout);fd_set结构是一个字位串,调用时,指示要检测的fd(或sd)。返回时,readset指向的fd_set含有已成为可读的fd(sd)。同样,writeset,execeptset指向的fd_set含有已成为可写或例外的fd(sd)。每一位表示一个对应的fd(或sd)的状态:可读/可写/例外。maxfdpl表示要等待的fd(sd)的最大数加1(maxfdplus1)。,fd_set结构可以利用如下一些宏来进行相关操作:voidFD_ZERO(fd_set*fdset);/*fd_set所有位清零*/voidFD_SET(intfd,fd_set*fdset);/*将fd加入set*/voidFD_CLR(intfd,fd_set*fdset);/*将fd从set中清除*/voidFD_ISSET(intfd,fd_set*fdset);/*检查fd是否可读写*/timeoutNULL指针代表无限等待,否则是指向timeval结构的指针,代表最长等待时间(秒,微秒):structtimevallongtv_sec;/*秒数*/longtv_usec;/*微秒数*/;select正常返回就绪的fd(sd)数目,超时返回0,出错返回-1。,0123456789101112131415,fd-set,011

温馨提示

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

评论

0/150

提交评论