linux操作系統及程序設計5_第1頁
linux操作系統及程序設計5_第2頁
linux操作系統及程序設計5_第3頁
linux操作系統及程序設計5_第4頁
linux操作系統及程序設計5_第5頁
已閱讀5頁,還剩93頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5講Socket網絡編程12目錄網絡編程協議基礎Socket基本編程技術Socket高級編程技術OSI模型與TCP/IP協議棧網絡編程協議基礎3OSI七層協議功能物理層面向物理傳輸媒體,屏蔽媒體的不同鏈路層面向一條鏈路,成幀和無差錯傳輸網絡層分配地址、面向多條鏈路、路由和流量控制傳輸層面向兩臺主機通信,處理可靠傳輸細節,無差錯、無失序傳輸會話層面向一次會話,協調雙方的交互、同步表示層面向通信內容的表示,大家認同的描述方式應用層面向建立在通信基礎上的應用,為應用提供通信服務網絡編程協議基礎4TCP協議特點面向連接的可靠傳輸端到端、建立/斷開連接正確、順序傳送數據協議關注問題IP數據報的丟失、重復、失序、延遲發送和接收速度的匹配系統重啟動,一方連接信息丟失網絡擁塞網絡編程協議基礎5UDP協議特點無連接不需要在通信前建立連接不使用控制報文傳輸開銷低面向報文不將報文分割,也不合并UDP報文大小直接影響網絡利用率過小造成報頭比率過大過大造成MTU分片盡力而為、任意交互一對一、一對多、多對一和多對多網絡編程協議基礎6網絡服務的標識TCP/UDP端口號作為服務器程序標識服務器啟動時,首先在本地主機注冊所使用的TCP/UDP端口號客戶通過與服務器指定的TCP端口建立連接(或直接向服務器指定的UDP端口發送信息)來訪問特定服務運行服務器程序的主機收到信息后,將其轉交給注冊該端口的服務器程序處理網絡編程協議基礎7客戶/服務器交互模型服務器程序被動等待請求并做出響應客戶程序主動向服務器發出服務請求網絡編程協議基礎8客戶/服務器程序特性對比網絡編程協議基礎9服務器請求處理流程—循環服務器方案系統資源要求不高在處理一個請求時其他請求必須等待主要針對于面向無連接的客戶/服務器模型網絡編程協議基礎10服務器請求處理流程—并發服務器方案系統資源要求較高實時性和靈活性是該方案的最大特點主要針對于面向連接的客戶/服務器模型網絡編程協議基礎11Linux的網絡分層結構BSDSocket是通用接口,支持各種網絡工作形式INETSocket支持包括TCP/IP協議在內的Internet地址族網絡應用BSDSocket層INETSocket層TCPUDPIPPPPSLIPSocketARP用戶數據界面接口界面協議分層網絡驅動網絡編程協議基礎12目錄網絡通信協議基礎Socket基本編程技術Socket高級編程技術13socket基本概念Socket接口是應用程序與TCP/IP協議棧的接口定義一組函數/例程,支持TCP/IP網絡應用程序開發與數據通信相關的系統調用是read()/write()是一種文件描述符一個套接字描述一個通信連接的一端兩個通信程序中各自有一個套接字來描述自己的Socket不是TCP/IP標準的組成部分,但已成為事實上的工業標準UNIX系列系統提供SocketWindows系列、Macintosh系列、Solaris等亦提供網絡編程協議基礎14Socket端到端通信的形式形式(IP,PORT)網絡進程標識<協議,本地地址,本地端口>網間通信標識<協議,本地地址,本地端口,遠程地址,遠程端口>端口分類公認端口小于256的端口作為保留端口注冊端口動態和/或私有端口Socket基本編程技術15基本socketAPIsocket()創建一個新的Socketclose()關閉一個Socketbind()將服務器(IP,Port)賦予Socketlisten()等待到來的客戶連接請求(TCP)accept()接受客戶連接請求并建立連接(TCP)connect()向服務器發出連接請求send()/recv()發送/接收數據Socket基本編程技術16字節順序字節順序大端模式(big

endian):高字節放到高地址上小端模式(little

endian):高字節放到低地址上主機字節順序(HBO,HostByteOrder)不同的機器HBO不相同,與CPU設計有關Motorola68k系列,HBO與NBO相同Intelx86系列,HBO與NBO相反網絡字節順序(NBO,NetworkByteOrder)使用統一的字節順序,避免兼容性問題解決兼容性問題途徑往網絡上發送前:轉換成網絡字節序從網絡接收數據:轉換成主機字節序

Socket基本編程技術17字節順序轉換函數頭文件#include<netinet/in.h>函數原型uint32_thtonl(uint32_thostlong);把32位值從主機字節序轉換成網絡字節序uint16_thtons(uint16_thostshort);把16位值從主機字節序轉換成網絡字節序uint32_tntohl(uint32_thostlong);把32位值從網絡字節序轉換成主機字節序uint16_tntohs(uint16_thostshort);把16位值從網絡字節序轉換成主機字節序說明h代表host,n代表networks代表short,l代表longSocket基本編程技術18socket()函數功能創建一個套接字#include<sys/socket.h>函數原型intsocket(intdomain,inttype,intprotocol);參數說明domain:通信協議族,即地址族type:套接字類型protocol:通信協議常設置為0,由內核根據指定的類型和協議族使用默認的協議返回值成功時,返回一個大于等于0的文件描述符失敗時,返回一個小于0的值Socket基本編程技術19Linux支持的協議和地址族Socket基本編程技術20套接字類型流套接字(SOCK_STREAM)可靠的、面向連接的通信使用TCP協議數據報套接字(SOCK_DGRAM)無連接服務使用UDP協議原始套接字(SOCK_RAW)允許對底層協議(如IP、ICMP)直接訪問Socket基本編程技術21socket()函數代碼框架intmain(){

……

intsockfd;

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){

perror(“socket”);

exit(1);

}

……}Socket基本編程技術22套接字選項函數原型int

getsockopt(int

sockfd,int

level,int

optname,void

*optval,socklen_t

*optlen)int

setsockopt(int

sockfd,int

level,int

optname,const

void

*optval,socklen_t

*optlen)功能控制套接字行為,如修改緩沖區大小、傳輸方式等參數說明level:指定控制套接字的層次SOL_SOCKET:通用套接字選項IPPROTO_IP:IP選項IPPROTO_TCP:TCP選項

optname:指定控制方式(選項名稱)optval:獲得/設置套接字選項值Socket基本編程技術23

SOL_SOCKET參數選項 SO_BROADCAST 允許發送廣播數據

int

SO_DEBUG

允許調試

int

SO_DONTROUTE

不查找路由

int

SO_ERROR

獲得套接字錯誤

int

SO_KEEPALIVE

保持連接

int

SO_LINGER

延遲關閉連接

struct

linger

SO_OOBINLINE

帶外數據放入正常數據流

int

SO_RCVBUF

接收緩沖區大小

int

SO_SNDBUF

發送緩沖區大小

int

SO_RCVLOWAT

接收緩沖區下限

int

SO_SNDLOWAT

發送緩沖區下限

int

SO_RCVTIMEO

接收超時

struct

timeval

SO_SNDTIMEO

發送超時

struct

timeval

SO_REUSERADDR

允許重用本地地址和端口

int

SO_TYPE

獲得套接字類型

int

SO_BSDCOMPAT

與BSD系統兼容

int

Socket基本編程技術24IPPROTO_IP與IPPRO_TCP參數選項IPPROTO_IPIP_HDRINCL在數據包中包含IP首部IP_OPTINOSIP首部選項IP_TOS服務類型IP_TTL生存時間IPPRO_TCPTCP_MAXSEGTCP最大數據段的大小TCP_NODELAY不使用Nagle算法

Socket基本編程技術25套接字選項示例更改發送/接收緩沖區大小接收緩沖區

intnRecvBuf=32*1024;

//設置為32K

setsockopt(s,SOL_SOCKET,SO_RCVBUF,(constchar*)&nRecvBuf,sizeof(int));發送緩沖區

intnSendBuf=32*1024;//設置為32K

setsockopt(s,SOL_SOCKET,SO_SNDBUF,(constchar*)&nSendBuf,sizeof(int));說明對于客戶,SO_RCVBUF選項必須在connect之前設置對于服務器,SO_RCVBUF選項必須在listen前設置Socket基本編程技術26bind()函數功能將套接字地址與所創建的套接字號聯系起來客戶端如果只想使用connect(),則無須使用該函數#include<sys/socket.h>函數原型intbind(intsockfd,structsockaddr*my_addr,socklen_taddrlen);參數說明sockfd:調用socket返回的文件描述符my_addr:保存地址信息(IP地址和端口)addrlen:設置為sizeof(structsockaddr)返回值成功時,返回0失敗時,返回-1Socket基本編程技術27sockaddr結構定義功能保存socket信息結構structsockaddr{unsignedshortsa_family;/*地址族,AF_xxx*/

charsa_data[14];/*協議地址*/};說明sa_family一般為AF_INET(表示TCP/IP)sa_data包含socket的IP地址和端口號/include/linux/socket.hSocket基本編程技術28sockaddr_in結構定義功能sockaddr的另一種表示形式結構structsockaddr_in{

shortintsin_family;/*地址族*/

unsignedshortintsin_port;/*端口號*/

structin_addrsin_addr;/*IP地址*/

unsignedcharsin_zero[8];/*填充0,保持與structsockaddr等長*/};說明sin_zero用于將sockaddr_in結構填充到與structsockaddr等長,可用bzero()或memset()函數將其置為0當sin_port=0時,系統隨機選擇一個未被使用的端口號當sin_addr=INADDR_ANY時,表示填入本機IP地址指向sockaddr_in的指針和指向sockaddr的指針可相互轉換structin_addr{__u32s_addr;};Socket基本編程技術29bind()函數示例 #include<string.h>

#include<sys/types.h>

#include<sys/socket.h>

#defineMYPORT3490

intmain(){

intsockfd;

structsockaddr_inmy_addr;

sockfd=socket(AF_INET,SOCK_STREAM,0);

my_addr.sin_family

=AF_INET;

my_addr.sin_port=htons(MYPORT);

my_addr.sin_addr.s_addr=inet_addr("132.241.5.10");

bind(sockfd,(structsockaddr*)&my_addr,sizeof(struct

sockaddr));…….}

Socket基本編程技術30connect()函數功能建立套接字連接#include<sys/socket.h>函數原型intconnect(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen);參數說明sockfd:調用socket返回的文件描述符serv_addr:遠程主機IP地址和端口addrlen:設置為sizeof(structsockaddr)返回值成功時,返回0失敗時,返回-1Socket基本編程技術31connect()函數示例 #include<string.h>

#include<sys/types.h>

#include<sys/socket.h>

#defineDEST_IP"132.241.5.10"

#defineDEST_PORT23

intmain(){

intsockfd;

structsockaddr_indest_addr;

sockfd=socket(AF_INET,SOCK_STREAM,0);

dest_addr.sin_family=AF_INET;

dest_addr.sin_port=htons(DEST_PORT);

dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);

connect(sockfd,(structsockaddr*)&dest_addr,

sizeof(structsockaddr));

Socket基本編程技術32listen()函數功能用于面向連接服務器,表明愿意接收連接#include<sys/socket.h>函數原型intlisten(intsockfd,intbacklog);參數說明sockfd:調用socket返回的文件描述符backlog:accept()應答之前,允許在進入隊列中等待的連接數目,出錯時返回-1返回值成功時,返回0失敗時,返回-1說明在使用listen()之前,需要調用bind()綁定到需要的端口,否則系統內核將會監聽一個隨機端口socket();

bind();

listen();Socket基本編程技術33accept()函數功能建立套接字連接,處理單個連接請求(如發送/接收數據)#include<sys/socket.h>函數原型intaccept(intsockfd,structvoid*addr,socklen_t*addrlen);參數說明sockfd:正在監聽端口的套接字文件描述符addr:指向本地數據結構sockaddr_in的指針調用connect()的信息將存儲在該結構中addrlen:設置為sizeof(structsockaddr_in)返回值成功時,返回一個socket端口失敗時,返回-1Socket基本編程技術34accept()函數intmain(){ intsockfd,client_fd; structsockaddr_in

remote_addr;

/*客戶端地址信息*/ …… while(1){ sin_size=sizeof(structsockaddr_in); if((client_fd=accept(sockfd,(structsockaddr*)

&remote_addr,&sin_size))==-1){ perror("accept");continue; } printf("from%s\n",inet_ntoa(remote_addr.sin_addr)); …… } ……}

Socket基本編程技術35send()函數功能通過socket發送數據#include<sys/types.h>#include<sys/socket.h>函數原型ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);參數說明sockfd:發送數據的套接字描述符msg:指向發送數據的指針len:數據長度flags:一般設置為0返回值成功時,返回實際發送的數據的字節數失敗時,返回-1Socket基本編程技術36recv()函數功能通過socket接收數據#include<sys/types.h>#include<sys/socket.h>函數原型ssize_trecv(intsockfd,void*buf,size_tlen,intflags);參數說明sockfd:要讀的SOCKET描述符buf:要讀的信息的緩沖區len:緩沖的最大長度flags:一般設置為0返回值成功時,返回實際接收到的數據的字節數失敗時,返回-1Socket基本編程技術37send()/recv()中的flags說明MSG_DONTROUTEsend()的使用標志,不查找路由表,表示目的主機在本地網絡MSG_OOB接收或者發送帶外數據MSG_PEEKrecv()的使用標志,查看數據但不從系統緩沖區移走數據MSG_WAITALLrecv()的使用標志,等待所有數據,阻塞式接收,直到滿足條件或發生錯誤讀到指定字節時,正常返回,返回值等于len讀到文件尾,正常返回,返回值小于len操作錯誤時,返回-1Socket基本編程技術38帶外數據傳輸層協議使用帶外數據(out-of-band,OOB)來發送一些重要數據若通信一方有重要數據需要通知對方時,協議能將這些數據快速地發送到對方為發送這些數據,協議一般不使用與普通數據相同的通道,而是使用另外的通道Linux套接字機制支持低層協議發送/接收帶外數據,但TCP協議沒有真正意義上的帶外數據為發送重要協議,TCP提供緊急模式機制TCP協議在數據段中設置URG位,表示進入緊急模式接收方可以對緊急模式采取特殊的處理這種方式數據不容易被阻塞,且可通過在服務器端程序里捕捉SIGURG信號來及時接收數據TCP協議每次只能發送和接收一個字節帶外數據Socket基本編程技術39TCP發送帶外數據的處理機制TCP總將最后一個字節當作OOB數據,其余當作普通字節不管通過帶MSG_OOB標志的sendXXXX()函數發送多少字節OOB數據,發送端只將最后一個字節當作OOB數據接收端也只能收到一個字節的OOB數據舉例:send(sendfd,"ABC",3,MSG_OOB)TCP將緊急模式URG置位緊急指針定位第三個字節(“C”)前兩個字節("AB")當作普通字節發送

Socket基本編程技術40TCP接收帶外數據的處理機制TCP提供兩種處理模式非OOBINLINE模式:套接字的默認模式將OOB字節與普通字節分開存放,OOB字節存放在一個OOB緩沖區中OOBINLINE模式:OOB字節和普通字節一起存放recvXXXX函數在MSG_OOB模式下,將在OOB緩沖區中尋找數據如果發送端沒發送OOB字節,它返回錯誤如果發送端發送了OOB字節對于非OOBINLINE模式,返回1字節的OOB數據對于OOBINLINE模式,返回錯誤,因為OOB字節沒有放到OOB緩沖區中

Socket基本編程技術41sendto()函數功能用于數據報套接字的通信#include<sys/types.h>#include<sys/socket.h>函數原型intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);參數說明to:目地機的IP地址和端口號信息tolen:常被賦值為sizeof(structsockaddr)返回值成功時,返回實際發送的數據的字節數失敗時,返回-1Socket基本編程技術42recvfrom()函數功能用于數據報套接字的通信#include<sys/types.h>#include<sys/socket.h>函數原型intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);參數說明from:保存源機的IP地址及端口號fromlen:常常被賦值為sizeof(structsockaddr)返回值成功時,返回實際接收到的數據的字節數失敗時,返回-1Socket基本編程技術43write()函數函數原型ssize_t

write(int

fd,const

void

*buf,size_t

nbytes)功能將buf中的nbytes字節內容寫入文件描述符fd返回值成功時返回寫的字節數失敗時返回-1,并設置errno變量說明返回值大于0,表示寫入部分或全部數據返回值小于0,表示出現錯誤如果錯誤為EINTR,表示在寫的時候出現中斷錯誤如果為EPIPE,表示網絡連接出現問題Socket基本編程技術44基于write()函數的socket寫實現Socket基本編程技術45read()函數函數原型ssize_t

read(int

fd,void

*buf,size_t

nbyte)功能從fd中讀取內容返回值讀成功時,返回實際所讀的字節數如果返回的值是0

表示已經讀到文件的結束,出錯時,返回值小于0如果錯誤為EINTR,說明讀是由中斷引起的如果是ECONNREST表示網絡連接出了問題Socket基本編程技術46基于read()函數的socket讀實現Socket基本編程技術47close()/shutdown()函數功能關閉通訊函數原型intclose(intsockfd);intshutdown(intsockfd,inthow);參數說明sockfd:要關閉的套接字描述符how:0:不允許接收1:不允許發送2:不允許發送和接收(和close()一樣)返回值成功時,返回0失敗時,返回-1Socket基本編程技術48getpeername()/gethostname()函數intgetpeername(intsockfd,structsockaddr*addr,int*addrlen);獲取socket連接另一端的主機信息sockfd:是連接的數據流套接口文件描述符addr:保存另一端主機信息addrlen:設置為sizeof(structsockaddr)intgethostname(char*hostname,size_tsize);返回程序正在運行的計算機的名字返回值如果成功,返回0如果失敗,返回-1

Socket基本編程技術49IP地址與域名的獲取函數原型#include<netdb.h>structhostent*gethostbyname(constchar*name);structhostent*gethostbyaddr(constchar*addr,size_tlen,inttype);structhostent{char*h_name;/*主機的正式名稱*/char**h_aliases;/*主機的別名*/inth_addrtype;/*主機的地址類型

AF_INET*/inth_length;/*主機的地址長度

對于IP4

是4字節32位*/char**h_addr_list;/*主機的IP地址列表*/#defineh_addrh_addr_list[0]/*主機的第一個IP地址*/};Socket基本編程技術50字符串的IP與32的IP的轉換說明

網絡上的IP都是數字加點(192.168.0.1)構成structin_addr結構使用32位的IP,如IP(C0A80001)是192.168.0.1函數原型intinet_aton(constchar*cp,structin_addr*inp)將a.b.c.d的IP轉換為32位的IP,存儲在inp指針里面char*inet_ntoa(structin_addrin)將32位IP轉換為a.b.c.d的格式說明a代表ascii,n代表networkSocket基本編程技術51面向連接的socket通信流程客戶端s=socket(),建立流式套接字,返回套接字號sconnect(s),將套接字s與遠程主機連接recv(s)/send(s),在套接字s上讀/寫數據至完成交換close(s),關閉套接字s,結束TCP對話s=socket(),建立流式套接字,返回套接字號sbind(s),套接字s與本地地址相連listen(s),通知TCP服務器準備好接收連接ns=accept(s),接收連接,等待客戶端的連接…建立連接,accept()返回,得到新的套接字nsclose(ns),關閉套接字nsrecv(ns)/send(ns),在套接字ns上讀/寫數據至完成交換服務器端close(s),關閉最初套接字s,服務結束Socket基本編程技術52面向連接socket通信流程服務器程序作用初始化服務器程序持續監聽一個固定的端口收到客戶的連接后建立一個socket連接與客戶進行通信和信息處理接收客戶通過socket連接發送來的數據,創建一個新的socket,通過socket連接與客戶通信,進行相應處理,并返回處理結果通信結束后中斷與客戶的連接(關閉socket)Socket基本編程技術53面向連接的socket通信流程客戶程序作用初始化客戶程序連接到某個服務器上,建立socket連接與服務器進行通信和信息處理接收服務器通過socket連接發送來的數據,進行相應處理通過socket連接向服務器發送請求信息通信結束后中斷與客戶的連接Socket基本編程技術54面向連接socket通信示例—服務器程序Socket基本編程技術55面向連接socket通信示例—服務器程序Socket基本編程技術56面向連接socket通信示例—服務器程序Socket基本編程技術57面向連接socket通信示例—服務器程序Socket基本編程技術58面向連接socket通信示例—客戶程序Socket基本編程技術59面向連接socket通信示例—客戶程序Socket基本編程技術60面向連接socket通信示例—客戶程序Socket基本編程技術61面向無連接socket通信流程客戶端s=socket(),建立數據報套接字,返回套接字號sbind(s),將套接字s與本地主機連接(可選)recvfrom(s)/sendto(s),在套接字s上讀/寫數據至完成交換close(s),關閉套接字s,結束UDP對話bind(s),套接字s與本地地址相連s=socket(),建立數據報套接字,返回套接字號srecvfrom(s)/sendto(s),在套接字s上讀/寫數據至完成交換close(s),關閉套接字s服務器端Socket基本編程技術62面向無連接通信適用場景面向數據報網絡數據大多為短消息擁有大量客戶對數據安全性無特殊要求網絡負擔非常重,但對響應速度要求高Socket基本編程技術63面向無連接socket通信示例—公共函數Socket基本編程技術64面向無連接socket通信示例—公共函數Socket基本編程技術65面向無連接socket通信示例—服務程序Socket基本編程技術66面向無連接socket通信示例—服務程序Socket基本編程技術67面向無連接socket通信示例—服務器程序Socket基本編程技術68面向無連接socket通信示例—客戶程序Socket基本編程技術69面向無連接socket通信示例—客戶程序Socket基本編程技術70服務器請求處理流程—循環服務器方案UDP實現框架沒有一個客戶端可以一直占用服務端只要處理過程不是死循環,則服務器對于每一個客戶機的請求總是能夠滿足

socket(...);

bind(...);

while(1)

{

recvfrom(...);

process(...);

sendto(...);

}

Socket基本編程技術71服務器請求處理流程—循環服務器方案TCP實現框架每次接受一個客戶端連接完成某客戶所有請求后,斷開連接

socket(...);

bind(...);

listen(...);

while(1){

accept(...);

{

recv(...);

process(...);

send(...);

}

close(...);

}Socket基本編程技術72服務器請求處理流程—并發服務器方案TCP實現框架

s=socket(...);

bind(s,...);

listen(s,...);

while(1)

{

ns=accept(s,...);

if(fork(..)==0)

{

recv(ns,...);

process(...);

send(ns,...);

close(ns);}

}

}

Socket基本編程技術73多線程客戶/服務器示例—線程實現功能描述客戶端使用線程向服務器發送從標準輸入得到的字符在主線程中將從服務器端返回的字符顯示到標準輸出服務器端將客戶端發來的數據原樣返回給客戶端,每一個客戶在服務器上對應一個線程Socket基本編程技術74多線程客戶/服務器示例—線程實現公共文件Socket基本編程技術75多線程客戶/服務器示例—線程實現客戶端Socket基本編程技術76多線程客戶/服務器示例—線程實現客戶端Socket基本編程技術Sockfd未實例化!!!77多線程客戶/服務器示例—線程實現服務器端Socket基本編程技術pthread_detach(thread_id)(非阻塞,可立即返回)這將該子線程的狀態設置為detached,則該線程運行結束后會自動釋放所有資源。78多線程客戶/服務器示例—線程實現服務器端Socket基本編程技術79目錄網絡通信協議基礎Socket基本編程技術Socket高級編程技術80阻塞式I/O可能造成阻塞的函數有:connect()、accept()、讀寫函數、select()、poll()、gethostbyname()等Socket高級編程技術81非阻塞式I/O調用可能造成阻塞的函數時,若發生阻塞,函數返回-1并將errno設置為EAGAIN或EWOULDBLOCK,程序可繼續向下運行非阻塞模式需要程序不斷檢查各個可能阻塞的函數的狀態當一個應用程序使用了非阻塞模式的套接字,它需要使用一個循環來不停的測試是否一個文件描述符有數據可讀(稱做p

溫馨提示

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

評論

0/150

提交評論