




已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
大學(xué)課程設(shè)計專用紙分院(系)信息學(xué)院專業(yè)姓名學(xué)號設(shè)計題目解析IP數(shù)據(jù)包內(nèi)容及要求本設(shè)計的目標(biāo)是捕獲網(wǎng)絡(luò)中數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將、結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時寫入日志文件. 程序的具體要求如下:1) 以命令行形式運行:ipparse logfile,其中ipparse是程序名,而logfile則代表記錄結(jié)果的日志文件.2) 在標(biāo)準(zhǔn)輸出和日志文件中寫入捕獲的IP數(shù)據(jù)包的版本,頭長度,服務(wù)類型,數(shù)據(jù)包總長度,數(shù)據(jù)包標(biāo)識,分段標(biāo)志,分段偏移值,生存時間,上層協(xié)議類型,頭校驗和,源IP地址和目的IP地址等內(nèi)容.3)當(dāng)程序接收到鍵盤輸入Ctrl+C時退出進度安排第一次 資料查閱計算機網(wǎng)絡(luò)編程資料并學(xué)習(xí)第二次 學(xué)生上機編程,安裝必要軟件,同時學(xué)習(xí)編程知識。第三次 程序調(diào)試及驗收指導(dǎo)教師(簽字): 年 月 日分院院長(簽字):年 月 日課程設(shè)計任務(wù)書目錄1實驗?zāi)康?實驗要求3預(yù)備知識4課程設(shè)計分析5實現(xiàn)過程6程序流程圖7相關(guān)擴展8實習(xí)體會9參考文獻一實驗?zāi)康模涸O(shè)計一個解析IP數(shù)據(jù)包的程序,并根據(jù)這個程序,說明IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問題,從而IP層的工作原理有更好的理解和認(rèn)識.二實驗要求 : 本設(shè)計的目標(biāo)是捕獲網(wǎng)絡(luò)中數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將、結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時寫入日志文件. 程序的具體要求如下:3) 以命令行形式運行:ipparse logfile,其中ipparse是程序名,而logfile則代表記錄結(jié)果的日志文件.4) 在標(biāo)準(zhǔn)輸出和日志文件中寫入捕獲的IP數(shù)據(jù)包的版本,頭長度,服務(wù)類型,數(shù)據(jù)包總長度,數(shù)據(jù)包標(biāo)識,分段標(biāo)志,分段偏移值,生存時間,上層協(xié)議類型,頭校驗和,源IP地址和目的IP地址等內(nèi)容.當(dāng)程序接收到鍵盤輸入Ctrl+C時退出.三.預(yù)備知識 互聯(lián)網(wǎng)絡(luò)層是TCP/IP協(xié)議參考模型中的關(guān)鍵部分.IP協(xié)議把傳輸層送來的消息組裝成IP數(shù)據(jù)包,并把IP數(shù)據(jù)包傳送給數(shù)據(jù)鏈層.IP協(xié)議在TCP/IP協(xié)議族中處于核心地位,IP協(xié)議制定了統(tǒng)一的IP數(shù)據(jù)包格式,以消除個通信子網(wǎng)中的差異,從而為信息發(fā)送方和接收方提供了透明的傳輸通道.編制本程序前,首先要對IP包的格式有一定了解,圖1給出了IP協(xié)議的數(shù)據(jù)包格式.IP數(shù)據(jù)包的第一個字段是版本字段,其度是4位,表示所使用的IP協(xié)議的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要針對版本是IPV4的數(shù)據(jù)包的解析.報頭標(biāo)長字段為4位,它定義了以4B為一個單位的IP包的報文長度.報頭中除了選項字段和填充域字段外,其他各字段是定長的.因此,IP數(shù)據(jù)包的頭長度在2040B之間,是可變的.0 4 8 16 19 24 31版本報頭標(biāo)長服務(wù)類型總長度標(biāo)識標(biāo)志片偏移生存時間協(xié)議頭校驗和源IP地址目的IP地址選項填充域數(shù)據(jù)部分圖1 IP數(shù)據(jù)包的格式服務(wù)類型字段共8位,用于指示路由器如何處理該數(shù)據(jù)包.該字段長度由4位服務(wù)類型(TOS)子域和3位優(yōu)先級子域組成,1位為保留位,該字段結(jié)構(gòu)如圖2所示. B7 b6 b5 b4 b3 b2 b1 b0優(yōu)先級DTRC0圖2 服務(wù)類型字段結(jié)構(gòu)優(yōu)先級共有8種,優(yōu)先級越高表明數(shù)據(jù)包越重要.表1中列出了各種優(yōu)先級所代表的意義.表一 優(yōu)先子域的說明位數(shù)(b7b6b5) 意義111 網(wǎng)絡(luò)控制110 網(wǎng)絡(luò)間控制101 重要(CRITIC/ECP)100 即時,優(yōu)先011 即時010 立刻001 優(yōu)先000 普通在4位服務(wù)類型子域中b4,b3,b2,b1分別表示D(延遲),T(吞吐量),R(可靠性)與C(成本).表2列出了服務(wù)器類型自域的構(gòu)成.位數(shù)( b4b3b2b1)意義 1111 安全級最高 1000 延遲最小 0100 吞吐量最大 0001 金錢成本最小 0000 普通服務(wù)總長度字段為2B,它定義了以字節(jié)為單位的數(shù)據(jù)包的總長度.IP數(shù)據(jù)包的最大長度為65535B.標(biāo)識字段的長度為16位,用于識別IP數(shù)據(jù)包的編號.每批數(shù)據(jù)都要有一個標(biāo)識值,用于讓目的主機判斷新來的數(shù)據(jù)屬于哪個分組.報頭中的標(biāo)志字段如圖7-3所示.標(biāo)志字段共3位,最高位是0.禁止分片標(biāo)志DF(do not fragment)字段的值若為1,表示不能對數(shù)據(jù)包分片;若DF值為0,則表明可以分片.分片標(biāo)志MF(more fragment)的值為1,表示接收到的不是最后一個分片;若MF值為0,表示接收到的是最后一個分片.片偏移字段共13位,說明分片在整個數(shù)據(jù)包中的相對位置.片偏移值是以8B為單位來記數(shù)的,因此選擇的分片長度應(yīng)該是8B的整數(shù)倍.生存時間(TTL)字段為8位,用來設(shè)置數(shù)據(jù)包在互聯(lián)網(wǎng)絡(luò)的傳輸過程的壽命,通常是用一個數(shù)據(jù)包可以經(jīng)過的最多的路由器跳步數(shù)來限定的.協(xié)議字段為8位,表示使用此IP數(shù)據(jù)包的高層協(xié)議類型,常用的協(xié)議號如表7-3所示.序號協(xié)議名稱序號協(xié)議名稱12468ICMPIGMPIP inIPTCPEGP17414689UDPIPV6RSVPOSPFA表7-3 典型的協(xié)議號頭校驗和字段為16位,用于存放檢查報頭錯誤的校驗碼。檢驗的范圍是整個IP包的報頭。校驗和按如下方法計算:1)將頭校驗和的字段置為0。2)將報頭部分的所有數(shù)據(jù)以16位為單位進行累加,累加方式是求異或。3)將累加的結(jié)果取反碼,就是頭校驗和。 當(dāng)收到一個IP包時,要檢查報頭是否出錯,就把報頭中的所有數(shù)據(jù)以16位為單位進行累加,若累加的結(jié)果為0,則報文沒有出錯。 地址字段包括源地址和目的地址。源地址和目的地址的長度都是32位,分別表示發(fā)送數(shù)據(jù)包的源主機和目的主機的IP地址。 選項字段的長度范圍為040B,主要用于控制和測試。在使用選項字段的過程中,有可能出現(xiàn)報頭部分的長度不是32位的整數(shù)倍的情況。如果出現(xiàn)這種情況,就需要通過填充位來湊齊。 四課程設(shè)計分析為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對網(wǎng)卡進行編程,在這里我們使用套接字(socket)進行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式出發(fā)的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達網(wǎng)絡(luò)接口但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在驗證投遞地址并非自身地址之后將不引起響應(yīng),也就是說應(yīng)用程序無法收取與自己無關(guān)的數(shù)據(jù)包。我們要想獲取流經(jīng)網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就需要將網(wǎng)卡設(shè)置為混雜模式。本程序主要由三部分構(gòu)成:初始化原始套接字,反復(fù)監(jiān)聽捕獲數(shù)據(jù)包和解析數(shù)據(jù)包。下面就結(jié)合核心代碼對程序的具體實現(xiàn)進行講解,同時使程序流程更加清晰,去掉了錯誤檢查等保護性代碼。1. 使用原始套接字套接字分為三種,即流套接字(Stream Socket)、數(shù)據(jù)報套接字(Datagram Socket)和原始套接字(Raw Socket)。要進行IP數(shù)據(jù)包的接受與發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下:SOCKET sock;Sock=WSASoccet(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERRLAPPED);在WSASoccet函數(shù)中,第一個參數(shù)指定通信發(fā)生的區(qū)字段,AF_INET是針對Internet的,允許在遠(yuǎn)程主機之間通信。第二個參數(shù)是套接字的類型,AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三種套接字類型。在這里,我們設(shè)置為SOCK_RAW,表示我們聲明的是一個原始套接字類型。第三個參數(shù)依賴于第二個參數(shù),用于指定套接字所用的特定協(xié)議,這里使用IP協(xié)議。第四個參數(shù)為WSAPROTOCOL_INFO位,該位可以置空,永遠(yuǎn)置0。第六個參數(shù)是標(biāo)志位,WSA_FLAG_OVERRLAPPED表明可以使用發(fā)送接收超時設(shè)置,本課程設(shè)計也可以把這個標(biāo)志位設(shè)置為NULL,因為本設(shè)計不用考慮超時情況。創(chuàng)建原始套接字后,IP頭就會包含在接收的數(shù)據(jù)中。然后,我們可以設(shè)置IP頭操作選項,調(diào)用sotscockpot函數(shù)。其中flag設(shè)置為TRUE,并設(shè)定IP_HDRINCL選項,表明用戶可以親自對IP頭進行處理。BOOL flag=true;setsockopt (sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);之后,使用如下代碼完成對socket的初始化工作/*獲取主機名*/char hostname128;gethostname(hostname, 100);/*獲取IP地址*/hostent *pHostIP;pHostIP=gethostbyname(hostname);/* 填充SOCKADDR_IN的結(jié)構(gòu)內(nèi)容*/sockaddr_in addr_in;addr_in.sin_addr= *(in_addr*)pHostIP-h_addr_list0;addr_in.sin_family=AF_TNET;addr-in.sin_port=htons(6000); /* 綁定socket */bind(sock, (POSCKADDR)&addr_in,sizeof(addr_in); 填寫sockaddr_in的內(nèi)容時,其地址值應(yīng)填寫為本機IP地址可以通過gethostbyname()函數(shù)獲??;端口號可以隨便填寫,但不能與系統(tǒng)沖突;協(xié)議族應(yīng)填寫為AF_INET。注意,sockaddr_in 結(jié)構(gòu)的值必須是以網(wǎng)絡(luò)字節(jié)順序表示的值,而不能直接使用本機字節(jié)順序的值,使用htoms()函數(shù)可以將無符號短整型的主機數(shù)據(jù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)的順序的數(shù)據(jù)。最后使用bind()函數(shù)將socket綁定到本地網(wǎng)卡上。 綁定網(wǎng)卡后,需要WSAIoctl()函數(shù)把網(wǎng)卡設(shè)置為混雜模式,使網(wǎng)卡能夠接收所有網(wǎng)絡(luò)數(shù)據(jù),其關(guān)鍵代碼如下:#define SIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORD dwBufferLen10;DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;WSAIoctl(SnifferSocket,IO-RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,Sizeof(dwBufferLen),&dwByteReturned,NULL,NULL); 如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收到的數(shù)據(jù)就拷貝到套接字中。因此,網(wǎng)卡就可以接收所有經(jīng)過的IP包。2.接收數(shù)據(jù)包 在程序中可使用RECV()函數(shù)接收經(jīng)過的IP包。該函數(shù)有四個參數(shù),第一個參數(shù)接收操作所用的套接字描述符;第二個參數(shù)接收到緩沖區(qū)的地址;第二個參數(shù)接收緩沖區(qū)的地址;第三個參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個參數(shù)是一個附加標(biāo)志,如果對所發(fā)送的數(shù)據(jù)沒特殊要求,直接設(shè)為0。因為IP數(shù)據(jù)包的最大長度是65536B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來反復(fù)監(jiān)聽接收IP包,用recv()函數(shù)接收功能的代碼如下:#dedine BUFFER_SIZE 65535Char bufferBUFFER_SIZE; /設(shè)置緩沖區(qū)While(true)recv(sock,buffer,BUFFER_SIZE,0); /j接收數(shù)據(jù)包.3.定義IP頭部的數(shù)據(jù)結(jié)構(gòu)程序需要定義一個數(shù)據(jù)結(jié)構(gòu)表示IP頭部。這個數(shù)據(jù)結(jié)構(gòu)應(yīng)該和圖7-1吻合,其代碼如下:typedef struct _IP_HEADER /定義IP頭unionBYTE Version; /版本前4位BYTE HdrLen; /報頭標(biāo)長(后四位),IP頭長度;BYTE ServiceType;/服務(wù)類型WORD TotalLen; /總長度WORD ID; /標(biāo)識union WORD Flags; /標(biāo)志W(wǎng)ord FragOff; /分段偏移;BYTE TimeToLive; /生命期BYTE Protiocol; /協(xié)議WORD HdrChksum; /頭校驗和DWORD SrcAddr; /源地址DWORD DstAddr: /目的地址BYTE Options; /選項IP_HEADER;這是我們只考慮IP頭部結(jié)構(gòu),不考慮數(shù)據(jù)部分。在捕獲IP數(shù)據(jù)包后,可以通過指針把緩沖區(qū)的內(nèi)容強制轉(zhuǎn)化為IP_HEADER數(shù)據(jù)結(jié)構(gòu)。IP_HEADER ip = *( IP_HEADER *)buffer;4.IP包的解析解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段 (或子字段)時,可以利用IP_HEADER的成員指教獲取。要解析長度不是9位倍數(shù)的字段(或子字段)時,可以利用C語言中的位移以及與、或操作完成。下面給出了通過IP_HEADER解析IP頭各個字段的代碼。/*獲取版本字段*/ip.Version4;/*獲取頭部長度字段*/ip.HdrLen & 0x0f;/*獲取服務(wù)類型字段中的優(yōu)先級子域*/ip.ServiceType5;/*獲取服務(wù)類型字段中的TOS子域*/(IP.sERVICEtYPE1)&0X0F;/*獲取總長度字段*/ip.TotalLEN;/*獲取標(biāo)識字段*/ip.ID;/*解析標(biāo)識字段*/DF=(ip.Flags14) &0x01;MF=(ip.Flags13) &0X01;/*獲取分段偏移字段*/ip.FragOff &0x1fff;/*獲取生存時間字段*/ip.TimeToLive;/*獲取協(xié)議字段*/ip.Protocol;/*獲取頭校驗和字段*/ip.HdrChksum;/*解析源IP地址字段*/inet_ntoa(*(in_addr*)&ip.SrcAddr;/*解析目的的IP地址字段*/inet_ntoa(*(in_addr*)&ip.DstAddr);5.參考程序流程圖圖7-4給出一個供參考的程序流程圖。 五實現(xiàn)過程#include stdafx.h#include winsock2.h#include ws2tcpip.h#include stdio.htypedef struct _IP_HEADERunionBYTE Version;BYTE HdrLen;BYTE ServiceType;WORD TotalLen;WORD ID;unionWORD Flags;WORD Fragoff;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;IP_HEADER; void getVersion(BYTE b,BYTE & version)version =b4;void getIHL(BYTE b,BYTE & result)result = (b & 0x0f) *4; char * parseServiceType_getProcedence(BYTE b)switch(b5)case 7:return Network Control;break;case 6:return Internet work Control;break; case 5:return CRITIC/ECP;break;case 4:return Flash Override;break;case 3:return Falsh;break;case 2:return Immediate;break;case 1:return Priority;break;case 0:return Routine;break;default :return Unknownchar * parseServiceType_getTOS(BYTE b)b=(b1)&0x0f;switch(b)case 0:return Normal service;break; case 1:return Minimize monetary cost;break;case 2:return Maximize reliability;break;case 4:return Maximize throughput;break;case 8:return Minimize delay;break;case 15:return Maximize security;break;default:return Unknown;void getFlags(WORD w,BYTE & DF, BYTE & MF)DF=(w14)&0x01;MF=(w13)&0x01;void getFragoff(WORD w,WORD & fragoff)fragoff=w&0x1ffff;char * getProtocol(BYTE Protocol)switch (Protocol)case 1:return ICMP;case 2:return IGMP;case 4:return IP in IP ;case 6:return TCP;case 8:return EGP;case 17:return UPD;case 41:return IPv6;case 46:return OSPF;default:return UNKNOWN;void ipparse(FILE * file,char *buffer)IP_HEADER ip=*(IP_HEADER *)buffer;fseek(file,0,SEEK_END);BYTE version;getVersion(ip.Version,version);fprintf(file,版本=%drn,version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,頭長度=%d(BYTE)rn,headerLen); fprintf(file,服務(wù)類型=%s,%srn);parseServiceType_getProcedence(ip.ServiceType);parseServiceType_getTOS(ip.ServiceType);fprintf(file,數(shù)據(jù)報長度=%d(BYTE)rn,ip.TotalLen);fprintf(file,數(shù)據(jù)報ID=%drn,ip.ID);BYTE DF,MF;getFlags(ip.Flags,DF,MF); fprintf(file,分段標(biāo)志 DF=%d,MF=%drn,DF,MF);WORD fragOff;getFragOff(ip.FragOff,fragOff); fprintf(file,分段偏移值=%drn,fragOff); fprintf(file, 生存期=%d(hops)rn,ip.TimeToLive); fprintf(file,協(xié)議=%srn,getProtocol(ip.Protocol); fprintf(file,頭校驗和=0x%0xrn,ip.HdrChksum); fprintf(file,源IP地址=%srn,inet-ntoa(*(in-addr*)&ip.SrcAddr); fprintf(file,目的IP地址=%srn,inet_ntoa(*(in-addr*)&ip.DstAddr); fprintf(file,_rn);int main(int argc,char *argv) if(argc!=2) printf(usage error!n); return -1; FILE * file; if(file=foopen(argv1,wb+)=NULL) printf(fail to open file %s,argv1); return -1; WSADATA wsData;if(WSAStartup(MAKEWORD(2,2),$WSdATA)!=0)PRINTF(WSAStartup FAILED!n);return -1;SOCKET sock;if(sock=socket(AF_INET,SOCK_RAW,ippROTO_IP)=INVALID_SOCKET)PRINTF(CREATE socket failed!n);return -1;BOOL flag=TRUE;IF(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&FLAG,sizeof(flag)=SOCKET_ERROR) printf(setsockopt failed!n);return -1;char hostName128; if(gethostname(hostName,100)=SOCKET_ERROR)printf(gethostname failed!n);return -1;hostent * pHostIP;if(pHostIP=gethostbyname(hostName)=NULL) printf(gethostbyname failed!n);return -1;sockaddr_in addr_in;addr_in.sin_addr=*(in_addr*)pHostIP-h_addr_list0;addr_in.sin_family=AF_INET;addr_in.sin_port=htone(6000);if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in)=SOCKET_ERROR)printf(bind failed);return -1;DWORD dwValue=1;#define IO_RCVALL_WSAIOW(IOC_VENDOR,1) DWORD dwBufferLen10; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)= NULL,NULL)=SOCKET_ERROR) printf(icotlsocket failedn);return -1; #define BUFFER_SIZE 65535 char bufferBUFFER_SIZE; printf(開始解析nn); while(true) int size=recv(sock,buffer,BUFFER_SIZE,0); if(size0) ipparse(stdout,buffer); ipparse(file,buffer); fclose(file); return 0: 開始構(gòu)造程序運行環(huán)境,生
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專項購買服務(wù)合同范本
- 公司聘請物業(yè)合同范本
- 2025年安徽道路貨運駕駛員從業(yè)資格證考試題庫
- 前臺用工合同范本
- 辦公桌椅合同范本
- 中標(biāo)平臺合同范本
- 中鐵高速公路合同范本
- 加氣砌塊合同范本
- 勞務(wù)醫(yī)院合同范本
- 公司車輛供貨合同范例
- 液壓滑動模板施工方案
- 農(nóng)產(chǎn)品電商運營-完整全套課件
- 唐河縣泌陽凹陷郭橋天然堿礦產(chǎn)資源開采與生態(tài)修復(fù)方案
- 科研項目匯報ppt
- 建設(shè)工程項目法律風(fēng)險防控培訓(xùn)稿PPT講座
- “不作為、慢作為、亂作為”自查自糾報告范文(三篇)
- 上海市楊浦區(qū)2022屆初三中考二模英語試卷+答案
- 課件《中國式現(xiàn)代化》
- 公共事業(yè)管理案例
- 建筑電工考試題庫與答案
- TCSES 71-2022 二氧化碳地質(zhì)利用與封存項目泄漏風(fēng)險評價規(guī)范
評論
0/150
提交評論