Linux_Socket培訓(xùn)ppt課件_第1頁(yè)
Linux_Socket培訓(xùn)ppt課件_第2頁(yè)
Linux_Socket培訓(xùn)ppt課件_第3頁(yè)
Linux_Socket培訓(xùn)ppt課件_第4頁(yè)
Linux_Socket培訓(xùn)ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩78頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Linux TCP/IP編程基于BSD Socket 1.1四川大學(xué)軟件學(xué)院林鋒網(wǎng)絡(luò)編程簡(jiǎn)介互聯(lián)網(wǎng)的歷史和開展ISO/OSI七層協(xié)議TCP/IP協(xié)議Bekeley Socket庫(kù)互聯(lián)網(wǎng)的歷史和開展1971年,ARPANET,運(yùn)用NCP協(xié)議Network Control Program1973年,放棄NCP協(xié)議,研討新協(xié)議1974年,發(fā)布TCP/IP協(xié)議和網(wǎng)關(guān)構(gòu)造1981年,TCP/IP version 4規(guī)范確定ISO/OSI七層協(xié)議模型TCP/IP協(xié)議族TCPTransmission Control Protocol傳輸控制協(xié)議,基于銜接的效力UDPUser Datagram Protoco

2、l用戶數(shù)據(jù)報(bào)協(xié)議,無(wú)銜接的效力IPInternet ProtocolInternet協(xié)議,信息傳送機(jī)制OSI模型與TCP/IP協(xié)議的對(duì)比TCP或UDPIP和路由網(wǎng)卡驅(qū)動(dòng)TelnetFTPWWW等音訊傳送流音訊包的逐層遞增TCP/IP編程運(yùn)用Socket函數(shù)實(shí)現(xiàn)網(wǎng)絡(luò)功能一些Socket編程的概念流Stream銜接Connection阻塞(Block)、非阻塞(Non-block)同步(Synchronous)、異步(asynchronous)IP地址字節(jié)順序IP地址IP地址是Internet中獨(dú)一的地址標(biāo)識(shí),IP地址是一個(gè)32位長(zhǎng)正在擴(kuò)展到128位每個(gè)Internet包必需帶有IP地址點(diǎn)分十進(jìn)制

3、表示法將IP地址的4個(gè)字節(jié)的數(shù)字用十進(jìn)制表示并用點(diǎn)隔開,如:48(0 xCA733094)IP地址的分級(jí)子網(wǎng)掩碼Subnet Mask四級(jí)IP地址子網(wǎng)掩碼也用點(diǎn)分十進(jìn)制表示例如:指明子網(wǎng)局域網(wǎng)的范圍Mask與IP地址進(jìn)展與操作即可得出子網(wǎng)范圍例如 IP地址:與5子網(wǎng)掩碼:即可得出這兩個(gè)IP地址處于同一個(gè)子網(wǎng)內(nèi)MAC地址MAC地址是Ethernet協(xié)議運(yùn)用的獨(dú)一地址MAC地址是Ethernet NIC上自帶的,48位長(zhǎng)。如:00-88-D5-03-E7-A8MAC地址作用范圍是Ethernet局域網(wǎng)內(nèi)MAC地址存在于每一個(gè)Ethernet包中,是Ethernet包頭的組成部分,Ethernet交

4、換機(jī)根據(jù)Ethernet包頭中的MAC源地址和MAC目的地址實(shí)現(xiàn)包的交換和傳送MAC地址與IP地址無(wú)關(guān)字節(jié)順序網(wǎng)絡(luò)字節(jié)順序NBO,Network Byte Order運(yùn)用一致的字節(jié)順序,防止兼容性問(wèn)題主機(jī)字節(jié)順序HBO,Host Byte Order不同的機(jī)器HBO不一樣,與CPU設(shè)計(jì)有關(guān)Motorola 68k系列,HBO與NBO一樣Intel x86系列,HBO與NBO相反Socket函數(shù)引見需求用到的頭文件數(shù)據(jù)類型:#include 函數(shù)定義:#include Berkeley Socket 常用函數(shù)列表網(wǎng)絡(luò)銜接函數(shù)獲取/設(shè)置socket的參數(shù)或信息轉(zhuǎn)換函數(shù)網(wǎng)絡(luò)銜接函數(shù)socketbin

5、dconnectlistenacceptselectrecv, recvfromsend, sendtoclose, shutdown獲取/設(shè)置socket的參數(shù)或信息gethostbyaddr, gethostbynamegethostnamegetpeernamegetprotobyname, getprotobynumbergetservbyname, getservbyportgetsocknamegetsockopt, setsockoptioctl轉(zhuǎn)換函數(shù)IP地址轉(zhuǎn)換inet_addr()inet_ntoa()字節(jié)順序轉(zhuǎn)換htons()-Host to Network Shorth

6、tonl()-Host to Network Longntohs()-Network to Host Shortntohl()-Network to Host Long數(shù)據(jù)構(gòu)造:sockaddrstruct sockaddr unsigned short sa_family; /* address family, AF_xxx */char sa_data 14; /* 14 bytes of protocol address */;此數(shù)據(jù)構(gòu)造用做bind、connect、recvfrom、sendto等函數(shù)的參數(shù),指明地址信息數(shù)據(jù)構(gòu)造:sockaddr_instruct sockaddr_i

7、n short int sin_family; /* Address family */unsigned short int sin_port; /* Port number */struct in_addr sin_addr; /* Internet address */unsigned char sin_zero 8; /* Same size as structsockaddr */;該構(gòu)造與sockaddr兼容,供用戶填入?yún)?shù)數(shù)據(jù)構(gòu)造:in_addrstruct in_addr unsigned long s_addr;這個(gè)數(shù)據(jù)構(gòu)造是由于歷史緣由保管下來(lái)的,主要用作與以前的格式兼容。程

8、序中實(shí)踐只填寫sockaddr_in構(gòu)造struct sockaddr_in my_addr;my_addr.sin_family = AF_INET; my_addr.sin_port = htons(3490); /* short, NBO*/my_addr.sin_addr.s_addr = inet_addr(0);bzero(&(my_addr.sin_zero), 8); 留意:sin_addr.s_addr填本機(jī)IP,假設(shè)此項(xiàng)填I(lǐng)NADDR_ANY時(shí),表示自動(dòng)取本機(jī)IP填入該項(xiàng)(僅用于Server)函數(shù)簡(jiǎn)介:socketSocket描畫符與Linux中的文件描畫符類似,也是一個(gè)i

9、nt型的變量函數(shù)調(diào)用:int socket(int domain, int type, int protocol);函數(shù)前往Socket描畫符,前往-1表示出錯(cuò)domain參數(shù)只能取AF_INET, protocol參數(shù)普通取0運(yùn)用例如:TCP:sockfd = socket(AF_INET,SOCK_STREAM,0);UDP:sockfd =socket(AF_INET, SOCK_DGRAM,0);函數(shù)簡(jiǎn)介:bind作為Server程序,需求與一個(gè)端口綁定int bind(int sockfd, struct sockaddr *my_addr, int addrlen);bind函數(shù)前

10、往-1表示出錯(cuò),最常見的錯(cuò)誤是該端口曾經(jīng)被其他程序綁定。需求留意的一點(diǎn):在Linux系統(tǒng)中,1024以下的端口只需擁有root權(quán)限的程序才干綁定函數(shù)簡(jiǎn)介:connect銜接某個(gè)Serverint connect(int sockfd, struct sockaddr *servaddr, int addrlen);servaddr是事先填寫好的構(gòu)造,Server的IP和端口都在該數(shù)據(jù)構(gòu)造中指定。函數(shù)簡(jiǎn)介:listen開場(chǎng)監(jiān)聽曾經(jīng)綁定的端口需求在此前調(diào)用bind()函數(shù),否那么由系統(tǒng)指定一個(gè)隨機(jī)的端口int listen(int sockfd, int queue_length);接納隊(duì)列一個(gè)新

11、的Client的銜接懇求先被放在接納隊(duì)列中,等待Server程序調(diào)用accept函數(shù)接受銜接懇求queue_length指的就是接納隊(duì)列的長(zhǎng)度也就是在Server程序調(diào)用accept函數(shù)之前最大允許的銜接懇求數(shù),多余的銜接懇求將被回絕函數(shù)簡(jiǎn)介:acceptaccept()函數(shù)將呼應(yīng)銜接懇求,建立銜接產(chǎn)生一個(gè)新的socket描畫符來(lái)描畫該銜接這個(gè)銜接用來(lái)與特定的Client交換信息int accept(int sockfd,struct sockaddr *addr,int *addrlen);addr將在函數(shù)調(diào)用后被填入銜接對(duì)方的地址信息,如對(duì)方的IP、端口等。accept缺省是阻塞函數(shù),阻塞

12、直到有銜接懇求accept()函數(shù)運(yùn)用例如struct sockaddr_in their_addr; /* 用于存儲(chǔ)銜接對(duì)方的地址信息*/int sin_size = sizeof(struct sockaddr_in); 依次調(diào)用socket(), bind(), listen()等函數(shù)new_fd = accept(sockfd, &their_addr, &sin_size);printf(對(duì)方地址: %sn, inet_ntoa(their_addr.sin_addr); 函數(shù)簡(jiǎn)介:select運(yùn)用于多路同步I/O方式int select(int numfds, fd_set *re

13、adfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);numfds是要多路選擇的socket的最大值其中readfds, writefds, exceptfds都是socket集合,分別代表有數(shù)據(jù)可讀、有數(shù)據(jù)要寫、發(fā)生異常的socket集合。timeout是select的時(shí)間限制前往值:在socket集合中預(yù)備好的socket個(gè)數(shù)socket集合集合變量類型:fd_set 集合變量運(yùn)算宏:FD_ZERO(*set)清空socket集合FD_SET(s, *set)將s參與socket集合FD_CLR(s, *s

14、et)從socket集合去掉sFD_ISSET(s, *set)判別s能否在socket集合中常數(shù)FD_SETSIZE:集合元素的最多個(gè)數(shù)Select運(yùn)用舉例fd_set rset;/* 可讀的socket集合 */FD_ZERO(& rset);/* 清空rset集合 */FD_SET(sockfd, rset);/* 將sockfd 參與rset集合 */nready = select(maxfd+1, &rset, null, null, null);/* maxfd是知的最大的socket */if (FD_ISSET(sockfd, &rset) 函數(shù)簡(jiǎn)介:recv用于TCP協(xié)議中接

15、納信息int recv(int sockfd, void *buf, int len, int flags);buf,指向包容接納信息的緩沖區(qū)的指針len,緩沖區(qū)的大小flags,接納標(biāo)志函數(shù)前往實(shí)踐接納的字節(jié)數(shù),前往-1表示出錯(cuò)recv缺省是阻塞函數(shù),直到接納到信息或出錯(cuò)函數(shù)簡(jiǎn)介:recvfrom用于UDP協(xié)議中接納信息int recvfrom(int sockfd,void *buf,int len,unsigned int flagsstruct sockaddr *from, int *fromlen); buf,指向包容接納信息的緩沖區(qū)的指針len,緩沖區(qū)的大小flags,接納標(biāo)志f

16、rom,指明接納數(shù)據(jù)的來(lái)源函數(shù)前往實(shí)踐接納的字節(jié)數(shù),前往-1表示出錯(cuò)recvfrom是阻塞函數(shù),直到接納到信息或出錯(cuò)函數(shù)簡(jiǎn)介:send用于TCP協(xié)議中發(fā)送信息int send(int sockfd, const void *msg, int len, int flags);msg,指向待發(fā)送信息的指針len,待發(fā)送的字節(jié)數(shù)flags,發(fā)送標(biāo)志函數(shù)前往已發(fā)送的字節(jié)數(shù),前往-1表示出錯(cuò)send缺省是阻塞函數(shù),直到發(fā)送終了或出錯(cuò)留意:假設(shè)函數(shù)前往值與參數(shù)len不相等,那么剩余的未發(fā)送信息需求再次發(fā)送函數(shù)簡(jiǎn)介:sendto用于UDP協(xié)議中發(fā)送信息int sendto(int sockfd, const

17、 void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); buf,指向包容接納信息的緩沖區(qū)的指針len,緩沖區(qū)的大小flags,接納標(biāo)志to,指明發(fā)送數(shù)據(jù)的目的地函數(shù)前往已發(fā)送的字節(jié)數(shù),前往-1表示出錯(cuò)sendto缺省是阻塞函數(shù),直到發(fā)送終了或出錯(cuò)留意:假設(shè)函數(shù)前往值與參數(shù)len不相等,那么剩余的未發(fā)送信息需求再次發(fā)送send, sendto, recv, recvfrom函數(shù)調(diào)用的參數(shù):flagsMSG_DONTROUTE對(duì)send, sendto有效表示不運(yùn)用路由普通不運(yùn)用MSG_PEEK

18、對(duì)recv, recvfrom有效表示讀出網(wǎng)絡(luò)數(shù)據(jù)后不去除已讀的數(shù)據(jù)MSG_OOB對(duì)發(fā)送接納都有效表示讀/寫帶外數(shù)據(jù)(out-of-band data)函數(shù)簡(jiǎn)介:close封鎖特定的socket銜接調(diào)用函數(shù):int close(int sockfd);封鎖銜接將中斷對(duì)該socket的讀寫操作。封鎖用于listen()函數(shù)的socket將制止其他Client的銜接懇求函數(shù)簡(jiǎn)介:shutdownShutdown()函數(shù)可以一方面的中斷銜接,即制止某個(gè)方向的信息傳送。函數(shù)調(diào)用int shutdown(int sockfd, int how);參數(shù)how:0 - 制止接納信息1 - 制止發(fā)送信息2 -

19、 接納和發(fā)送都被制止,與close()函數(shù)效果一樣前往0表示調(diào)用勝利,前往-1表示出錯(cuò)函數(shù)簡(jiǎn)介:ioctl獲得或改動(dòng)socket的I/O屬性int ioctl(int sockfd,long cmd,unsigned long* argp)cmd:屬性,argp:屬性的參數(shù)緩存區(qū)指針常用的屬性:FIONREAD,前往socket緩沖區(qū)中未讀數(shù)據(jù)的字節(jié)數(shù)FIONBIO,argp為零時(shí)為阻塞方式,非零時(shí)為非阻塞方式SIOCATMARK ,判別能否有未讀的帶外數(shù)據(jù)僅用 于TCP協(xié)議,前往true或false函數(shù)簡(jiǎn)介:inet_addr, inet_ntoaunsigned long inet_add

20、r (const char *cp);inet_addr將一個(gè)點(diǎn)分十進(jìn)制IP地址字符串轉(zhuǎn)換成32位數(shù)字表示的IP地址char* inet_ntoa (struct in_addr in); inet_ntoa將一個(gè)32位數(shù)字表示的IP地址轉(zhuǎn)換成點(diǎn)分十進(jìn)制IP地址字符串這兩個(gè)函數(shù)互為反函數(shù)TCP:基于銜接流的網(wǎng)絡(luò)協(xié)議TCP相關(guān)的函數(shù)Server的例子Client的例子Server-Client構(gòu)造圖TCP編程的適用范圍TCP運(yùn)用舉例Server部分Server程序的作用程序初始化繼續(xù)監(jiān)聽一個(gè)固定的端口收到Client的銜接后建立一個(gè)socket銜接與Client進(jìn)展通訊和信息處置接納Client

21、經(jīng)過(guò)socket銜接發(fā)送來(lái)的數(shù)據(jù),進(jìn)展相應(yīng)處置并前往處置結(jié)果,如BBS Server經(jīng)過(guò)socket銜接向Client發(fā)送信息,如Time Server通訊終了后中斷與Client的銜接一個(gè)簡(jiǎn)單的TCP Server完好的Server程序例如程序流程一獲得socket描畫符:int sockfd;sockfd = socket(AF_INET, SOCK_STREAM, 0) ;程序流程二填寫本身地址信息的sockaddr_in構(gòu)造struct sockaddr_in my_addr; /* 本身的地址信息 */my_addr.sin_family = AF_INET; /* 網(wǎng)絡(luò)字節(jié)順序 *

22、/my_addr.sin_port = htons(MYPORT);/* 自動(dòng)填本機(jī)IP */my_addr.sin_addr.s_addr = INADDR_ANY;/* 其他部分置0 */bzero(&(my_addr.sin_zero), 8); 程序流程三綁定端口bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr);程序流程四監(jiān)聽端口#define BACKLOG 10listen(sockfd, BACKLOG);程序流程五接受銜接懇求int new_fd; /* 數(shù)據(jù)端口 */struct sockadd

23、r_in their_addr; /* 銜接對(duì)方的地址信息 */int sin_size;sin_size = sizeof(struct sockaddr_in);new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)程序流程六產(chǎn)生新進(jìn)程線程處置讀寫socketif (!fork() /* 子進(jìn)程 */if (send(new_fd, Hello, world! n, 14, 0) = -1) perror(send);close(new_fd);exit(0);close(new_fd);程序流程七轉(zhuǎn)程序流程五,

24、繼續(xù)等待其他Client的銜接并處置#include #include #include #include #include #include #include #include #define MYPORT 3490 /* 監(jiān)聽端口 */#define BACKLOG 10 /* listen的懇求接納隊(duì)列長(zhǎng)度 */void main()int sockfd, new_fd; /* 監(jiān)聽端口,數(shù)據(jù)端口 */struct sockaddr_in my_addr; /* 本身的地址信息 */struct sockaddr_in their_addr; /* 銜接對(duì)方的地址信息 */int sin

25、_size;if (sockfd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(socket);exit(1);my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); /* 網(wǎng)絡(luò)字節(jié)順序 */my_addr.sin_addr.s_addr = INADDR_ANY; /* 自動(dòng)填本機(jī)IP */bzero(&(my_addr.sin_zero), 8); /* 其他部分置0 */if (bind(sockfd, (struct sockaddr *)&my_addr, size

26、of(struct sockaddr) = -1) perror(bind);exit(1);if (listen(sockfd, BACKLOG) = -1) perror(listen);exit(1);while(1) /* 主循環(huán) */sin_size = sizeof(struct sockaddr_in);new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)if (new_fd = -1) perror(accept);continue;printf(Got connection from %s n,

27、inet_ntoa(their_addr.sin_addr);if (!fork() /* 子進(jìn)程 */if (send(new_fd, Hello, world! n, 14, 0) = -1) perror(send);close(new_fd);exit(0);close(new_fd); /* 無(wú)法生成子進(jìn)程時(shí)有用 */while(waitpid(-1,NULL,WNOHANG) 0); /*去除一切子進(jìn)程 */TCP運(yùn)用舉例Client部分Client程序的作用程序初始化銜接到某個(gè)Server上,建立socket銜接與Server進(jìn)展通訊和信息處置接納Server經(jīng)過(guò)socket銜接

28、發(fā)送來(lái)的數(shù)據(jù),進(jìn)展相應(yīng)處置經(jīng)過(guò)socket銜接向Server發(fā)送懇求信息通訊終了后中斷與Client的銜接一個(gè)簡(jiǎn)單的TCP Client完好的Client程序例如程序流程一獲得socket描畫符:int sockfd;sockfd = socket(AF_INET, SOCK_STREAM, 0);程序流程二填寫銜接對(duì)方的地址信息的sockaddr_in構(gòu)造struct hostent *he;struct sockaddr_in their_addr; /* 對(duì)方的地址信息 */he=gethostbyname(“);their_addr.sin_family = AF_INET; thei

29、r_addr.sin_port = htons(4000); /* short, NBO */their_addr.sin_addr = *(struct in_addr *)he-h_addr);bzero(&(their_addr.sin_zero), 8); /* 其他部分設(shè)置成0 */程序流程三銜接端口connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr);程序流程四讀寫socket程序流程五封鎖socketclose(sockfd);#include #include #include #incl

30、ude #include #include #include #include #define PORT 3490 /* Server的端口 */#define MAXDATASIZE 100/*一次可以讀的最大字節(jié)數(shù) */int main(int argc, char *argv)int sockfd, numbytes;char bufMAXDATASIZE;struct hostent *he;/* 主機(jī)信息 */struct sockaddr_in their_addr; /* 對(duì)方地址信息 */if (argc != 2) fprintf(stderr,usage: client h

31、ostnamen);exit(1);if (he=gethostbyname(argv1) = NULL) /* get the host info */herror(gethostbyname);exit(1);if (sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) perror(socket);exit(1);their_addr.sin_family = AF_INET; their_addr.sin_port = htons(PORT); /* short, NBO */their_addr.sin_addr = *(struct in_addr *)

32、he-h_addr);bzero(&(their_addr.sin_zero), 8); /* 其他部分設(shè)成0 */if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr) = -1) perror(connect);exit(1);if (numbytes=recv(sockfd,buf,MAXDATASIZE,0)=-1) perror(recv);exit(1);bufnumbytes = 0;printf(Received: %s,buf);close(sockfd);return 0;TCP

33、, C/S構(gòu)造圖:UDP:基于數(shù)據(jù)包的無(wú)銜接協(xié)議UDP與TCP的區(qū)別Server的例子Client的例子Server-Client關(guān)系圖UDP編程的適用范圍UDP與TCP的區(qū)別基于銜接與無(wú)銜接流方式與數(shù)據(jù)報(bào)方式TCP保證數(shù)據(jù)正確性,UDP能夠丟包TCP保證數(shù)據(jù)順序,UDP不保證對(duì)系統(tǒng)資源的要求TCP較多,UDP少詳細(xì)編程時(shí)的區(qū)別socket()的參數(shù)不同UDP Server不需求調(diào)用listen和acceptUDP收發(fā)數(shù)據(jù)用sendto/recvfrom函數(shù)TCP:地址信息在connect/accept時(shí)確定UDP:在sendto/recvfrom函數(shù)中每次均需指定地址信息UDP:shutdo

34、wn函數(shù)無(wú)效UDP Server-Client關(guān)系圖UDP運(yùn)用舉例Server部分#include #include #include #include #include #include #include #include #define MYPORT 3490 /* 監(jiān)聽端口 */void main()int sockfd; /* 數(shù)據(jù)端口 */struct sockaddr_in my_addr; /* 本身的地址信息 */struct sockaddr_in their_addr; /* 銜接對(duì)方的地址信息 */int sin_size, retval;char buf128;if (

35、sockfd = socket(AF_INET, SOCK_DGRAM, 0) = -1) perror(socket);exit(1);my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); /* 網(wǎng)絡(luò)字節(jié)順序 */my_addr.sin_addr.s_addr = INADDR_ANY; /* 自動(dòng)填本機(jī)IP */bzero(&(my_addr.sin_zero), 8); /* 其他部分置0 */if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)

36、 = -1) perror(bind);exit(1);while(1) /* 主循環(huán) */retval = recvfrom(sockfd, buf, 128, 0, (struct sockaddr *)&their_addr,&sin_size);printf(Received datagram from %sn,inet_ntoa(their_addr.sin_addr);if (retval = 0) perror (“recvfrom);close(sockfd);break;retval = sendto(sockfd, buf, 128, 0, (struct sockaddr *)&their_addr,sin_size);UDP運(yùn)用舉例Client部分#include #include #include #incl

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論