版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.花生殼動(dòng)態(tài)域名SDKPeanuthull dynamic DNS上海貝銳信息科技有限公司目錄1. 概述22. 官方認(rèn)證23. 關(guān)于官方認(rèn)證Key的說明34. 示例源碼35. 源碼說明66. 關(guān)于客戶端界面97. DDNS協(xié)議說明117.1. TCP認(rèn)證部分117.1.1. 賬號(hào)認(rèn)證117.1.2. 服務(wù)器跳轉(zhuǎn)157.1.3. 注冊域名167.1.4. 獲取域名信息177.1.5. 獲取用戶信息187.2. UDP保持部分197.2.1. 心跳包協(xié)議197.2.2. 維持客戶端在線247.2.3. 獲得客戶端IP端變更247.2.4. 注銷登陸24上海貝銳信息科技有限公司33 1. 概述花生殼
2、是一套完全免費(fèi)的桌面式域名管理和動(dòng)態(tài)域名解析( DDNS )等功能為一體的客戶端軟件?;ㄉ鷼た蛻舳讼蛴脩籼峁┤轿坏淖烂媸接蛎芾硪约皠?dòng)態(tài)域名解析服務(wù)。用戶無需通過 IE 瀏覽器,直接通過客戶端使用 所提供的動(dòng)態(tài)域名服務(wù),包括用戶注冊、域名查詢、域名管理、 IP 工具以及自診斷等各種服務(wù);且通過樹狀結(jié)構(gòu)方式可使用戶對多達(dá)上百個(gè)域名進(jìn)行方便管理,亦可自主添加二級(jí)域名,自由設(shè)置 A 記錄( IP 指向)、 MX記錄、 CName(別名)、 URL重定向等,用戶操作界面清晰簡單?;ㄉ鷼?dòng)態(tài) DDNS 服務(wù)支持包括Modem、ISDN 、ADSL、有
3、線電視網(wǎng)絡(luò)、雙絞線到戶的寬帶網(wǎng)和其他任何能夠提供互聯(lián)網(wǎng)真實(shí) IP 的接入服務(wù)線路,無論連接獲得的 IP 屬于動(dòng)態(tài)還是靜態(tài),都可根據(jù)自己的需求選擇合適的系統(tǒng)平臺(tái)、數(shù)據(jù)庫平臺(tái)以及站點(diǎn)運(yùn)營模式,并且可避免在轉(zhuǎn)換服務(wù)商時(shí),因受制域名解析服務(wù)商而忍受效率低下的修改過程,全面利用花生殼來建立擁有自主域名和最大自主權(quán)的互聯(lián)網(wǎng)主機(jī)。 以下為花生殼嵌入式開發(fā)所需要的相關(guān)資源,通過開發(fā),您可以完成如同官方花生殼客戶端完全一樣的功能,甚至將花生殼動(dòng)態(tài)域名嵌入您的軟件、路由器乃至各種網(wǎng)絡(luò)設(shè)備。2. 官方認(rèn)證獲得官方認(rèn)證的軟硬件將被列入官方支持清單:支持清單具體步驟參見:花生殼嵌入申請獲得官方認(rèn)證前,您將需要簽訂相關(guān)合
4、作協(xié)議。3. 關(guān)于官方認(rèn)證Key的說明您在對產(chǎn)品進(jìn)行正式的發(fā)布前,需要執(zhí)行以下步驟:3.1. 從oray開發(fā)者平臺(tái) 注冊開發(fā)者,獲得App ID、App Secret、App Version:l App ID - 2個(gè)字節(jié)l App Version -2個(gè)字節(jié) l App Secret -4個(gè)字節(jié)注:網(wǎng)站上申請得到的App ID、App Secret、App Version是十進(jìn)制3.2. 服務(wù)器地址P3.3. App ID與App Version組合到4個(gè)字節(jié)的整數(shù),得到clientinfo 如0xFFFF為App ID,0xEEEE為App Version,則組合后為:0xFFFFEEEE
5、3.4. 用3.2步驟得到的clientinfo和App Secret 提交驗(yàn)證。(示例源碼中的PH_EMBED_CLIENT_INFO和PH_EMBED_CLIENT_KEY)4. 示例源碼我們提供一套已實(shí)現(xiàn)所有協(xié)議的規(guī)范代碼,您可以進(jìn)行任意傳播與使用,沒有任何協(xié)議限制。如果你發(fā)現(xiàn)本套代碼中存在需要修復(fù)的問題,請發(fā)送Email到:open4.1. 源碼清單文件說明main.c主入口函數(shù),一般修改該文件和phkey.h里的值就行了Makefile.amLinux編譯MakefilePHGlobal.c全局變量及公用函數(shù)實(shí)現(xiàn)phkey.hKey值定義PHGlobal.h程序用到的數(shù)據(jù)結(jié)構(gòu)的定義p
6、hupdate.cPHDDNS Embed網(wǎng)絡(luò)通信主過程phupdate.hbase64.c通用加密算法相關(guān)代碼bitstream.cbitstream.hblowfish.cblowfish.hglobal.hlutil.hmd5.cmd5.hgenerate.cDDNS嵌入式私有專用加密算法實(shí)現(xiàn),用于TCP主認(rèn)證過程,以及每個(gè)心跳包的加解密generate.hlog.c日志實(shí)現(xiàn)log.hPHSocket.cSOCKET封裝,支持TCP/UDPPHSocket.h4.2. 編譯4.2.1. windows編譯源碼壓縮包內(nèi)包含VC6工程文件,可在Windows上編譯測試,無其他依賴項(xiàng)4.2.2
7、. Linux(X86, ARM, MIPS)編譯過程:1、解壓縮#tar zxvf phddns-2.0.6.32828.tar.gz# cd phddns-2.0.6.328282、編譯前configure為當(dāng)前平臺(tái)編譯#./configure3、編譯最終可執(zhí)行文件#makeARM與MIPS交叉編譯:您需要首先安裝相關(guān)的交叉編譯器,相關(guān)工具鏈的安裝請參考開發(fā)板文檔,并執(zhí)行類似以下的編譯前configure#./configure -host=i386-linux -target=arm-linux-build=arm-linux CXX=arm-linux-c+ CC=arm-linux-
8、gcc LD=arm-linux-ld4.2.3. 運(yùn)行l(wèi) 直接運(yùn)行,根據(jù)提示進(jìn)行操作l featured.exe -h 有參數(shù)說明5. 源碼說明我們提供的源碼封裝了DDNS協(xié)議的解析,對外暴露結(jié)構(gòu)PHGlobal,只要往結(jié)構(gòu)里填入相關(guān)信息,即可實(shí)現(xiàn)一個(gè)簡單的客戶端。PHGlobal結(jié)構(gòu)說明參考源碼里的phglobal.h文件例子:簡單客戶端#include <stdio.h>#include <signal.h> #include "phruncall.h"#include "phupdate.h"#include "
9、log.h"#include "phkey.h"PHGlobal global;PH_parameter parameter;static void my_handleSIG (int sig)if (sig = SIGINT)printf ("signal = SIGINTn");phddns_stop(&global);exit(0);if (sig = SIGTERM)printf ("signal = SIGTERMn");phddns_stop(&global);signal (sig, my_ha
10、ndleSIG);/狀態(tài)更新回調(diào)static void myOnStatusChanged(PHGlobal* global, int status, long data)printf("myOnStatusChanged %s", convert_status_code(status);if (status = okKeepAliveRecved)printf(", IP: %d", data);if (status = okDomainsRegistered)printf(", UserType: %d", data);print
11、f("n");/域名注冊回調(diào)static void myOnDomainRegistered(PHGlobal* global, char *domain)printf("myOnDomainRegistered %sn", domain);/用戶信息XML數(shù)據(jù)回調(diào)static void myOnUserInfo(PHGlobal* global, char *userInfo, int len)printf("myOnUserInfo %sn", userInfo);/域名信息XML數(shù)據(jù)回調(diào)static void myOnAccou
12、ntDomainInfo(PHGlobal* global, char *domainInfo, int len)printf("myOnAccountDomainInfo %sn", domainInfo);int main(int argc, char *argv)void (*ohandler) (int);WORD VersionRequested;WSADATA WsaData;int error;VersionRequested = MAKEWORD(2, 0);WSAStartup(VersionRequested, &WsaData);ohandle
13、r = signal (SIGINT, my_handleSIG);if (ohandler != SIG_DFL) printf ("previous signal handler for SIGINT is not a default handlern");signal (SIGINT, ohandler);init_global(&global);global.cbOnStatusChanged = myOnStatusChanged;global.cbOnDomainRegistered = myOnDomainRegistered;global.cbOnU
14、serInfo = myOnUserInfo;global.cbOnAccountDomainInfo = myOnAccountDomainInfo;set_default_callback(&global);strcpy(global.szHost,"");strcpy(global.szUserID,"youname");strcpy(global.szUserPWD,"youpassword");global.clientinfo = PH_EMBED_CLIENT_INFO;global.challengekey =
15、 PH_EMBED_CLIENT_KEY;for (;)int next = phddns_step(&global);sleep(next);phddns_stop(&global);return 0;6. 關(guān)于客戶端界面客戶端界面一般包含登陸、登錄后的狀態(tài)顯示、介紹三個(gè)頁面。我們提供了一套界面模板供參考。模板代碼在源碼包UI目錄下。登錄界面:登錄后的狀態(tài)顯示界面:介紹界面:7. DDNS協(xié)議說明動(dòng)態(tài)主機(jī)注冊協(xié)議提供一種將域名和動(dòng)態(tài)IP地址綁定的方法,允許客戶機(jī)將自己的IP地址提交給服務(wù)器,并選擇希望注冊的域名記錄,服務(wù)器確認(rèn)客戶機(jī)擁有該域名的權(quán)限,并修改DNS相應(yīng)記錄,在客
16、戶機(jī)在線的情況下維持這些動(dòng)態(tài)注冊的域名,并且在客戶機(jī)離線自動(dòng)刪除動(dòng)態(tài)注冊的域名。DDNS協(xié)議包含TCP認(rèn)證和UDP保持兩部分7.1. TCP認(rèn)證部分7.1.1. 賬號(hào)認(rèn)證客戶機(jī)必須通過賬號(hào)驗(yàn)證才能進(jìn)行域名申請、修改、注冊操作。賬號(hào)驗(yàn)證必須在服務(wù)器的就緒狀態(tài)下進(jìn)行。在其他狀態(tài)下客戶機(jī)發(fā)出賬號(hào)驗(yàn)證請求服務(wù)器都返回 503命令順序錯(cuò)誤的回應(yīng)。驗(yàn)證過程如下:客戶機(jī)發(fā)出AUTH authtype指令,authtype為一種驗(yàn)證類型,我們這里使用AUTH ROUTER6(CRAM-MD5擴(kuò)展)驗(yàn)證。 服務(wù)器回應(yīng)一個(gè)挑戰(zhàn)串,該串使用客戶機(jī)的IP地址、服務(wù)器的當(dāng)前時(shí)間等不可重復(fù)不可預(yù)測的參數(shù)生成,服務(wù)器使用B
17、ASE64方式將該串返回客戶機(jī),回應(yīng)碼為334 “客戶機(jī)將挑戰(zhàn)串作為key使用CRAM-MD5的單向加密方式加密自己的密碼形成加密串,將賬號(hào)和加密串座位回應(yīng),其格式為:“賬號(hào)名+一個(gè)空格+加密嵌入認(rèn)證碼+客戶端信息+加密串”。其中加密嵌入認(rèn)證碼工4個(gè)字節(jié),為嵌入認(rèn)證碼與服務(wù)器當(dāng)前時(shí)間運(yùn)算得到,服務(wù)器時(shí)間是挑戰(zhàn)串的第六個(gè)字節(jié)后的4個(gè)字節(jié),算法是嵌入認(rèn)證碼與該時(shí)間的去翻進(jìn)或運(yùn)算后循環(huán)右移一定位數(shù):該右移位數(shù)是用服務(wù)器時(shí)間整除30,客戶端信息也是4個(gè)字節(jié),前兩節(jié)為嵌入式的客戶號(hào),后兩位為客戶端版本號(hào),客戶機(jī)使用base64方式對回應(yīng)進(jìn)行編碼返回服務(wù)器?!币陨险f明對應(yīng)的代碼:int GenerateC
18、rypt(char *szUser, char *szPassword, char *szChallenge64, long clientinfo, long embkey,char *szResult)unsigned char szDecoded256;unsigned char szKey256;unsigned char szAscii256; unsigned int nDecodedLen;long challengetime = 0;int nMoveBits;long challengetime_new = 0;long a, b, c, d;unsigned int nKey
19、;int nUser;unsigned int nEncoded; /Base64 解碼nDecodedLen = lutil_b64_pton(szChallenge64, szDecoded, 256);memcpy(&challengetime, szDecoded + 6, 4); /取反進(jìn)行或運(yùn)算challengetime |= embkey; /得到循環(huán)移位位數(shù)nMoveBits = challengetime % 30; /完成32位的循環(huán)位移a = challengetime << (32 - nMoveBits) % 32);b = challengeti
20、me >> (unsigned int )nMoveBits) % 32);c = (0xffffffff << (32 - nMoveBits) % 32);d = b & c;challengetime_new = a | d; /KEY-MD5nKey = KeyMD5Encode(szKey, (unsigned char*)szPassword, strlen(char*)szPassword), (unsigned char*)szDecoded, nDecodedLen);szKeynKey = 0; nUser = strlen(char *)s
21、zUser);memcpy(szAscii, szUser, nUser);szAsciinUser = ' 'memcpy(szAscii+nUser+1, &challengetime_new,4);memcpy(szAscii+nUser+1+4,&clientinfo,4);memcpy(szAscii+nUser+1+4+4, szKey, nKey);/base64 編碼nEncoded = lutil_b64_ntop(unsigned char *)szAscii, nUser + 1 + 4 + 4 + nKey, szResult, 256)
22、;return nEncoded;服務(wù)器驗(yàn)證客戶的回應(yīng),如果賬號(hào)和密碼錯(cuò)誤則返回535,如果正確則返回一個(gè)多行回應(yīng),第一行為250,以后每行為該賬號(hào)已經(jīng)注冊的主機(jī)記錄。如果該賬號(hào)沒有注冊任何記錄則返回250<CRLF>.<CRLF>。 驗(yàn)證成功后服務(wù)器進(jìn)入驗(yàn)證狀態(tài)(Auth)。例子1:成功登陸C:AUTH ROUTER6S:334 UghjtYsdyu=C:awerasdfhjkloiuyqwertyuioS:250 Auth passed at level <1> .其中,<1>中的數(shù)字表示用戶級(jí)別:從0開始,分別為:0 標(biāo)準(zhǔn)級(jí)1 專業(yè)級(jí)2 商
23、業(yè)級(jí)3 旗艦級(jí)例子2:不成功登陸C:AUTH ROUTERS:334 UghjtYsdyu=C:awerasdfhjkloiujqwertyuioS:535 Authentication failure.例子3:驗(yàn)證格式不正確C:AUTH foobarS:504 Authentication mechanism unsupported7.1.2. 服務(wù)器跳轉(zhuǎn)在以上的帳戶驗(yàn)證過程中,如果服務(wù)器發(fā)現(xiàn)該帳號(hào)不應(yīng)該在本臺(tái)服務(wù)器登陸,將返回需要跳轉(zhuǎn)字串536 Should Redirection例子:C:建立6060連接S:220 DDNS ServerX4 Ready.C:AUTH ROUTER6S:
24、334 UghjtYsdyu=C:awerasdfhjkloiuyqwertyuioS: 536 Should Redirection To <>C:QUITS:221 Good bye此時(shí),客戶端應(yīng)重新連接到:7.1.3. 注冊域名在驗(yàn)證狀態(tài)下客戶機(jī)可以選擇注冊域名,客戶機(jī)使用REGI命令注冊,最后使用CNFM確認(rèn)注冊操作獲取注冊碼,完成注冊工作。一般要求要注冊賬號(hào)下的全部域名,否則不注冊的域名無法解析。例子:C:REGI A S:250 register successfullyC:CNFMS:250 00123456 012381090在一次會(huì)話中客戶機(jī)只能執(zhí)行一次注冊動(dòng)作,
25、一次注冊動(dòng)作可以注冊或撤銷注冊多個(gè)名稱。如果客戶機(jī)在CNFM指令成功后再次使用REGI或CNFM服務(wù)器將返回命令順序出錯(cuò)。 發(fā)出CNFM指令后,得到的回應(yīng)碼后的字符串分別為更新協(xié)議使用的會(huì)話ID和初始序號(hào)。如果客戶機(jī)在一次在線過程中多次連接并注冊主機(jī)則使用最新的注冊碼。l 會(huì)話編號(hào)為非0的有符號(hào)長整數(shù),使用十進(jìn)制表示。l 初始序號(hào)為非0的無符號(hào)長整數(shù),使用十進(jìn)制表示。如果沒有成功動(dòng)態(tài)注冊域名則服務(wù)器返回507 no name registered. REGI指令和CNFM指令支持批命令方式發(fā)送,也就是客戶端可以連續(xù)發(fā)送若干條REGI指令并以一條CNFM指令結(jié)尾。中間使用CRLF隔開,服務(wù)器會(huì)按
26、順序批量回應(yīng)所有的REGI指令和CNFM指令,每個(gè)回應(yīng)同樣使用CRLF隔開。7.1.4. 獲取域名信息在驗(yàn)證狀態(tài)下客戶機(jī)可以選擇獲取該帳號(hào)的域名清單,命令格式為:STAT DOMAINrn,服務(wù)器第一行返回250 DomainInfo OK,后接XML格式的域名清單,以CRLF.CRLF結(jié)尾。例子:C:STAT DOMAINS:250 DomainInfo OK<domainInfo account='test' login='test'> <domains><domain><DomainName></Dom
27、ainName> <RegDate>1246419992</RegDate> <Account>test</Account> <StatusCode>25</StatusCode><RootName></RootName><IsFree>1</IsFree></domain></domains><domainInfo>C: QUITS:221 Good bye7.1.5. 獲取用戶信息在驗(yàn)證狀態(tài)下客戶機(jī)可以選擇獲取用戶信息,命令格式為
28、:STAT USERrn,服務(wù)器第一行返回250 Userinfo OK,后接XML格式的用戶數(shù)據(jù),以CRLF.CRLF結(jié)尾。例子:C:STAT USERS:250 Userinfo OK<userInfo account='test' login='test'> <ID>88888</ID> <Account>test</Account> <Password></Password> <Email>test</Email> <RegDate>1
29、246419991</RegDate> <Credit>0.0</Credit><Largess>0.0</Largess> <IsEnable></IsEnable> <PHServer></PHServer> <PWDQuestion></PWDQuestion><IsEnterprise>0</IsEnterprise> <Contactor></Contactor> <IsMale>0</I
30、sMale> <Address></Address><PostCode>200000</PostCode><IDType></IDType> <IDNumber>lt;/IDNumber> <Country>cn</Country> <Province></Province><City></City> <Tel>34333333</Tel><ServiceTyp
31、e>0</ServiceType> <ClientIP>-1301289100</ClientIP></userInfo>C: QUITS:221 Good bye7.2. UDP保持部分在完成TCP登陸和注冊過程后,客戶端就需要斷開TCP連接,進(jìn)入長期的“心跳保持”狀態(tài)。 心跳保持協(xié)議使用UDP 6060端口,客戶機(jī)必須按規(guī)定的時(shí)間隔定時(shí)向服務(wù)器發(fā)送更新數(shù)據(jù)包,如果服務(wù)器在5分鐘內(nèi)沒有收到客戶機(jī)的更新請求將自動(dòng)刪除該客戶的所有注冊的域名。7.2.1. 心跳包協(xié)議客戶端使用TCP過程中后獲得的挑戰(zhàn)串加密操作碼、序號(hào)和校驗(yàn)碼連同TCP過程中完
32、成域名注冊后的會(huì)話編號(hào)發(fā)送給服務(wù)器。如果沒有錯(cuò)誤服務(wù)器回應(yīng)正常UDP_OPCODE_UPDATE_OK,否則服務(wù)器回應(yīng)更新失敗信息UDP_OPCODE_UPDATE_ERROR,此時(shí)客戶端必須重新登錄并注冊域名。如果客戶機(jī)3分鐘內(nèi)沒有收到服務(wù)器得回應(yīng)則判斷網(wǎng)絡(luò)連接出現(xiàn)問題。但在沒有程序錯(cuò)誤的時(shí)候繼續(xù)發(fā)送更新信息。所有操作,客戶端都發(fā)送同樣結(jié)構(gòu)與大小的數(shù)據(jù)包:struct DATA_KEEPALIVE /! 會(huì)話ID ,注冊域名成功后返回的會(huì)話ID int lChatID; /! 操作碼 參考后面的define值 Int lOpCode; /! 包ID ,注冊域名成功后返回的起始序號(hào)/! 客戶機(jī)
33、每成功發(fā)送一次更新信息后,序號(hào)加1 Int lID; /! 校驗(yàn)和 計(jì)算方法為:0-(包ID+操作碼) Int lSum; /! 保留字,目前不使用 Int lReserved; ;/! 更新包擴(kuò)展結(jié)構(gòu),用于服務(wù)器返回時(shí)IP地址typedef struct DATA_KEEPALIVE keepalive;Int ip; DATA_KEEPALIVE_EXT; /! 心跳包更新指令 #define UDP_OPCODE_UPDATE_VER2 0x2010 /! 心跳包服務(wù)器返回正常 #define UDP_OPCODE_UPDATE_OK 0x2050 /! 心跳包服務(wù)器返回錯(cuò)誤 #defi
34、ne UDP_OPCODE_UPDATE_ERROR 1000 /! 心跳包注銷登錄 #define UDP_OPCODE_LOGOUT 11 /! 心跳包加密部分大小 #define KEEPALIVE_PACKET_LEN 20每次發(fā)送都需要將該數(shù)據(jù)報(bào)加密,客戶端使用TCP過程中后獲得的挑戰(zhàn)串加密操作碼、序號(hào)和校驗(yàn)碼連同TCP過程中完成域名注冊后的會(huì)話ID發(fā)送給服務(wù)器。其中,會(huì)話ID和序號(hào)為注冊域名成功后返回的會(huì)話ID和起始序號(hào),客戶機(jī)每成功發(fā)送一次更新信息,序號(hào)加1。校驗(yàn)碼計(jì)算方法為:0-(包ID+操作碼)加密與發(fā)送過程代碼段:BOOL SendKeepAlive(PHGlobal *p
35、hglobal, int opCode) DATA_KEEPALIVE data; blf_ctx blf; char p1KEEPALIVE_PACKET_LEN,p2KEEPALIVE_PACKET_LEN; memset(&data,0,sizeof(data); data.lChatID = phglobal->nChatID; data.lID = phglobal->nStartID; data.lOpCode = opCode; data.lSum = 0 - (data.lID + data.lOpCode);data.lReserved = 0; if (
36、!phglobal->bTcpUpdateSuccessed) return FALSE; LOG(1) ("SendKeepAlive() %dn",opCode); InitBlowfish(&blf, (unsigned char*)phglobal->szChallenge,phglobal->nChallengeLen); memcpy(p1,&data,KEEPALIVE_PACKET_LEN);memcpy(p2,&data,KEEPALIVE_PACKET_LEN); Blowfish_EnCode(&blf
37、, p1+4,p2+4,KEEPALIVE_PACKET_LEN-4); phSend(phglobal->m_udpsocket, p2, KEEPALIVE_PACKET_LEN,0); /RecvKeepaliveResponse(); return TRUE; 數(shù)據(jù)包接受與解碼過程代碼段:int RecvKeepaliveResponse(PHGlobal *phglobal) char temp100;DATA_KEEPALIVE_EXT rdata; DATA_KEEPALIVE data; blf_ctx blf; char p1KEEPALIVE_PACKET_LEN,p2KEEPALIVE_PACKET_LEN; if (!phglobal->bTcpUpdateSuccessed) return errorOccupyReconnect; /prevent the thread to be suspended while waiting for dataif (phDataReadable(phglobal
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版智能航運(yùn)物流船運(yùn)輸合作協(xié)議合同2篇
- 二零二五年測繪數(shù)據(jù)處理與分析合同范本3篇
- 二零二五年特種花卉種子采購合同范本3篇
- 二零二五版商業(yè)街區(qū)保安臨時(shí)工勞動(dòng)合同示范文本3篇
- 二零二五版生態(tài)農(nóng)業(yè)基地種植分包合同3篇
- 河北省二零二五年度二手房買賣合同附帶專業(yè)拆除及清理服務(wù)3篇
- 二零二五年度車輛過戶手續(xù)代理合同3篇
- 二零二五版汽車制造專用管子配件供應(yīng)合同3篇
- 二零二五年度酒店食堂承包服務(wù)合同范本3篇
- 二零二五年度礦業(yè)風(fēng)險(xiǎn)評估與風(fēng)險(xiǎn)管理合同2篇
- 割接方案的要點(diǎn)、難點(diǎn)及采取的相應(yīng)措施
- 2025年副護(hù)士長競聘演講稿(3篇)
- 2025至2031年中國臺(tái)式燃?xì)庠钚袠I(yè)投資前景及策略咨詢研究報(bào)告
- 原發(fā)性腎病綜合征護(hù)理
- 第三章第一節(jié)《多變的天氣》說課稿2023-2024學(xué)年人教版地理七年級(jí)上冊
- 2025年中國電科集團(tuán)春季招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年度建筑施工現(xiàn)場安全管理合同2篇
- 建筑垃圾回收利用標(biāo)準(zhǔn)方案
- 福建省廈門市2023-2024學(xué)年高二上學(xué)期期末考試語文試題(解析版)
- 分子標(biāo)記及遺傳連鎖圖譜
- 防火墻施工組織設(shè)計(jì)
評論
0/150
提交評論