版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
TechnologyofNetworkProgramming網(wǎng)絡(luò)編程技術(shù)第14章路由器基本功能實現(xiàn)程序1概述
路由器是實現(xiàn)IP協(xié)議最為關(guān)鍵的設(shè)備之一。通過簡單路由器程序的設(shè)計與實現(xiàn),掌握路由器基本工作原理,理解路由選擇與數(shù)據(jù)包轉(zhuǎn)發(fā)的方法2網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的編程訓(xùn)練要求相關(guān)知識介紹程序設(shè)計分析擴展與提高提綱3網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的在理解IP協(xié)議、ICMP協(xié)議與路由選擇基本工作原理的基礎(chǔ)上,完成路由器基本功能的設(shè)計與編程實現(xiàn)掌握Windwos平臺下路由程序測試環(huán)境的搭建方法熟悉Winpcap編程,掌握數(shù)據(jù)包捕獲與發(fā)送的方法。熟悉動態(tài)路由協(xié)議原理以及動態(tài)路由表的實現(xiàn)方法4網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的編程訓(xùn)練要求相關(guān)知識介紹程序設(shè)計分析擴展與提高提綱5網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練要求
利用Winpcap編寫一個簡單的路由處理程序,該路由程序應(yīng)該至少應(yīng)該包括以下功能:靜態(tài)路由表維護IP數(shù)據(jù)包處理ARP請求與解析處理IP數(shù)據(jù)包的TTL值重新計算IP數(shù)據(jù)包的頭部校驗和生成和處理ICMP報文記錄日志功能6網(wǎng)絡(luò)編程技術(shù)程序運行的參考界面
7網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的編程訓(xùn)練要求相關(guān)知識介紹程序設(shè)計分析擴展與提高提綱8網(wǎng)絡(luò)編程技術(shù)路由器結(jié)構(gòu)
9網(wǎng)絡(luò)編程技術(shù)路由器基本功能
為經(jīng)過的IP數(shù)據(jù)包選擇路由處理IP數(shù)據(jù)包選項處理IP數(shù)據(jù)包TTL值分片處理重新計算IP數(shù)據(jù)包的頭部校驗和生成和處理ICMP報文實現(xiàn)動態(tài)路由協(xié)議、維護靜態(tài)路由實現(xiàn)ARP協(xié)議、形成數(shù)據(jù)幀10網(wǎng)絡(luò)編程技術(shù)路由選擇的基本原理IP互聯(lián)網(wǎng)采用表驅(qū)動的路由選擇算法需要路由選擇的設(shè)備保存一張IP路由表路由表存儲有關(guān)目的地址及怎樣到達目的地的信息通過查詢路由表決定把數(shù)據(jù)報發(fā)往何處IP路由選擇利用IP地址隱藏主機信息連接到同一網(wǎng)絡(luò)的所有主機共享同一網(wǎng)絡(luò)號11網(wǎng)絡(luò)編程技術(shù)標準的路由選擇算法12網(wǎng)絡(luò)編程技術(shù)子網(wǎng)選路13網(wǎng)絡(luò)編程技術(shù)路由表路由表中的每一條路由表項含有五個屬性:目的網(wǎng)絡(luò)地址、網(wǎng)絡(luò)掩碼、下一跳、接口和躍點數(shù)
14網(wǎng)絡(luò)編程技術(shù)相關(guān)的ICMP差錯報文目的不可達報文當路由器不能為數(shù)據(jù)包找到路由器或主機交付數(shù)據(jù)包時,就丟棄該數(shù)據(jù)包,然后向源主機發(fā)出ICMP目的不可達報文超時報文路由器在轉(zhuǎn)發(fā)數(shù)據(jù)包時,如果生存周期TTL值減1后為0,就丟棄這個數(shù)據(jù)包。當丟棄這樣的數(shù)據(jù)包時,路由器向源主機發(fā)送一個超時報文當計時器的時限到,而目的主機還沒有接收到一個數(shù)據(jù)包的所有分片時,它會將接收的分片丟棄,并向源主機發(fā)送超時報文15網(wǎng)絡(luò)編程技術(shù)編程訓(xùn)練目的編程訓(xùn)練要求相關(guān)知識介紹程序設(shè)計分析擴展與提高提綱16網(wǎng)絡(luò)編程技術(shù)測試環(huán)境的搭建測試環(huán)境示意圖
17網(wǎng)絡(luò)編程技術(shù)測試環(huán)境的搭建測試環(huán)境示意圖
邏輯結(jié)構(gòu)物理結(jié)構(gòu)18網(wǎng)絡(luò)編程技術(shù)路由程序的設(shè)計路由器初始化模塊初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲與處理模塊靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊完成路由表的添加、刪除以及顯示
數(shù)據(jù)包捕獲與處理模塊
數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進行處理
19網(wǎng)絡(luò)編程技術(shù)定義數(shù)據(jù)包頭數(shù)據(jù)結(jié)構(gòu)
#pragmapack(1)typedef
struct
FrameHeader_t{ //幀首部
UCHAR DesMAC[6]; //目的地址
UCHAR SrcMAC[6]; //源地址
USHORT FrameType; //幀類型}FrameHeader_t;typedef
struct
ARPFrame_t{ //ARP幀
FrameHeader_t
FrameHeader; //幀首部
WORD HardwareType; //硬件類型
WORD ProtocolType; //協(xié)議類型
BYTE HLen; //硬件地址長度
BYTE PLen; //協(xié)議地址長度
WORD Operation; //操作值
UCHAR SendHa[6]; //源MAC地址
ULONG SendIP; //源IP地址
UCHAR RecvHa[6]; //目的MAC地址
ULONG RecvIP; //目的IP地址}ARPFrame_t;20網(wǎng)絡(luò)編程技術(shù)定義數(shù)據(jù)包頭數(shù)據(jù)結(jié)構(gòu)
typedef
struct
IPHeader_t
{ //IP首部
BYTE Ver_HLen; //版本+頭部長度
BYTE TOS; //服務(wù)類型
WORD TotalLen; //總長度
WORD ID; //標識
WORD Flag_Segment; //標志+片偏移
BYTE TTL; //生存時間
BYTE Protocol; //協(xié)議
WORD Checksum; //頭部校驗和
ULONG SrcIP; //源IP地址
ULONG DstIP; //目的IP地址}IPHeader_t;typedef
struct
ICMPHeader_t
{ //ICMP首部
BYTEType; //類型
BYTECode; //代碼
WORDChecksum; //校驗和
WORDId; //標識
WORDSequence; //序列號}ICMPHeader_t;21網(wǎng)絡(luò)編程技術(shù)路由程序的設(shè)計路由器初始化模塊初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲與處理模塊靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊完成路由表的添加、刪除以及顯示
數(shù)據(jù)包捕獲與處理模塊
數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進行處理
22網(wǎng)絡(luò)編程技術(shù)1、定義存儲信息接口數(shù)據(jù)結(jié)構(gòu)
typedef
struct
ip_t{//網(wǎng)絡(luò)地址
ULONG IPAddr;//IP地址
ULONG IPMask;//子網(wǎng)掩碼}ip_t;typedef
struct
IfInfo_t
{ //接口信息
CString
DeviceName;//設(shè)備名
CString Description;//設(shè)備描述
UCHAR MACAddr[6];//MAC地址
CArray<ip_t,ip_t&> ip;//IP地址列表
pcap_t *adhandle;//pcap句柄}IfInfo_t;//打開并由一個線程監(jiān)聽流經(jīng)該接口的數(shù)據(jù)報23網(wǎng)絡(luò)編程技術(shù)1、定義路由表數(shù)據(jù)結(jié)構(gòu)
typedef
struct
RouteTable_t
{ //路由表結(jié)構(gòu)
ULONG Mask;//子網(wǎng)掩碼
ULONG DstIP;//目的地址
ULONG NextHop;//下一跳步
UINT IfNo;//接口序號}RouteTable_t;24網(wǎng)絡(luò)編程技術(shù)2、定義全局變量
IfInfo_t
IfInfo[MAX_IF]; //接口信息數(shù)組UINT_PTRTimerCount;//定時器個數(shù)CList<SendPacket_t,SendPacket_t&>SP;//發(fā)送數(shù)據(jù)包緩存隊列CList<IP_MAC_t,IP_MAC_t&>IP_MAC;//IP-MAC地址映射列表CList<RouteTable_t,RouteTable_t&>RouteTable;//路由表25網(wǎng)絡(luò)編程技術(shù)路由器
初始化模塊26網(wǎng)絡(luò)編程技術(shù)3、初始化-獲得本機的設(shè)備列表
//獲得本機的設(shè)備列表
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL/*無需認證*/,&alldevs,errbuf)==-1){ //錯誤,返回錯誤信息
sprintf(strbuf,"pcap_findalldevs_ex錯誤:%s",errbuf);
MessageBox(strbuf);
PostMessage(WM_QUIT,0,0);}27網(wǎng)絡(luò)編程技術(shù)3、初始化-獲得接口信息和IP地址信息
for(d=alldevs;d!=NULL;d=d->next) {
if(d->addresses!=NULL) //排除集成modem的影響(沒有IP地址){ //得到一個有效的接口和其IP地址列表
IfInfo[i].DeviceName=d->name;
IfInfo[i].Description=d->description;
for(a=d->addresses;a;a=a->next){ if(a->addr->sa_family==AF_INET){
ipaddr.IPAddr=(((struct
sockaddr_in*)a->addr)->sin_addr.s_addr);
ipaddr.IPMask=(((struct
sockaddr_in*)a->netmask)->sin_addr.s_addr);
IfInfo[i].ip.Add(ipaddr); j++; } } if(i==MAX_IF) //最多處理MAX_IF個接口
{break; }
else{i++;}}28網(wǎng)絡(luò)編程技術(shù)3、初始化-打開設(shè)備接口
//打開接口for(i=0;i<IfCount;i++){if((IfInfo[i].adhandle=pcap_open(IfInfo[i].DeviceName,//設(shè)備名
65536,//最大包長度
PCAP_OPENFLAG_PROMISCUOUS,//混雜模式
1000,//超時時間
NULL,//遠程認證
errbuf//錯誤緩存
))==NULL){ //錯誤,顯示錯誤信息
sprintf(strbuf,"接口未能打開。WinPcap不支持%s。",IfInfo[i].DeviceName);
MessageBox(strbuf);
PostMessage(WM_QUIT,0,0);}29網(wǎng)絡(luò)編程技術(shù)3、初始化-獲得各接口MAC地址
//開啟數(shù)據(jù)包捕獲線程,獲取本地接口的MAC地址,線程數(shù)目為網(wǎng)卡個數(shù)CWinThread*pthread;for(i=0;i<IfCount;i++){
pthread=AfxBeginThread(CaptureLocalARP,&IfInfo[i],THREAD_PRIORITY_NORMAL);
if(!pthread) {
MessageBox("創(chuàng)建數(shù)據(jù)包捕獲線程失??!");
PostMessage(WM_QUIT,0,0); }}//為得到真實網(wǎng)卡地址,使用虛假的MAC地址和IP地址向本機發(fā)送ARP請求setMAC(srcMAC,66); //設(shè)置虛假的MAC地址srcIP=inet_addr("112.112.112.112"); //設(shè)置虛假的IP地址for(i=0;i<IfCount;i++){
ARPRequest(IfInfo[i].adhandle,srcMAC,srcIP,IfInfo[i].ip[0].IPAddr);}30網(wǎng)絡(luò)編程技術(shù)3、初始化-初始化路由表
//初始化路由表并顯示RouteTable_t
rt;for(i=0;i<IfCount;i++){ for(j=0;j<IfInfo[i].ip.GetSize();j++) {
rt.IfNo=i;
rt.DstIP=
IfInfo[i].ip[j].IPAddr&IfInfo[i].ip[j].IPMask;
rt.Mask=IfInfo[i].ip[j].IPMask;
rt.NextHop
=0; //直接投遞
RouteTable.AddTail(rt); m_RouteTable.InsertString(-1,IPntoa(rt.Mask)+"--"+IPntoa(rt.DstIP)+"--"+IPntoa(rt.NextHop)+"(直接投遞)"); }}31網(wǎng)絡(luò)編程技術(shù)3、初始化-設(shè)置過濾規(guī)則開始捕獲
//設(shè)置過濾規(guī)則:僅僅接收arp響應(yīng)幀和需要路由的幀CStringFilter,Filter0,Filter1;只接收需要轉(zhuǎn)發(fā)的IP數(shù)據(jù)報,共同特點是目的Filter0=“(”;MAC地址指向本機,但目的IP地址不屬于本機Filter1=“(”;轉(zhuǎn)發(fā)需要MAC地址,所以還需接收ARP應(yīng)答包for(i=0;i<IfCount;i++){ Filter0+="(etherdst"+MACntoa(IfInfo[i].MACAddr)+")"; for(j=0;j<IfInfo[i].ip.GetSize();j++)//mac地址為本路由器接口 { Filter1+="(ip
dsthost"+IPntoa(IfInfo[i].ip[j].IPAddr)+")"; if(((j==(IfInfo[i].ip.GetSize()-1)))&&(i==(IfCount-1))) {Filter1+=“)”;}//IP地址為本機的接口地址 else{Filter1+="or";} } if(i==(IfCount-1)) {Filter0+=")";} else{Filter0+="or";}}//需要轉(zhuǎn)發(fā)的數(shù)據(jù)包Filter=Filter0+"and((arpand(ether[21]=0x2))or(not"+Filter1+"))";32網(wǎng)絡(luò)編程技術(shù)ARP幀結(jié)構(gòu)1632bit硬件類型協(xié)議類型硬件地址長度協(xié)議長度操作(Request1,Reply2)發(fā)送方硬件地址發(fā)送方IP地址目的硬件地址目的IP地址33網(wǎng)絡(luò)編程技術(shù)3、初始化-設(shè)置過濾規(guī)則開始捕獲
表達式支持邏輯操作符,and/or/not基于協(xié)議的過濾要使用協(xié)議限定符,可以是IP/ARP/RARP/TCP/UDP等?;贛AC過濾要使用限定符ether基于IP地址過濾使用限定符host基于端口的過濾使用限定符port34網(wǎng)絡(luò)編程技術(shù)3、初始化-設(shè)置過濾規(guī)則開始捕獲
if(pcap_compile(IfInfo[i].adhandle,&fcode,strbuf,1,IfInfo[i].ip[0].IPMask)<0){
MessageBox("過濾規(guī)則編譯不成功,請檢查書寫的規(guī)則語法是否正確!"); PostMessage(WM_QUIT,0,0);}if(pcap_setfilter(IfInfo[i].adhandle,&fcode)<0){
MessageBox("設(shè)置過濾器錯誤!");
PostMessage(WM_QUIT,0,0);}//開始捕獲數(shù)據(jù)包for(i=0;i<IfCount;i++)
pthread=AfxBeginThread(Capture,&IfInfo[i],THREAD_PRIORITY_NORMAL);35網(wǎng)絡(luò)編程技術(shù)路由程序的設(shè)計路由器初始化模塊初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲與處理模塊靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊完成路由表的添加、刪除以及顯示
數(shù)據(jù)包捕獲與處理模塊
數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進行處理
36網(wǎng)絡(luò)編程技術(shù)1、添加路由表項
voidCRouterDlg::OnInsert(){flag=false;for(i=0;i<IfCount;i++){ for(j=0;j<IfInfo[i].ip.GetSize();j++) { if(((IfInfo[i].ip[j].IPAddr)&(IfInfo[i].ip[j].IPMask))==((IfInfo[i].ip[j].IPMask)&ipaddr))//判斷該路由表項屬于哪個接口 {
rt.IfNo=i; //記錄子網(wǎng)掩碼
m_Mask.GetAddress(ipaddr); rt.Mask=htonl(ipaddr); //記錄目的IP
m_Destination.GetAddress(ipaddr);
rt.DstIP
=htonl(ipaddr); //記錄下一跳
m_NextHop.GetAddress(ipaddr);
rt.NextHop=htonl(ipaddr);//把該條路由表項添加到路由表
RouteTable.AddTail(rt); //在路由表窗口中顯示該路由表項
m_RouteTable.InsertString(-1,IPntoa(rt.Mask)+"--" +IPntoa(rt.DstIP)+"--"+IPntoa(rt.NextHop)); flag=true; }37網(wǎng)絡(luò)編程技術(shù)2、刪除路由表項
//刪除路由表項voidCRouterDlg::OnDel(){
RouteTable_t
rt; POSITIONpos,CurrentPos;
m_RouteTable.GetText(i,str); //取得子網(wǎng)掩碼選項
strncat(ipaddr,str,15); mask=inet_addr(ipaddr); //取得目的地址選項
ipaddr[0]=0;
strncat(ipaddr,&str[19],15); destination=inet_addr(ipaddr); //取得下一跳選項
ipaddr[0]=0;
strncat(ipaddr,&str[38],15);
nexthop=inet_addr(ipaddr);38網(wǎng)絡(luò)編程技術(shù)2、刪除路由表項
if(nexthop==0){ MessageBox("直接連接路由,不允許刪除!");}//把該路由表項從路由表窗口中刪除m_RouteTable.DeleteString(i);//路由表中沒有需要處理的內(nèi)容,則返回if(RouteTable.IsEmpty()){return;}//遍歷路由表,把需要刪除的路由表項從路由表中刪除pos=RouteTable.GetHeadPosition();for(i=0;i<RouteTable.GetCount();i++){
CurrentPos=pos;
rt=RouteTable.GetNext(pos); if((rt.Mask==mask)&&(rt.DstIP==destination)&&(rt.NextHop==nexthop)) {
RouteTable.RemoveAt(CurrentPos); }}39網(wǎng)絡(luò)編程技術(shù)路由程序的設(shè)計路由器初始化模塊初始化模塊負責(zé)初始化設(shè)備,添加與路由器直接相連網(wǎng)絡(luò)的路由表項,并啟動相應(yīng)的數(shù)據(jù)包捕獲與處理模塊靜態(tài)路由表維護模塊靜態(tài)路由表維護模塊完成路由表的添加、刪除以及顯示
數(shù)據(jù)包捕獲與處理模塊
數(shù)據(jù)包捕獲與處理模塊用于捕獲流經(jīng)本路由器的數(shù)據(jù)包并按照路由協(xié)議進行處理
40網(wǎng)絡(luò)編程技術(shù)1、數(shù)據(jù)包捕獲
//數(shù)據(jù)包捕獲線程UINTCapture(PVOID
pParam){
int res;
IfInfo_t *pIfInfo;
struct
pcap_pkthdr *header; constu_char *pkt_data;
pIfInfo=(IfInfo_t*)pParam; //開始正式接收并處理幀
while(true) { res=pcap_next_ex(pIfInfo->adhandle,&header,&pkt_data); if(res==1) {
FrameHeader_t *fh;
fh=(FrameHeader_t*)pkt_data;41網(wǎng)絡(luò)編程技術(shù)1、數(shù)據(jù)包捕獲
switch(ntohs(fh->FrameType)){ case0x0806:
ARPFrame_t*ARPf;
ARPf=(ARPFrame_t*)pkt_data; //TRACE1("收到ARP包源IP為:%d\n",ARPf->SendIP);
//ARP包,轉(zhuǎn)到ARP包處理函數(shù)
ARPPacketProc(header,pkt_data); break;
case0x0800:
IPFrame_t*IPf;
IPf=(IPFrame_t*)pkt_data; //TRACE1("收到IP包源IP為:%d\n",IPf->IPHeader.SrcIP); //IP包,轉(zhuǎn)到IP包處理函數(shù)
IPPacketProc(pIfInfo,header,pkt_data); break;
default:}42網(wǎng)絡(luò)編程技術(shù)1、數(shù)據(jù)包緩存列表和IP-MAC緩存列表
typedef
struct
SendPacket_t{ //發(fā)送數(shù)據(jù)包結(jié)構(gòu)
int
len;//長度
BYTE PktData[2000];//數(shù)據(jù)緩存
ULONG TargetIP;//目的IP地址
UINT_PTR n_mTimer;//定時器
UINT IfNo;//接口序號}SendPacket_t;typedef
struct
IP_MAC_t{//IP-MAC地址映射結(jié)構(gòu)
ULONG IPAddr;//IP地址
UCHAR MACAddr[6];//MAC地址}IP_MAC_t;43網(wǎng)絡(luò)編程技術(shù)數(shù)據(jù)包捕獲與處理模塊(IP數(shù)據(jù)包的處理)44網(wǎng)絡(luò)編程技術(shù)2、IP數(shù)據(jù)包處理
voidIPPacketProc(IfInfo_t*pIfInfo,struct
pcap_pkthdr*header,constu_char*pkt_data){
IPFrame_t*IPf;
SendPacket_t
sPacket;
IPf=(IPFrame_t*)pkt_data;//ICMP超時IPf->IPHeader.TTL
--;//TTL值減去1
if(IPf->IPHeader.TTL<=0){
ICMPPacketProc(pIfInfo,11,0,pkt_data);}
IPHeader_t*IpHeader=&(IPf->IPHeader);//ICMP差錯
if(IsChecksumRight((char*)IpHeader)==0){//日志輸出信息
pDlg->m_Log.InsertString(-1,"IP數(shù)據(jù)包包頭校驗和錯誤,丟棄數(shù)據(jù)包");}45網(wǎng)絡(luò)編程技術(shù)2、IP數(shù)據(jù)包處理DWORDnextHop;//經(jīng)過路由選擇算法得到的下一站目的IP地址
UINTifNo;//下一跳的接口序號
//路由查詢
if((nextHop=RouteLookup(ifNo,IPf->IPHeader.DstIP,&RouteTable))==-1){//ICMP目的不可達
ICMPPacketProc(pIfInfo,3,0,pkt_data);}else//查找到了下一跳
{
sPacket.IfNo=ifNo;
sPacket.TargetIP=nextHop;
cpyMAC(IPf->FrameHeader.SrcMAC,IfInfo[sPacket.IfNo].MACAddr);//設(shè)IP頭中的校驗和為0
IPf->IPHeader.Checksum=0;//計算IP頭部校驗和
IPf->IPHeader.Checksum=ChecksumCompute(check_buff,sizeof(IPHeader_t));46網(wǎng)絡(luò)編程技術(shù)2、IP數(shù)據(jù)包處理//IP-MAC地址映射表中存在該映射關(guān)系
if(IPLookup(sPacket.TargetIP,IPf->FrameHeader.DesMAC)){memcpy(sPacket.PktData,pkt_data,header->len);
sPacket.len=header->len;
if(pcap_sendpacket(IfInfo[sPacket.IfNo].adhandle,(u_char*)sPacket.PktData,sPacket.len)!=0)}//IP-MAC地址映射表中不存在該映射關(guān)系
else{if(SP.GetCount()<65530)//存入緩存隊列
{
sPacket.len=header->len;//將需要轉(zhuǎn)發(fā)的數(shù)據(jù)報存入緩存區(qū)
memcpy(sPacket.PktData,pkt_data,header->len);
SP.AddTail(sPacket); //發(fā)送ARP請求
ARPRequest(IfInfo[sPacket.IfNo].adhand
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版裝配式廠房買賣合同范本3篇
- 二零二五年方木產(chǎn)業(yè)園區(qū)建設(shè)與購銷合作合同3篇
- 二零二五版快遞物流服務(wù)合同匯編3篇
- 二零二五年度空壓機設(shè)備零配件供應(yīng)與倉儲合同3篇
- 二零二五年文化活動兼職主持人聘任合同范本2篇
- 2025版快遞驛站快遞服務(wù)場地租賃及配套設(shè)施合同模板2篇
- 二零二五年無線基站場地天面租賃及維護合同3篇
- 二零二五版能源企業(yè)安全生產(chǎn)責(zé)任合同3篇
- 二零二五版建筑工程混凝土材料綠色認證合同文本2篇
- 二零二五年知識產(chǎn)權(quán)貸款抵押擔保合同標準版2篇
- 團隊成員介紹
- 水泵行業(yè)銷售人員工作匯報
- 《流感科普宣教》課件
- 離職分析報告
- 春節(jié)家庭用電安全提示
- 醫(yī)療糾紛預(yù)防和處理條例通用課件
- 廚邦醬油推廣方案
- 乳腺癌診療指南(2024年版)
- 高三數(shù)學(xué)寒假作業(yè)1
- 保險產(chǎn)品創(chuàng)新與市場定位培訓(xùn)課件
- (完整文本版)體檢報告單模版
評論
0/150
提交評論