網(wǎng)絡(luò)軟件設(shè)計實驗指導(dǎo)書_第1頁
網(wǎng)絡(luò)軟件設(shè)計實驗指導(dǎo)書_第2頁
網(wǎng)絡(luò)軟件設(shè)計實驗指導(dǎo)書_第3頁
網(wǎng)絡(luò)軟件設(shè)計實驗指導(dǎo)書_第4頁
網(wǎng)絡(luò)軟件設(shè)計實驗指導(dǎo)書_第5頁
免費預(yù)覽已結(jié)束,剩余37頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

select多路復(fù)用程序設(shè)計――――――――――――――――5多線程并發(fā)服務(wù)器設(shè)有限狀態(tài)機與有狀態(tài)通信――――――――――――――――――――17基于消息驅(qū)動的異步選擇機制――――――――――――――――――30服務(wù)與協(xié)議實【實驗?zāi)康?3【實驗意義【實驗環(huán)境【實驗原理recvfromsendto就可直接進行通信,更重要的是,面向連接時應(yīng)使SOCK_STREAMSOCK_DGRAMconnect等一系列通常在面向連DGRAM套接字嘗試建立連接,在通信STREAMrecvfrom和服務(wù)可以由另外類型的協(xié)議來實現(xiàn)在套接字這個應(yīng)用和傳輸層實體之間的(協(xié)議數(shù)據(jù)報套接字的服務(wù)由UDP協(xié)議提供而字節(jié)流套接字的服務(wù)則由TCP協(xié)議提【實驗方法sendtosendto用戶選擇發(fā)送或接收的狀態(tài)。如果用戶選擇接收(有兩種接收方式供選擇recvrecvfrom則程序會調(diào)用recvrecvfrom接收數(shù)據(jù),并將接收到的數(shù)據(jù)打印【實驗【實驗步驟 下無連接客戶機和服務(wù)器程序,啟動sniffer捕獲報1000buffer【記錄】客戶機sendto執(zhí)行結(jié)果 【記錄】服務(wù)器recvfrom執(zhí)行結(jié)果 【記錄】由sniffer抓取的UDP報要信息(源、目的地址、報文大小1Mbuffer1M【記錄】客戶機sendto執(zhí)行結(jié)果 【記錄】服務(wù)器recvfrom執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小重新啟動測試程序,測試接收緩沖區(qū)過小。客戶機發(fā)送1000字節(jié),服務(wù)器設(shè)置999【記錄】客戶機sendto執(zhí)行結(jié)果 【記錄】服務(wù)器recvfrom執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小測試文的合并情況??蛻魴C連續(xù)三次發(fā)送,分別10、20和30字節(jié),服務(wù)器在客戶buffer60字節(jié),并進入接收狀態(tài)。【記錄】客戶機3次sendto執(zhí)行結(jié)果 【記錄服務(wù)器3次recvfrom執(zhí)行結(jié)果 錯誤類型【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小 下面向連接客戶機和服務(wù)器程序,啟動sniffer捕獲報1000buffer【記錄】客戶機send執(zhí)行結(jié)果 【記錄】服務(wù)器recv執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小1Mbuffer1M【記錄】客戶機send執(zhí)行結(jié)果 【記錄】服務(wù)器recv執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小重新啟動測試程序,測試接收緩沖區(qū)過小??蛻魴C發(fā)送1000字節(jié),服務(wù)器設(shè)置999recvfrom【記錄】客戶機send執(zhí)行結(jié)果 【記錄】服務(wù)器recv執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小測試文的合并情況??蛻魴C連續(xù)三次發(fā)送,分別為10、20和30字節(jié),服務(wù)器在客buffer60字節(jié),并進入接收狀態(tài)?!居涗洝靠蛻魴C3次send執(zhí)行結(jié)果 【記錄】服務(wù)器3次recv執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小為了便于進行源、目的地址限定的測試,使用3個測試程序,當其中一個與另一個啟動“實驗環(huán)節(jié)2.1” 號。啟動sniffer捕獲報文【記錄】程序1的地址和工作端口 【記錄】程序2的地址和工作端口 【記錄】程序3的地址和工作端口 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小12、3【記錄程序1向程序2sendto執(zhí)行結(jié)果 【記錄】程序2recvfrom執(zhí)行結(jié)果 【記錄程序1向程序3sendto執(zhí)行結(jié)果 【記錄】程序3recvfrom執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小1【記錄程序2向程序1sendto執(zhí)行結(jié)果 【記錄】程序1recvfrom執(zhí)行結(jié)果 【記錄程序3向程序1sendto執(zhí)行結(jié)果 【記錄】程序1recvfrom執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小send、recv函數(shù)的參數(shù),得到結(jié)論a)在“實驗環(huán)節(jié) 下,分別用兩個VC集成環(huán)境打開server工程和client工【記錄】listen函數(shù)的返回值 【記錄】accept函數(shù)的返回值 ,錯誤類型 【記錄】recv函數(shù)的返回值 【記錄】connect函數(shù)的返回值 【記錄】send函數(shù)的返回值 a)在“實驗環(huán)節(jié)3.2” 下,分別用兩個VC集成環(huán)境打開server工程和client工程在面向連接的客戶機和服務(wù)器程序里,使用sendto函數(shù)和recvfrom函數(shù)【記錄】sendto函數(shù)的返回值 ,錯誤原因 【記錄】recvfrom函數(shù)的返回值 測試數(shù)據(jù)報套接字上使用 d等原語對源和目的地址的限定作用 下的3個無連接測試程序,啟動sniffer進行報文捕【記錄】3個測試程序的地址和工作的端IP端1send【記錄】send執(zhí)行結(jié)果 1connect2【記錄】connect執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小1sendconnectsend【記錄】send執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小2recvfrom【記錄】recvfrom執(zhí)行結(jié)果: 程序3執(zhí)行recvfrom【記錄】recvfrom執(zhí)行結(jié)果 1sendto3connectsendto【記錄】sendto執(zhí)行結(jié)果 【記錄】由sniffer抓取的報要信息(源、目的地址、報文大小3recvfrom【記錄】recvfrom執(zhí)行結(jié)果: 程序2執(zhí)行recvfrom【記錄】recvfrom執(zhí)行結(jié)果 2sendconnect【記錄】程序2執(zhí)行send結(jié)果 2sendtop1【記錄】程序2執(zhí)行sendto結(jié)果: 程序1執(zhí)行recvfrom【記錄】程序1執(zhí)行recvfrom結(jié)果: 程序2執(zhí)行sendto,向p3發(fā)送數(shù)據(jù)【記錄】程序2執(zhí)行sendto結(jié)果: 程序3執(zhí)行recvfrom【記錄】程序3執(zhí)行recvfrom結(jié)果 3sendto1【記錄】程序3執(zhí)行sendto結(jié)果: 程序1執(zhí)行recvfrom【記錄】程序1執(zhí)行recvfrom結(jié)果: 程序3執(zhí)行sendto,向p2發(fā)送數(shù)據(jù)【記錄】程序3執(zhí)行sendto結(jié)果: 程序2執(zhí)行recvfrom【記錄】程序2執(zhí)行recvfrom結(jié)果 sendtorecvfromS分別運行“實驗環(huán)節(jié)4.2” 下的2個面向連接客戶機測試程序c1、c2和服務(wù)器s測【記錄】3個測試程序的地址和工作的端IP端sc1sendtos【記錄】c1執(zhí)行sendto結(jié)果 c1recvfron【記錄】c1執(zhí)行recvfrom結(jié)果 ,錯誤類型 c1connect,與服務(wù)器建立連接,c2執(zhí)行connectc1send,srecv【記錄】c1執(zhí)行send結(jié)果 【記錄】s執(zhí)行recv結(jié)果 c1sendtos發(fā)送數(shù)據(jù),srecvfrom【記錄】c1執(zhí)行sendto結(jié)果 【記錄】s執(zhí)行recvfrom結(jié)果 c1使用sendto向c2發(fā)送數(shù)據(jù),測試能否向第發(fā)送數(shù)【記錄】c1執(zhí)行sendto結(jié)果 c2【記錄】c2執(zhí)行recvfrom結(jié)果 ,錯誤類型 s【記錄】s執(zhí)行recvfrom結(jié)果 c2sendto向c1【記錄】c2執(zhí)行sendto結(jié)果 c1【記錄】c1執(zhí)行recvfrom結(jié)果 ,錯誤類型 recvfromsendto,能否獲得數(shù)據(jù)報服務(wù)。send、recv send1000recv,buffer【記錄】客戶機send執(zhí)行結(jié)果 【記錄】服務(wù)器recv執(zhí)行結(jié)果 send1Mrecv,buffer【記錄】客戶機send執(zhí)行結(jié)果 【記錄】服務(wù)器recv執(zhí)行結(jié)果 send1000recv,buffer【記錄】客戶機send執(zhí)行結(jié)果 【記錄】服務(wù)器recv執(zhí)行結(jié)果 send310、20、30字節(jié),服務(wù)器在recv,buffer60字節(jié)【記錄】客戶機3次send執(zhí)行結(jié)果 【記錄】服務(wù)器3次recv執(zhí)行結(jié)果 sendto、recvfrom 下面向連接客戶機和服務(wù)器測試程序recvfrom()1000字節(jié);客sendto()1000字節(jié)。【記錄】客戶機sendto執(zhí)行結(jié)果 【記錄】服務(wù)器recvfrom執(zhí)行結(jié)果 sendto1Mrecvfrom,buffer大1M【記錄】客戶機sendto執(zhí)行結(jié)果 【記錄】服務(wù)器recvfrom執(zhí)行結(jié)果 【記錄】客戶機sendto執(zhí)行結(jié)果 【記錄】服務(wù)器recvfrom執(zhí)行結(jié)果 sendto310、20、30字節(jié),服務(wù)器recvfrom,buffer60字節(jié)【記錄】客戶機3次sendto執(zhí)行結(jié)果 【記錄】服務(wù)器recvfrom執(zhí)行結(jié)果 【實驗結(jié)果分【思考12、為什么對連接關(guān)系的限定服務(wù)在兩種套接字上都可以實現(xiàn),但字節(jié)流服務(wù)基于select的多路復(fù)用程序設(shè)【實驗?zāi)康膕elect的多路復(fù)用程序基本流程【實驗意義【實驗環(huán)境【實驗原理1需要利用select函數(shù)向系統(tǒng)同時查詢多個套接字的狀態(tài),當select返回時,會用體的狀態(tài)采取相應(yīng)的處理,如逐個從讀狀態(tài)隊列上的套接字中數(shù)據(jù)。readread2并返回一個確認信息,如“ackbyserver服務(wù)器不主動關(guān)閉套接字。服務(wù)器,3可以將多路復(fù)用程序結(jié)構(gòu)劃分為三個部分:初始化部分,包括建立套接select(}4、多路復(fù)用程序的之一--套接字管理隊select之前程序都要根據(jù)套接字管理隊列中的套接字,生成三個狀態(tài)隊select循環(huán)結(jié)束前需要將上述三個狀態(tài)隊列清空,并重新填充隊列內(nèi)let隊列,也就無法同時了解多個套接字的狀態(tài),達到多路復(fù)用的目的。5、多路復(fù)用程序的之二――套接字狀態(tài)處select則表明有新的連接接入,這時不是調(diào)用recv()接收數(shù)據(jù),而應(yīng)該調(diào)用 while(}}}}6主套接字能否正常工作:能否進入狀態(tài),能否接收新的連7【實驗方法【實驗步驟1、根據(jù)課程和教案的相關(guān)內(nèi)容寫出基于select的多路復(fù)用服務(wù)器程序聽套接字,初始化套接字隊列;selectselect相關(guān)的形成套接字狀實現(xiàn);完成該隊列的初始化、、刪除和遍歷操作。acceptselect(}FD_SETFD_ZEROselectFD_ISSETrebuildall(重構(gòu)全部)工具對工程進行編譯。記錄在編譯過程中遇到目標:得到正確的套接字標識符,并在綁定后正確地進入狀態(tài)再逐個查詢,最后從隊列中刪除它們,觀察、查詢和刪除操作下套接字隊列【實驗結(jié)果分(從實驗結(jié)果分析,究竟多路復(fù)用服務(wù)的特點是什么?哪些技術(shù)是關(guān)鍵【思考1、有人認為,假設(shè)套接字s上發(fā)生了讀事件,是通過select后發(fā)現(xiàn)sselect前,s已經(jīng)在讀狀態(tài)隊列上,沒隊列上加入各套接字。請問,這樣做將造成什么樣的,試舉一例來說明。2、如果把套接字放到寫狀態(tài)隊列上,會發(fā)現(xiàn)每次select后,各套接字3select及相關(guān)機制,該客戶機能夠達到什么樣的功能。換句話說,在哪種情形下,會在客戶機程序中設(shè)計基于select的【附B//server.cpp#include"winsock.h"#include"stdio.h"#pragmacomment(lib,"wsock32.lib")structsocket_list{SOCKETMainSock;intnum;SOCKETvoidinit_list(socket_list{intlist->MainSock=list->num=for(i=0;i<64;ilist->sock_array[i]=}}voidinsert_list(SOCKETs,socket_list{intfor(i=0;i<64;if(list->sock_array[i]==0){list->sock_array[i]=s;list->num+=1;}}}voiddelete_list(SOCKETs,socket_list{intfor(i=0;i<64;if(list->sock_array[i]==s){list->sock_array[i]=list->num-=1;}}}voidmake_fdlist(socket_list*list,fd_set{intfor(i=0;i<64;i++){if(list->sock_array[i]>}}}intmain(intargc,char*{SOCKETstructsockaddr_inser_addr,remote_addr;intlen;charbuf[128];WSADatawsa;intretval;structsocket_listsock_list;fd_setreadfds,writefds,exceptfds;timevaltimeout;intunsignedlongs=ser_addr.sin_family=AF_INET;ser_addr.sin_port=htons(0x1234);timeout.tv_sec=0;timeout.tv_usec=1;sock_list.MainSock=s;arg=1;retval=select(0,&readfds,&writefds,&exceptfds,&timeout);if(retval==SOCKET_ERROR){retval=WSAGetLastError();}len=sizeof(remote_addr);sock=accept(sock_list.MainSock,(sockaddr*)&remote_addr,&len);if(sock==SOCKET_ERROR)printf("accepta}for(i=0;i<64;i++){if(sock_list.sock_array[i]==0)sock=sock_list.sock_array[i];retval=recv(sock,buf,128,0);if(retval==0){printf("closeasocket\n");}elseif(retval==-retval=WSAGetLastError();if(retval==WSAEWOULDBLOCK)printf("closeasocket\n");}buf[retval]=0;send(sock,"ACKby}}}return}多線程并發(fā)服務(wù)器設(shè)【實驗?zāi)康?23、了解進程(線程)【實驗環(huán)境【實驗原理重復(fù)(循環(huán))服務(wù),主線線程的程序設(shè)計顯得較為簡潔。在執(zhí)行過程中由select機制下的因此六個參數(shù)只使用了兩個,還有一個是輸出參數(shù),其余的3個參數(shù)可以填0dwThrdParam=hThread= //nosecurity //usedefaultstack //threadfunction //argumenttothreadfunction //usedefaultcreationflags //returnsthethread3字標識符傳遞給子線程,讓子線程控制這個連接上的通信,使用dwThrdParam參數(shù)在主、子線程之間傳遞套接字標識符?!緦嶒灧椒ㄔ谥屑夒A段的程序中設(shè)計主線線程的部分。利用對比實驗VCSpy工具觀察進程和線程的狀態(tài)?!緦嶒灢襟E實驗前可先利用MSDN或查閱相關(guān)書籍了解本實驗的重點實驗對象:,創(chuàng)建線程,服務(wù)器將在接受每個客戶的連接時創(chuàng)建一個新線程,線程執(zhí)行的線程獲得的套接字標識符不同,打印的結(jié)果也不同可以通過觀察這個結(jié)4~5個客戶機,觀察服務(wù)器多線程獨,CPUCPU停止測試,回到服務(wù)器工程,這一次改變線程執(zhí)行函數(shù)為server_proc(。CPU3CPU利用server_pro(5,體會多線程并發(fā)服務(wù)的效果?!緦嶒灲Y(jié)果分(提示:多線程并發(fā)服務(wù)的特點【思考1225的實驗現(xiàn)象和之前的哪個實驗的現(xiàn)象類似?為什么并發(fā)服務(wù)可以提供3、為什么利用spy看到的COSERVER的線程個數(shù)比實際因客戶連接而創(chuàng)建的線4有限狀態(tài)機與有狀態(tài)通【實驗?zāi)康摹緦嶒灜h(huán)境【實驗原理1-正在認證(等待用戶名、等待口令A(yù)RP2轉(zhuǎn)換:實體從一個狀態(tài)收到事件激勵進入下一個狀態(tài),并動作的過程31TCP協(xié)議有限狀態(tài)機1狀 事{case1:case1;1;next_state=2;}case}return}4發(fā)送方需要對幀進行,接收方會根據(jù)幀的序號判斷當前幀是否為重復(fù)幀,若5本實驗的目標是在客戶機和服務(wù)器之間以停等協(xié)議的方式傳遞一個文件snd.txt(該文件在實驗下,客戶機發(fā)送,服務(wù)器接收。實驗指導(dǎo)采用字節(jié)從文件中最多100字節(jié)interror_simulator(intprob)模擬,該函數(shù)在發(fā)送數(shù)據(jù)幀/ACK幀1(%)~100(%)之間調(diào)整,返回值voiddelay_simulator(intmax_delay)模擬,該函數(shù)由接收ACK11秒的延時。調(diào)用delay_simulator就進行一段隨機延時。隨機延時將在0~max_delayACKerror_simulator來模擬信道出錯的情況(ACK幀也可能丟失?!緦嶒灧椒ā緦嶒灢襟E12根據(jù)停等協(xié)議狀態(tài)機做出接收方/3,停等協(xié)議需要對幀進行可以簡單設(shè)計幀格式為幀頭+數(shù)據(jù)塊,幀多傳輸100字節(jié)。因此可以對數(shù)據(jù)幀做出如下定義:,structchartype;charsequence_num;01char}}4、程序框架(含事件產(chǎn)生本實驗著重通信過程因此關(guān)于建立連接及關(guān)閉連接的過程就采用之前waiteforaevent;caseX:state=x_fsm(event);caseY:state=…}}select后的讀狀態(tài)隊列中,則認為產(chǎn)生了一個接收事件。105.2selecttimeout5select返回值為0時,可以認為在5秒的計時時間內(nèi)沒有事件發(fā)生,當然也就沒有收到6{caseevent1:…next_state=y;caseevent2:…next_state=}return}7取的動作打印到日志文件—log.txt,可調(diào)用實驗提供的programlog(char*log_string)VCwindiffsnd.txtrx.txt,判斷是否正確接收。還可以結(jié)合客戶機和服務(wù)器的日志PROBDELAY多做幾次。89【實驗結(jié)果分(提示:利用狀態(tài)機設(shè)計、實現(xiàn)有狀態(tài)通信程序過程中有哪些重要的環(huán)節(jié)【思考【附件//server.cpp:Definestheentrypointfortheconsole#include"stdafx.h"#include"winsock.h"#include"stdio.h"#include"time.h"#include<sys/timeb.h>#defineSERVER_PORT0x1234#pragmacomment(lib,"wsock32.lib")#define #define #define //definetheprobability#definePROB1#defineTIMEOUT5structPDU{charcharsequence_num;charlen;char#defineHEADSIZE3FILE*Fid,*LogFid;SOCKETs,ns;intintR1_fsm(intevent);intR0_fsm(intevent);intStart_fsm(intevent);voidProgramLog(char*Event,char*Data);voiddelay_simulator(intmaxdelay);interror_simulator(intintmain(intargc,char*{intretval;intunsignedlongfd_setread_list;intevent;WSADatawsa;timevaltimeout;//openlogLogFid=s=server.sin_family=AF_INET;server.sin_addr.S_un.S_addr=htonl(INADDR_ANY);server.sin_port=htons(0x1234);len=ns=accept(s,(sockaddr*)&remote,&len);if(ns<=0)return0;ProgramLog("acceptaarg=1;Fid=fopen("rx.txt","wb");if(Fid==NULL){printf("can`topenfile\n");return0;}timeout.tv_usec=0;retval=select(0,&read_list,NULL,NULL,&timeout);if(retval==SOCKET_ERROR)if(retval==}retval=recv(ns,(char*)&recvbuf,sizeof(recvbuf),0);if(retval<=0){retval=WSAGetLastError();if(retval==WSAEWOULDBLOCK)gotoend;}if(recvbuf.type==if(recvbuf.sequence_num==0){ProgramLog("Recvframe0",NULL);event=EVENT_RECV0;}elseif(recvbuf.sequence_num==1){event=EVENT_RECV1;ProgramLog("Recvframe1",NULL);}}

}

casestate=Start_fsm(event);casestate=R0_fsm(event);casestate=R1_fsm(event);}return0;}intStart_fsm(int{intcaseEVENT_RECV0://sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","ButcaseEVENT_RECV1://sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","Butlost");next_state=STATE_RECV1;}return}intR0_fsm(int{intcase//duplicateProgramLog("Dicardframe//sendsendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","ButcaseEVENT_RECV1://sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","Butlost");next_state=STATE_RECV1;}return}intR1_fsm(int{intcaseEVENT_RECV0://sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","Butlost");next_state=STATE_RECV0;case//duplicateProgramLog("Dicardframe//sendsendbuf.type=FRAME_ACK;sendbuf.len=3;if(error_simulator(PROB)==FALSE){ProgramLog("SendACK",NULL);ProgramLog("SendACK","But}return}interror_simulator(int{if(rand()*100/RAND_MAX<prob){returnTRUE;}}

returnvoiddelay_simulator(int{//fd_setread_list;intdelay;timevaltimeout;fd_setreadlist;SOCKETss;charss=socket(AF_INET,SOCK_DGRAM,0);delay=rand()*maxdelay/RAND_MAX;c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論