ping程序的設(shè)計及實現(xiàn)報告_第1頁
ping程序的設(shè)計及實現(xiàn)報告_第2頁
ping程序的設(shè)計及實現(xiàn)報告_第3頁
ping程序的設(shè)計及實現(xiàn)報告_第4頁
ping程序的設(shè)計及實現(xiàn)報告_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

..XX學(xué)院課程設(shè)計報告課程名稱:計算機網(wǎng)絡(luò)課程設(shè)計設(shè)計題目:ping程序的設(shè)計與實現(xiàn)系別:計算機與信息工程學(xué)院專業(yè):計算科學(xué)與技術(shù)組別:第五小組起止日期:20XX12月1日~20XX12月8日指導(dǎo)教師:計算機科學(xué)與技術(shù)系二○一一年制課程設(shè)計題目Ping程序的設(shè)計與實現(xiàn)組長學(xué)號2011220125班級計專〔2班系別計算機與信息工程學(xué)院專業(yè)計算機科學(xué)與技術(shù)組員指導(dǎo)教師課程設(shè)計目的通過設(shè)計Ping程序,理解Ping程序的實現(xiàn)原理,并初步講解了c語言網(wǎng)絡(luò)編程技術(shù)。本章涉及很多網(wǎng)絡(luò)編程函數(shù)和編程技巧,包括庫文件的導(dǎo)入;winsock的初始化、注銷;socket的創(chuàng)建、關(guān)閉;設(shè)置socket選項;根據(jù)主機名獲取IP地址;從堆中分配一定數(shù)量的空間、釋放從堆中分配的空間;數(shù)據(jù)報的發(fā)送;數(shù)據(jù)報的接等。課程設(shè)計所需環(huán)境WindowsXP+VisualC++6.0課程設(shè)計任務(wù)要求實現(xiàn)ping的基本功能,實現(xiàn)ping-t課程設(shè)計工作進度計劃序號起止日期工作內(nèi)容分工情況012011-12-1~2011-12-2展開思路討論工作并搜集相關(guān)資料022011-12-3~2011-12-6具體制作,編寫相關(guān)代碼,制作相關(guān)窗口并實現(xiàn),美化界面。032011-12-7~2011-12-8編寫并完成課程設(shè)計報告指導(dǎo)教師簽字:年月日教研室審核意見:教研室主任簽字:年月日課程設(shè)計任務(wù)書一.Ping程序運行原理在網(wǎng)絡(luò)層,除了IP協(xié)議之外,還有一些控制協(xié)議,如ICMP,ARP,DHCP等。ping的基礎(chǔ)知識原始套接字原始套接字是允許訪問底層傳輸協(xié)議的一種套接字類型。使用原始套接字操作IP數(shù)據(jù)報,可以進行路由跟蹤,Ping等。另外,使用原始套接字需要知道許多下層協(xié)議結(jié)構(gòu)的知識,所以下面討論ICMP,IP,UDP,TCP格式。原始套接字有兩種類型,第一種類型是在IP頭種使用預(yù)定義的協(xié)議,如ICMP;第二種類型是在IP頭種使用自定義的協(xié)議。下面使用創(chuàng)建原始套接字的方法。創(chuàng)建套接字的函數(shù)是socket<>或者WSASocket<>,只不過要將套接字類型指定為SOCK_RAW,代碼如下:SOCKETsraw=::socket<AF_INET,SOCK_RAW,IPPROTO_ICMP>;創(chuàng)建原始套接字時socket函數(shù)的第三個參數(shù)protocol值將成為IP頭中得協(xié)議域的值。IPPROTO_ICMP指定要使用ICMP。原始套解釋提供管理下層傳輸?shù)哪芰ΑK麄兛赡軙粣阂饫?因此,僅Administrator組的成員能夠創(chuàng)建SOCK_RAW類型的套接字。任何人在WindowsNT下都可以創(chuàng)建原始套接字,但是沒有Administrator權(quán)限的人不能用它來做任何事情,因為bind函數(shù)將會失敗,出錯碼WSAEACCES..在上面的套接字創(chuàng)建代碼種,我們使用ICMP,也可以使用IIGMP,UDP,IP或者原始IP,對應(yīng)的宏定義分別是IPPROTO_IGMP,IPROTO_UDP,IPPROTO_IP或者IPPROTO_RAW。其中協(xié)議標志IPPROTO_UDP,IPPROTO_IP,和IPPROTO_RAW需要啟動IP_HDRINCL選項。使用恰當?shù)膮f(xié)議標志創(chuàng)建原始套接字之后,便可以在發(fā)送和接受調(diào)用種使用此套接字句柄了。無論IP_HDRINCL選項是否設(shè)置,在原始套接字上接收到的數(shù)據(jù)種都會將包含IP頭。ICMP協(xié)議與校驗和的計算互聯(lián)網(wǎng)上得操作由路由器緊緊地監(jiān)控著。當有異常飯送時候,具體事件通過ICMP報道,如目的不可到達,TTL超時等。這個協(xié)議也用來測試互聯(lián)網(wǎng)。每個ICMP消息都封裝在IP封包中,所以使用IP尋址,ICMP消息的格式如下:首8位表示ICMP的類型,通常可以分為請求消息和錯誤報告消息兩類。接下來的八位表示ICMP代碼,這個域進一步定義了請求或者是消息的類型。接下來八位表示icmp的校驗和。它提供了ICMP頭和他的實際數(shù)據(jù)。3.校驗和的計算發(fā)送ICMP報文時,必須由程序自己計算校驗和,并將它填入ICMP頭部的對應(yīng)域中。校驗和的計算方法是:將數(shù)據(jù)以資為單位累加到一個雙字中,如果數(shù)據(jù)長度為奇數(shù),最后一個字節(jié)將被擴展到字,累加的結(jié)果是一個雙字,最后將這個雙字的高16bit和低16bit相加后取反,便得到了校驗和。u_shortchecksum<u_short*buffer,intlen>{registerintnleft=len;registeru_short*w=buffer;registeru_shortanswer;registerintsum=0;//使用32位累加器,進行16位的反饋計算while<nleft>1>{sum+=*w++;nleft-=2;}//補全奇數(shù)位if<nleft==1>{u_shortu=0;*<u_char*><&u>=*<u_char*>w;sum+=u;}//將反饋的16位從高位移到低位sum=<sum>>16>+<sum&0xffff>;sum+=<sum>>16>;answer=~sum;return<answer>;}3.Ping程序設(shè)計思路:要實現(xiàn)ping程序,需要實現(xiàn)以下步驟:創(chuàng)建協(xié)議類型為IPPROTO_ICMP的原始套接字,設(shè)置套接字屬性。創(chuàng)建并初始化ICMP封包。調(diào)用sendto函數(shù)向遠程主機發(fā)送ICMP請求。調(diào)用recfrom函數(shù)接受ICMP響應(yīng)。初始化ICMP頭時先初始化消息類型和代碼域,之后是回顯請求頭。程序首先定義了ICMP頭的數(shù)據(jù)結(jié)構(gòu)IMCP_HDR.。ICMP_HDR的定義如下:typedefstruct_ICMPHeader{u_charType;//類型u_charCode;//代碼u_shortChecksum;//首部校驗和u_shortID;//標識u_shortSeq;//序列號charData;//數(shù)據(jù)}ICMPHDR,*PICMPHDR;4.編程時,需要用到一些windows函數(shù),說明如下:<1>.intWSAStartup<WORDwVersionRequested,LPWSADATAlpWSAData>;函數(shù)說明:為了在應(yīng)用程序當中調(diào)用任何一個WinsockAPI函數(shù),首先第一件事情就是必須通過WSAStartup函數(shù)完成對Winsock服務(wù)的初始化,因此需要調(diào)用WSAStartup函數(shù)。使用Socket的程序在使用Socket之前必須調(diào)用WSAStartup函數(shù)。該函數(shù)的第一個參數(shù)指明程序請求使用的Socket版本,其中高位字節(jié)指明副版本、低位字節(jié)指明主版本;操作系統(tǒng)利用第二個參數(shù)返回請求的Socket的版本信息。當一個應(yīng)用程序調(diào)用WSAStartup函數(shù)時,操作系統(tǒng)根據(jù)請求的Socket版本來搜索相應(yīng)的Socket庫,然后綁定找到的Socket庫到該應(yīng)用程序中。以后應(yīng)用程序就可以調(diào)用所請求的Socket庫中的其它Socket函數(shù)了。<2>.SOCKETsocket<intaf,inttype,intprotocol>;函數(shù)說明:應(yīng)用程序調(diào)用socket函數(shù)來創(chuàng)建一個能夠進行網(wǎng)絡(luò)通信的套接字。第一個參數(shù)指定應(yīng)用程序使用的通信協(xié)議的協(xié)議族,對于TCP/IP協(xié)議族,該參數(shù)置AF_INET;第二個參數(shù)指定要創(chuàng)建的套接字類型,流套接字類型為SOCK_STREAM、數(shù)據(jù)報套接字類型為SOCK_DGRAM、原始套接字SOCK_RAW<WinSock接口并不適用某種特定的協(xié)議去封裝它,而是由程序自行處理數(shù)據(jù)包以 及協(xié)議首部>;第三個參數(shù)指定應(yīng)用程序所使用的通信協(xié)議。<3>.intsendto<SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen>;函數(shù)說明:返回值:實際發(fā)送數(shù)據(jù)的長度。parameter:s套接字buff待發(fā)送數(shù)據(jù)的緩沖區(qū)size緩沖區(qū)長度Flags調(diào)用方式標志位,一般為0,改變Flags,將會改變Sendto發(fā)送的形式addr〔可選指針,指向目的套接字的地址lenaddr所指地址的長度<4>intrecvfrom<SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen>;函數(shù)說明:recvfrom<>用來接收遠程主機經(jīng)指定的socket傳來的數(shù)據(jù),并把數(shù)據(jù)傳到由參數(shù)buf指向的內(nèi)存空間,參數(shù)len為可接收數(shù)據(jù)的最大長度.參數(shù)flags一般設(shè)0,其他數(shù)值定義參考recv<>.參數(shù)from用來指定欲傳送的網(wǎng)絡(luò)地址,結(jié)構(gòu)sockaddr請參考bind<>函數(shù).參數(shù)fromlen為sockaddr的結(jié)構(gòu)長度.二.程序的流程圖和源碼Ping程序的設(shè)計與實現(xiàn)大致可分為四個模塊〔見圖1-1,分別是:初始化模塊、功能控制模塊、ping模塊、mian測試模塊。PPing程序的設(shè)計與實現(xiàn)初始化模塊功能控制模塊Ping模塊main測試模塊圖1-11.初始化模塊:該模塊用于定義及初始化各個全局變量,為winsock加載winsock體?!惨妶D1-2主要包括定義IP首部格式、定義ICMP首部格式、定義ICMP回應(yīng)請求、定義ICMP回應(yīng)答復(fù)。初始化模塊初始化模塊定義IP首部格式定義ICMP首部格式定義ICMP回應(yīng)請求定義ICMP回應(yīng)答復(fù)圖1-22.功能控制模塊:該模塊是被其他模塊調(diào)用,其功能包括計算校驗和、發(fā)送回應(yīng)請求函數(shù)、接收應(yīng)答回復(fù)并進行解析、等待回應(yīng)答復(fù)〔主是要select模型。〔見圖1-3,1-4,1-5,1-6計算校驗和函數(shù)源碼:否否<將反饋的16位從高位移到低位>是<使用32位累加器,進行16位的反饋計算>Checksum<>開始定義初始化一些變量Nleft>1sum+=*w++;nleft-=2;Nleft=1是<補全奇數(shù)位>sum+=u;sum=<sum>>16>+<sum&0xffff>;sum+=<sum>>16>;answer=~sum;返回answer結(jié)束圖1-3是是SendEchoRequest<>開始定義初始化一些變量填充要發(fā)送的數(shù)據(jù)存儲發(fā)送的時間計算回應(yīng)請求的校驗和發(fā)送回應(yīng)請求返回nRet調(diào)用發(fā)送錯誤函數(shù)結(jié)束圖1-4WaitForEchoReply<>開始WaitForEchoReply<>開始定義初始化一些變量返回timeout結(jié)束是RecvEchoReply<>開始定義初始化一些變量接收應(yīng)答回復(fù)檢驗接收結(jié)果返回應(yīng)答時間調(diào)用發(fā)送錯誤函數(shù)結(jié)束圖1-6圖1-53.Ping模塊功能模塊:該模塊是本程序的核心模塊,調(diào)用其他模塊實現(xiàn)其功能,進而實現(xiàn)Ping的功能。s否否是是開始定義初始化各個局部變量判斷WSAGetLastError<>是否調(diào)用成功否檢測目標主機是否為NULL設(shè)置目標主機的IP地址,開始ping發(fā)起四次ping測試發(fā)送ICMP回應(yīng)請求等待回復(fù)的數(shù)據(jù)接收回復(fù)計算花費時間Loop是否為0輸出平均次數(shù)輸出ping結(jié)果清除殘余結(jié)束4.main<>函數(shù)模塊:向指定的域名或IP地址發(fā)送Echo請求報文;根據(jù)響應(yīng)報文顯示出Ping的結(jié)果;程序僅支持-t選項即可。否否開始WSAStartup<>是否成功截取后三位字符調(diào)用ping<>釋放資源加載失敗結(jié)束為了實現(xiàn)-t圖1-8三.運行操作及結(jié)果在VC中運行程序后會出現(xiàn)如圖4.1所示,提示你輸入IP或網(wǎng)址;2、我們先輸入校園網(wǎng)機房主機命令,看能否ping通3.試著使用ping–t命令,如下:4、再輸入外部網(wǎng)主機命令,看能否ping通,上圖為網(wǎng)絡(luò)ping不通的情形。源代碼源代碼如下:#include<stdio.h>#include<stdlib.h>#include<winsock.h>#include<conio.h>#pragmacomment<lib,"ws2_32.lib">//導(dǎo)入庫文件#defineICMP_ECHOREPLY0//ICMP回應(yīng)答復(fù)#defineICMP_ECHOREQ8//ICMP回應(yīng)請求#defineREQ_DATASIZE32//請求數(shù)據(jù)報大小#include<iostream>/*******************/usingnamespacestd;//定義IP首部格式typedefstruct_IPHeader{ u_charVIHL;//版本和首部長度 u_charToS;//服務(wù)類型 u_shortTotalLen;//總長度 u_shortID;//標識號 u_shortFrag_Flags;//片偏移量 u_charTTL;//生存時間 u_charProtocol;//協(xié)議 u_shortChecksum;//首部校驗和 structin_addrSrcIP;//源IP地址 structin_addrDestIP;//目的地址}IPHDR,*PIPHDR;//定義ICMP首部格式typedefstruct_ICMPHeader{ u_charType;//類型 u_charCode;//代碼 u_shortChecksum;//首部校驗和 u_shortID;//標識 u_shortSeq;//序列號 charData;//數(shù)據(jù)}ICMPHDR,*PICMPHDR;//定義ICMP回應(yīng)請求typedefstruct_ECHOREQUEST{ ICMPHDRicmpHdr; DWORDdwTime; charcData[REQ_DATASIZE];}ECHOREQUEST,*PECHOREQUEST;//定義ICMP回應(yīng)答復(fù)typedefstruct_ECHOREPLY{ IPHDRipHdr; ECHOREQUESTechoRequest; charcFiller[256];}ECHOREPLY,*PECHOREPLY;/**********************************************************************************///計算校驗和u_shortchecksum<u_short*buffer,intlen>{ registerintnleft=len; registeru_short*w=buffer; registeru_shortanswer; registerintsum=0; //使用32位累加器,進行16位的反饋計算 while<nleft>1> { sum+=*w++; nleft-=2; } //補全奇數(shù)位 if<nleft==1> { u_shortu=0; *<u_char*><&u>=*<u_char*>w; sum+=u; } //將反饋的16位從高位移到低位 sum=<sum>>16>+<sum&0xffff>; sum+=<sum>>16>; answer=~sum; return<answer>;}/**********************************************************************************************///發(fā)送回應(yīng)請求函數(shù)intSendEchoRequest<SOCKETs,structsockaddr_in*lpstToAddr>{ staticECHOREQUESTechoReq; staticnId=1; staticnSeq=1; intnRet; //填充回應(yīng)請求消息 echoReq.icmpHdr.Type=ICMP_ECHOREQ; echoReq.icmpHdr.Code=0; echoReq.icmpHdr.Checksum=0; echoReq.icmpHdr.ID=nId++; echoReq.icmpHdr.Seq=nSeq++; //填充要發(fā)送的數(shù)據(jù) for<nRet=0;nRet<REQ_DATASIZE;nRet++> { echoReq.cData[nRet]='1'+nRet; } //存儲發(fā)送的時間 echoReq.dwTime=GetTickCount<>; //計算回應(yīng)請求的校驗和 echoReq.icmpHdr.Checksum=checksum<<u_short*>&echoReq,sizeof<ECHOREQUEST>>; //發(fā)送回應(yīng)請求 nRet=sendto<s,<LPSTR>&echoReq,sizeof<ECHOREQUEST>, 0,<structsockaddr*>lpstToAddr,sizeof<SOCKADDR_IN>>; if<nRet==SOCKET_ERROR> { printf<"sendto<>error:%d\n",WSAGetLastError<>>; }return<nRet>;}/*******************************************************************************///接收應(yīng)答回復(fù)并進行解析DWORDRecvEchoReply<SOCKETs,LPSOCKADDR_INlpsaFrom,u_char*pTTL>{ ECHOREPLYechoReply; intnRet; intnAddrLen=sizeof<structsockaddr_in>; //接收應(yīng)答回復(fù) nRet=recvfrom<s,<LPSTR>&echoReply,sizeof<ECHOREPLY>, 0,<LPSOCKADDR>lpsaFrom,&nAddrLen>; //檢驗接收結(jié)果 if<nRet==SOCKET_ERROR> { printf<"recvfrom<>error:%d\n",WSAGetLastError<>>; } //記錄返回的TTL *pTTL=echoReply.ipHdr.TTL; //返回應(yīng)答時間 return<echoReply.echoRequest.dwTime>;}/********************************************************************************///等待回應(yīng)答復(fù),使用select模型intWaitForEchoReply<SOCKETs>{ structtimevaltimeout; fd_setreadfds; readfds.fd_count=1; readfds.fd_array[0]=s; timeout.tv_sec=1; timeout.tv_usec=0; return<select<1,&readfds,NULL,NULL,&timeout>>;}/******************************************************************************///PING功能實現(xiàn)voidPing<char*pstrHost,boollogic>{ charc; SOCKETrawSocket; LPHOSTENTlpHost; structsockaddr_indestIP; structsockaddr_insrcIP; DWORDdwTimeSent; DWORDdwElapsed; u_charcTTL; intnLoop,k=4; intnRet,minimum=100000,maximum=0,average=0; intsent=4,reveived=0,lost=0; //創(chuàng)建原始套接字,ICMP類型 rawSocket=socket<AF_INET,SOCK_RAW,IPPROTO_ICMP>;//第二個注釋函數(shù)socket if<rawSocket==SOCKET_ERROR> { printf<"socket<>error:%d\n",WSAGetLastError<>>; return; } //檢測目標主機 lpHost=gethostbyname<pstrHost>; if<lpHost==NULL> { printf<"Hostnotfound:%s\n",pstrHost>; return; } //設(shè)置目標機地址 destIP.sin_addr.s_addr=*<<u_longFAR*><lpHost->h_addr>>;//設(shè)置目標IP destIP.sin_family=AF_INET;//地址規(guī)格 destIP.sin_port=0; //提示開始進行PING printf<"\nPinging%s[%s]with%dbytesofdata:\n",pstrHost,inet_ntoa<destIP.sin_addr>,REQ_DATASIZE>; //發(fā)起多次PING測試 for<nLoop=0;nLoop<k;nLoop++>{ if<logic>k=k+1; //發(fā)送ICMP回應(yīng)請求 SendEchoRequest<rawSocket,&destIP>; //等待回復(fù)的數(shù)據(jù) nRet=WaitForEchoReply<rawSocket>; if<nRet==SOCKET_ERROR> { printf<"select<>error:%d\n",WSAGetLastError<>>; break; } if<!nRet> { lost++; printf<"\nRequesttimeout.">; continue; } //接收回復(fù) dwTimeSent=RecvEchoReply<rawSocket,&srcIP,&cTTL>; reveived++; //計算花費的時間 dwElapsed=GetTickCount<>-dwTimeSent; if<dwElapsed>maximum>maximum=dwElapsed; if<dwElapsed<minimum>minimum=dwElapsed; average+=dwElapsed; printf<"\nReplyfrom%s:bytes=%dtime=%ldmsTTL=%d", inet_ntoa<srcIP.sin_addr>,REQ_DATASIZE,dwElapsed,cTTL>; if<_kbhit<>>/*Use_getchtothrowkeyaway.*/ {if<<c=_getch<>>==0x2>//crrl-bbreak; }else Sleep<1000>; } printf<"\n\n">; printf<"Pingstatisticsfor%s:\n",inet_ntoa<srcIP.sin_addr>>; printf<"Packets:Sent=%d,Received=%d,Lost=%d<%.f%%loss>,\n", sent,reveived,lost,<float><lost*1.0/sent>*100>; if<lost==0> { printf<"Approximateroundtriptimesinmilli-seconds:\n">; printf<"Minimum=%dms,Maximum=%dms,Average=%dms\n",minimum,maximum,average/sent>; } printf<"\n\n">; nRet=closesocket<rawSocket>; if<nRet==SOCKET_ERROR> { printf<"closesocket<>error:%d\n",WSAGetLastError<>>; }}//主程序voidmain<>{ printf<"WelcometothePingTest\n">; while<1> { WSADATAwsd;//檢測輸入的參數(shù) //初始化Winsock if<WSAStartup<MAKEWORD<1,1>,&wsd>!=0>{//第一個函數(shù)說明WSAStartup<> printf<"加載Winsock失敗!\n">; } charopt1[100]; char*ptr=opt1; boollog=false; printf<"Ping">; cin.getline<opt1,100,'\n'>;//ping的地址字符串 if<strstr<opt1,"-t">!=NULL> { log=true; strncpy<ptr,opt1+0,strlen<opt1>-3>;//把原字符串的最后三位截取 ptr[strlen<opt1>-2]=0;//printf<"%s",ptr>; } //開始PING Ping<ptr,log>; //程序釋放Winsock資源 WSACleanup<>; }}/*函數(shù)說明為了在應(yīng)用程序當中調(diào)用任何一個WinsockAPI函數(shù),首先第一件事情就是必須通過WSAStartup函數(shù)完成對Winsock服務(wù)的初始化,因此需要調(diào)用WSAStartup函數(shù)。使用Socket的程序在使用Socket之前必須調(diào)用WSAStartup函數(shù)。該函數(shù)的第一個參數(shù)指明程序請求使用的Socket版本,其中高位字節(jié)指明副版本、低位字節(jié)指明主版本;操作系統(tǒng)利用第二個參數(shù)返回請求的Socket的版本信息。當一個應(yīng)用程序調(diào)用WSAStartup函數(shù)時,操作系統(tǒng)根據(jù)請求的Socket版本來搜索相應(yīng)的Socket庫,然后綁定找到的Socket庫到該應(yīng)用程序中。以后應(yīng)用程序就可以調(diào)用所請求的Socket庫中的其它Socket函數(shù)了。*//*函數(shù)說明SOCKETsocket<intaf,inttype,intprotocol>;應(yīng)用程序調(diào)用socket函數(shù)來創(chuàng)建一個能夠進行網(wǎng)絡(luò)通信的套接字。第一個參數(shù)指定應(yīng)用程序使用的通信協(xié)議的協(xié)議族,對于TCP/IP協(xié)議族,該參數(shù)置AF_INET;第二個參數(shù)指定要創(chuàng)建的套接字

溫馨提示

  • 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

提交評論