




已閱讀5頁(yè),還剩20頁(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)介
異步套接字 分類: VC 2012-03-31 10:54 422人閱讀 評(píng)論(0) 收藏 舉報(bào) 一、TCP/IP 體系結(jié)構(gòu)與特點(diǎn)1、TCP/IP體系結(jié)構(gòu)TCP/IP協(xié)議實(shí)際上就是在物理網(wǎng)上的一組完整的網(wǎng)絡(luò)協(xié)議。其中TCP是提供傳輸層服務(wù),而IP則是提供網(wǎng)絡(luò)層服務(wù)。TCP/IP包括以下協(xié)議:(結(jié)構(gòu)如圖1.1)(圖1.1)IP: 網(wǎng)間協(xié)議(Internet Protocol) 負(fù)責(zé)主機(jī)間數(shù)據(jù)的路由和網(wǎng)絡(luò)上數(shù)據(jù)的存儲(chǔ)。同時(shí)為ICMP,TCP,UDP提供分組發(fā)送服務(wù)。用戶進(jìn)程通常不需要涉及這一層。ARP: 地址解析協(xié)議(Address Resolution Protocol)此協(xié)議將網(wǎng)絡(luò)地址映射到硬件地址。RARP: 反向地址解析協(xié)議(Reverse Address Resolution Protocol)此協(xié)議將硬件地址映射到網(wǎng)絡(luò)地址ICMP: 網(wǎng)間報(bào)文控制協(xié)議(Internet Control Message Protocol)此協(xié)議處理信關(guān)和主機(jī)的差錯(cuò)和傳送控制。TCP: 傳送控制協(xié)議(Transmission Control Protocol)這是一種提供給用戶進(jìn)程的可靠的全雙工字節(jié)流面向連接的協(xié)議。它要為用戶進(jìn)程提供虛電路服務(wù),并為數(shù)據(jù)可靠傳輸建立檢查。(注:大多數(shù)網(wǎng)絡(luò)用戶程序使用TCP)UDP: 用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol)這是提供給用戶進(jìn)程的無(wú)連接協(xié)議,用于傳送數(shù)據(jù)而不執(zhí)行正確性檢查。FTP: 文件傳輸協(xié)議(File Transfer Protocol)允許用戶以文件操作的方式(文件的增、刪、改、查、傳送等)與另一主機(jī)相互通信。SMTP: 簡(jiǎn)單郵件傳送協(xié)議(Simple Mail Transfer Protocol)SMTP協(xié)議為系統(tǒng)之間傳送電子郵件。TELNET:終端協(xié)議(Telnet Terminal Procotol)允許用戶以虛終端方式訪問(wèn)遠(yuǎn)程主機(jī)HTTP: 超文本傳輸協(xié)議(Hypertext Transfer Procotol)TFTP: 簡(jiǎn)單文件傳輸協(xié)議(Trivial File Transfer Protocol)2、TCP/IP特點(diǎn)TCP/IP協(xié)議的核心部分是傳輸層協(xié)議(TCP、UDP),網(wǎng)絡(luò)層協(xié)議(IP)和物理接口層,這三層通常是在操作系統(tǒng)內(nèi)核中實(shí)現(xiàn)。因此用戶一般不涉及。編程時(shí),編程界面有兩種形式:一、是由內(nèi)核心直接提供的系統(tǒng)調(diào)用;二、使用以庫(kù)函數(shù)方式提供的各種函數(shù)。前者為核內(nèi)實(shí)現(xiàn),后者為核外實(shí)現(xiàn)。用戶服務(wù)要通過(guò)核外的應(yīng)用程序才能實(shí)現(xiàn),所以要使用套接字(socket)來(lái)實(shí)現(xiàn)。圖1.2是TCP/IP協(xié)議核心與應(yīng)用程序關(guān)系圖。(圖1.2)二、專用術(shù)語(yǔ)1、套接字套接字是網(wǎng)絡(luò)的基本構(gòu)件。它是可以被命名和尋址的通信端點(diǎn),使用中的每一個(gè)套接字都有其類型和一個(gè)與之相連聽(tīng)進(jìn)程。套接字存在通信區(qū)域(通信區(qū)域又稱地址簇)中。套接字只與同一區(qū)域中的套接字交換數(shù)據(jù)(跨區(qū)域時(shí),需要執(zhí)行某和轉(zhuǎn)換進(jìn)程才能實(shí)現(xiàn))。WINDOWS 中的套接字只支持一個(gè)域網(wǎng)際域。套接字具有類型。WINDOWS SOCKET 1.1 版本支持兩種套接字:流套接字(SOCK_STREAM)和數(shù)據(jù)報(bào)套接字(SOCK_DGRAM) 2、WINDOWS SOCKETS 實(shí)現(xiàn)一個(gè)WINDOWS SOCKETS 實(shí)現(xiàn)是指實(shí)現(xiàn)了WINDOWS SOCKETS規(guī)范所描述的全部功能的一套軟件。一般通過(guò)DLL文件來(lái)實(shí)現(xiàn)3、阻塞處理例程阻塞處理例程(blocking hook,阻塞鉤子)是WINDOWS SOCKETS實(shí)現(xiàn)為了支持阻塞套接字函數(shù)調(diào)用而提供的一種機(jī)制。4、多址廣播(multicast,多點(diǎn)傳送或組播)是一種一對(duì)多的傳輸方式,傳輸發(fā)起者通過(guò)一次傳輸就將信息傳送到一組接收者,與單點(diǎn)傳送(unicast)和廣播(Broadcast)相對(duì)應(yīng)。一、客戶機(jī)/服務(wù)器模式在TCP/IP網(wǎng)絡(luò)中兩個(gè)進(jìn)程間的相互作用的主機(jī)模式是客戶機(jī)/服務(wù)器模式(Client/Server model)。該模式的建立基于以下兩點(diǎn):1、非對(duì)等作用;2、通信完全是異步的??蛻魴C(jī)/服務(wù)器模式在操作過(guò)程中采取的是主動(dòng)請(qǐng)示方式:首先服務(wù)器方要先啟動(dòng),并根據(jù)請(qǐng)示提供相應(yīng)服務(wù):(過(guò)程如下)1、打開(kāi)一通信通道并告知本地主機(jī),它愿意在某一個(gè)公認(rèn)地址上接收客戶請(qǐng)求。2、等待客戶請(qǐng)求到達(dá)該端口。3、接收到重復(fù)服務(wù)請(qǐng)求,處理該請(qǐng)求并發(fā)送應(yīng)答信號(hào)。4、返回第二步,等待另一客戶請(qǐng)求5、關(guān)閉服務(wù)器??蛻舴剑?、打開(kāi)一通信通道,并連接到服務(wù)器所在主機(jī)的特定端口。2、向服務(wù)器發(fā)送服務(wù)請(qǐng)求報(bào)文,等待并接收應(yīng)答;繼續(xù)提出請(qǐng)求3、請(qǐng)求結(jié)束后關(guān)閉通信通道并終止。二、基本套接字為了更好說(shuō)明套接字編程原理,給出幾個(gè)基本的套接字,在以后的篇幅中會(huì)給出更詳細(xì)的使用說(shuō)明。1、創(chuàng)建套接字socket()功能:使用前創(chuàng)建一個(gè)新的套接字格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);參數(shù):af: 通信發(fā)生的區(qū)域type: 要建立的套接字類型procotol: 使用的特定協(xié)議2、指定本地地址bind()功能:將套接字地址與所創(chuàng)建的套接字號(hào)聯(lián)系起來(lái)。格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);參數(shù):s: 是由socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號(hào))。其它:沒(méi)有錯(cuò)誤,bind()返回0,否則SOCKET_ERROR地址結(jié)構(gòu)說(shuō)明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16位端口號(hào),網(wǎng)絡(luò)字節(jié)順序struct in_addr sin_addr;/32位IP地址,網(wǎng)絡(luò)字節(jié)順序char sin_zero8;/保留3、建立套接字連接connect()和accept()功能:共同完成連接工作格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);參數(shù):同上4、監(jiān)聽(tīng)連接listen()功能:用于面向連接服務(wù)器,表明它愿意接收連接。格式:int PASCAL FAR listen(SOCKET s, int backlog);5、數(shù)據(jù)傳輸send()與recv()功能:數(shù)據(jù)的發(fā)送與接收格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);參數(shù):buf:指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。 6、多路復(fù)用select()功能:用來(lái)檢測(cè)一個(gè)或多個(gè)套接字狀態(tài)。格式:int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout);參數(shù):readfds:指向要做讀檢測(cè)的指針writefds:指向要做寫檢測(cè)的指針exceptfds:指向要檢測(cè)是否出錯(cuò)的指針timeout:最大等待時(shí)間7、關(guān)閉套接字closesocket()功能:關(guān)閉套接字s格式:BOOL PASCAL FAR closesocket(SOCKET s);三、典型過(guò)程圖2.1 面向連接的套接字的系統(tǒng)調(diào)用時(shí)序圖2.2 無(wú)連接協(xié)議的套接字調(diào)用時(shí)序圖 2.3 面向連接的應(yīng)用程序流程圖Windows Socket 程序設(shè)計(jì)一、簡(jiǎn)介Windows Sockets 是從 Berkeley Sockets 擴(kuò)展而來(lái)的,其在繼承 Berkeley Sockets 的基礎(chǔ)上,又進(jìn)行了新的擴(kuò)充。這些擴(kuò)充主要是提供了一些異步函數(shù),并增加了符合WINDOWS消息驅(qū)動(dòng)特性的網(wǎng)絡(luò)事件異步選擇機(jī)制。Windows Sockets由兩部分組成:開(kāi)發(fā)組件和運(yùn)行組件。開(kāi)發(fā)組件:Windows Sockets 實(shí)現(xiàn)文檔、應(yīng)用程序接口(API)引入庫(kù)和一些頭文件。運(yùn)行組件:Windows Sockets 應(yīng)用程序接口的動(dòng)態(tài)鏈接庫(kù)(WINSOCK.DLL)。二、主要擴(kuò)充說(shuō)明1、異步選擇機(jī)制:Windows Sockets 的異步選擇函數(shù)提供了消息機(jī)制的網(wǎng)絡(luò)事件選擇,當(dāng)使用它登記網(wǎng)絡(luò)事件發(fā)生時(shí),應(yīng)用程序相應(yīng)窗口函數(shù)將收到一個(gè)消息,消息中指示了發(fā)生的網(wǎng)絡(luò)事件,以及與事件相關(guān)的一些信息。Windows Sockets 提供了一個(gè)異步選擇函數(shù) WSAAsyncSelect(),用它來(lái)注冊(cè)應(yīng)用程序感興趣的網(wǎng)絡(luò)事件,當(dāng)這些事件發(fā)生時(shí),應(yīng)用程序相應(yīng)的窗口函數(shù)將收到一個(gè)消息。函數(shù)結(jié)構(gòu)如下:int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);參數(shù)說(shuō)明:hWnd:窗口句柄wMsg:需要發(fā)送的消息lEvent:事件(以下為事件的內(nèi)容)值:含義:FD_READ期望在套接字上收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接到通知FD_WRITE期望在套接字上可發(fā)送數(shù)據(jù)(即寫準(zhǔn)備好)時(shí)接到通知FD_OOB期望在套接字上有帶外數(shù)據(jù)到達(dá)時(shí)接到通知FD_ACCEPT期望在套接字上有外來(lái)連接時(shí)接到通知FD_CONNECT期望在套接字連接建立完成時(shí)接到通知FD_CLOSE期望在套接字關(guān)閉時(shí)接到通知例如:我們要在套接字讀準(zhǔn)備好或?qū)憸?zhǔn)備好時(shí)接到通知,語(yǔ)句如下:rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);如果我們需要注銷對(duì)套接字網(wǎng)絡(luò)事件的消息發(fā)送,只要將 lEvent 設(shè)置為02、異步請(qǐng)求函數(shù)在 Berkeley Sockets 中請(qǐng)求服務(wù)是阻塞的,WINDOWS SICKETS 除了支持這一類函數(shù)外,還增加了相應(yīng)的異步請(qǐng)求函數(shù)(WSAAsyncGetXByY();)。 3、阻塞處理方法Windows Sockets 為了實(shí)現(xiàn)當(dāng)一個(gè)應(yīng)用程序的套接字調(diào)用處于阻塞時(shí),能夠放棄CPU讓其它應(yīng)用程序運(yùn)行,它在調(diào)用處于阻塞時(shí)便進(jìn)入一個(gè)叫“HOOK”的例程,此例程負(fù)責(zé)接收和分配WINDOWS消息,使得其它應(yīng)用程序仍然能夠接收到自己的消息并取得控制權(quán)。WINDOWS 是非搶先的多任務(wù)環(huán)境,即若一個(gè)程序不主動(dòng)放棄其控制權(quán),別的程序就不能執(zhí)行。因此在設(shè)計(jì)Windows Sockets 程序時(shí),盡管系統(tǒng)支持阻塞操作,但還是反對(duì)程序員使用該操作。但由于 SUN 公司下的 Berkeley Sockets 的套接字默認(rèn)操作是阻塞的,WINDOWS 作為移植的 SOCKETS 也不可避免對(duì)這個(gè)操作支持。在Windows Sockets 實(shí)現(xiàn)中,對(duì)于不能立即完成的阻塞操作做如下處理:DLL初始化循環(huán)操作。在循環(huán)中,它發(fā)送任何 WINDOWS 消息,并檢查這個(gè) Windows Sockets 調(diào)用是否完成,在必要時(shí),它可以放棄CPU讓其它應(yīng)用程序執(zhí)行(當(dāng)然使用超線程的CPU就不會(huì)有這個(gè)麻煩了_)。我們可以調(diào)用 WSACancelBlockingCall() 函數(shù)取消此阻塞操作。在 Windows Sockets 中,有一個(gè)默認(rèn)的阻塞處理例程 BlockingHook() 簡(jiǎn)單地獲取并發(fā)送 WINDOWS 消息。如果要對(duì)復(fù)雜程序進(jìn)行處理,Windows Sockets 中還有 WSASetBlockingHook() 提供用戶安裝自己的阻塞處理例程能力;與該函數(shù)相對(duì)應(yīng)的則是 SWAUnhookBlockingHook(),它用于刪除先前安裝的任何阻塞處理例程,并重新安裝默認(rèn)的處理例程。請(qǐng)注意,設(shè)計(jì)自己的阻塞處理例程時(shí),除了函數(shù) WSACancelBlockingHook() 之外,它不能使用其它的 Windows Sockets API 函數(shù)。在處理例程中調(diào)用 WSACancelBlockingHook()函數(shù)將取消處于阻塞的操作,它將結(jié)束阻塞循環(huán)。4、出錯(cuò)處理Windows Sockets 為了和以后多線程環(huán)境(WINDOWS/UNIX)兼容,它提供了兩個(gè)出錯(cuò)處理函數(shù)來(lái)獲取和設(shè)置當(dāng)前線程的最近錯(cuò)誤號(hào)。(WSAGetLastEror()和WSASetLastError())5、啟動(dòng)與終止使用函數(shù) WSAStartup() 和 WSACleanup() 啟動(dòng)和終止套接字。來(lái)自網(wǎng)絡(luò)實(shí)例static void* listenconnect(void* param)int sockfd = socket (PF_UNIX, SOCK_SEQPACKET, 0); /創(chuàng)建本地套接字fcntl(sockfd, F_SETFL, O_NONBLOCK);sockaddr_un myaddr;memset (&myaddr, 0, sizeof(myaddr);myaddr.sun_family = PF_UNIX;strcpy (myaddr.sun_path, /brainaire_nvr/trans_serv/socket); /套接字的名字,任意取myaddr.sun_path0 = 0;bind (sockfd, (struct sockaddr*)&myaddr, sizeof(myaddr); /將套接字與它的名字綁定listen(sockfd, 50);fd_set watchset, listenset, clientset;FD_ZERO(&clientset);FD_ZERO(&watchset);FD_ZERO(&listenset);FD_SET(sockfd, &listenset);int max_listen = sockfd + 1;int max_client = 0; while (!process_exit) watchset = listenset; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 1000; if (select(max_listen, &watchset, NULL, NULL, &tv) 0 & FD_ISSET(sockfd, &watchset) struct sockaddr addr; socklen_t len; int clientfd = accept(sockfd, &addr, &len); if (clientfd = max_client) max_client = clientfd + 1; FD_SET(clientfd, &clientset); watchset = clientset; tv.tv_sec = 0; tv.tv_usec = 1000; int ret = select(max_client, &watchset, NULL, NULL, &tv); if (ret 0) for (int clientfd = max_client - 1; clientfd 0; clientfd-) int flags = 0; char buffBUFSIZ; int len; if (FD_ISSET(clientfd, &watchset) len = recv(clientfd, buff, sizeof(buff), flags); if (len = 0) FD_CLR(clientfd, &clientset); fprintf(stderr, nvradmin client socket %d closed.n, clientfd); close(clientfd); if (clientfd = max_client - 1) max_client -; else bool monitorworking = false; bufflen = 0; int monitorID = atoi(buff); if (monitorID != 0) MyRW_Lock mylock(&monitorlock);#if THREAD_NUM list& monitors = monitorslistsmonitorID%THREAD_NUM;#endif for (list:iterator intr = monitors.begin(); intr != monitors.end(); intr +) MonitorDaemon m_daemon = *intr; if (m_daemon.monitor = NULL) break; if (m_daemon.monitor-Id() = monitorID) fprintf(stderr, nvradmin Start Transmitting RealPlay Data to client socket %dn, clientfd); monitorworking = (0 = m_daemon.monitor-StartTransData(clientfd); else fprintf(stderr, nvradmin Received Msgs: len %d, content: %sn, len, buff); if(!monitorworking) FD_CLR(clientfd, &clientset); fprintf(stderr, nvradmin Cannot Start Tranmitting, client Socket %d Closed.n, clientfd); close(clientfd); if (clientfd = max_client - 1) max_client -; if(ret m_pMainWnd;pDlg- m_MSGS.InsertString(0,m_szBuffer);memset(m_szBuffer,0,sizeof(m_szBuffer);CAsyncSocket:OnReceive(nErrorCode);void MySock:OnSend(int nErrorCode) Send(m_szBuffer,m_nLength,0);m_nLength=0;memset(m_szBuffer,0,sizeof(m_szBuffer);/繼續(xù)提請(qǐng)一個(gè)“讀”的網(wǎng)絡(luò)事件,接收Server消息AsyncSelect(FD_READ);CAsyncSocket:OnSend(nErrorCode);void MySock:OnConnect(int nErrorCode) if (nErrorCode=0) m_bConnected=TRUE; CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp(); CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- m_pMainWnd; memcpy(m_szBuffer,Connected to ,13); strncat(m_szBuffer,pDlg- m_szServerAdr, sizeof(pDlg- m_szServerAdr); pDlg- m_MSGS.InsertString(0,m_szBuffer); AsyncSelect(FD_READ); /提請(qǐng)一個(gè)“讀”的網(wǎng)絡(luò)事件,準(zhǔn)備接收CAsyncSocket:OnConnect(nErrorCode);- 7 新建對(duì)話框IDD_Addr,用來(lái)輸入IP地址和Port;生成新類CAddrDlg。增加兩個(gè)Edit控件:IDC_Addr、IDC_Port按下表在ClassWizard中為CAddrDlg類添加變量。Control ID Type MemberIDC_Addr CString m_AddrIDC_Port Int m_Port- 8 在CSockClientDlg.h中添加代碼#include AddrDlg.hprotected:int TryCount;MySock m_clientSocket;UINT m_szPort;public:char m_szServerAdr256;- 9 雙擊IDD_CSOCKCLIENT_DIALOG對(duì)話框中的“連接”按鈕,添加以下代碼void CCSockClientDlg:OnConnect() m_clientSocket.ShutDown(2);m_clientSocket.m_hSocket=INVALID_SOCKET;m_clientSocket.m_bConnected=FALSE;CAddrDlg m_Dlg;/默認(rèn)端口1088m_Dlg.m_Port=1088;if (m_Dlg.DoModal()=IDOK & !m_Dlg.m_Addr.IsEmpty() memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr); m_szPort=m_Dlg.m_Port; /建立計(jì)時(shí)器,每1秒嘗試連接一次,直到連上或TryCount10SetTimer(1,1000,NULL); TryCount=0;- 10 添加Windows消息WM_TIMER響應(yīng)函數(shù)OnTimervoid CCSockClientDlg:OnTimer(UINT nIDEvent) if (m_clientSocket.m_hSocket=INVALID_SOCKET) BOOL bFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT); if(!bFlag) AfxMessageBox(Socket Error!); m_clientSocket.Close(); PostQuitMessage(0); return; m_clientSocket.Connect(m_szServerAdr,m_szPort);TryCount+;if (TryCount =10 | m_clientSocket.m_bConnected) KillTimer(1); if (TryCount =10) AfxMessageBox(Connect Failed!); return;CDialog:OnTimer(nIDEvent);- 11 雙擊IDD_CSOCKCLIENT_DIALOG對(duì)話框中的“發(fā)送”按鈕,添加以下代碼void CCSockClientDlg:OnSend() if (m_clientSocket.m_bConnected)m_clientSocket.m_nLength=m_MSG.GetWindowText(m_clientSocket.m_szBuffer, sizeof(m_clientSocket.m_szBuffer); m_clientSocket.AsyncSelect(FD_WRITE); m_MSG.SetWindowText();- 12 雙擊IDD_CSOCKCLIENT_DIALOG對(duì)話框中的“關(guān)閉”按鈕,添加以下代碼void CCSockClientDlg:OnExit() /關(guān)閉Socketm_clientSocket.ShutDown(2);/關(guān)閉對(duì)話框EndDialog(0); -12運(yùn)行此項(xiàng)目,連接時(shí)輸入主機(jī)名或IP均可,CAsyncSocket類會(huì)自動(dòng)處理。-二 服務(wù)端-Server端的編程與Client端的類似,下面主要介紹他的Listen及Accept函數(shù)-1 建立一個(gè)CNewSocket類,重載CAsyncSocket類的OnReceive、OnSend函數(shù),如何進(jìn)行信息的顯示和發(fā)送可以參考Client程序。本例中采用將收到信息原封不動(dòng)發(fā)回的方法來(lái)實(shí)現(xiàn)Echo功能,代碼如下CNewSoc
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 輕奢電動(dòng)車輛贈(zèng)與及售后保障合同
- 熱銷木飾面產(chǎn)品區(qū)域總代理合同
- 餐飲廚房后廚員工培訓(xùn)與福利保障承包合同
- 電子產(chǎn)品進(jìn)出口銷售代理協(xié)議模板
- 車輛租賃與駕駛?cè)藛T責(zé)任險(xiǎn)合同范本
- 協(xié)議離婚中婚姻財(cái)產(chǎn)分割與遺產(chǎn)繼承合同
- 住宅小區(qū)車位使用權(quán)轉(zhuǎn)讓及維修基金繳納協(xié)議
- 長(zhǎng)租公寓退房檢查及押金返還協(xié)議
- 橋梁樁基聲屏障安裝工程
- 正向設(shè)計(jì)流程核心要點(diǎn)
- 學(xué)習(xí)解讀《水利水電建設(shè)工程驗(yàn)收規(guī)程》SLT223-2025課件
- DZ∕T 0213-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 石灰?guī)r、水泥配料類(正式版)
- 消防檔案模板(完整版)
- 萬(wàn)瑋:《班主任兵法》
- 防汛物資檢查記錄
- 施工現(xiàn)場(chǎng)防火的安全管理制度
- 零星維修工程項(xiàng)目方案施工組織計(jì)劃
- FM筋膜手法(課堂PPT)
- 采礦工程畢業(yè)設(shè)計(jì)(畢業(yè)論文)
- 厭氧膠(MSDS)
- 水準(zhǔn)儀全站儀檢測(cè)報(bào)告
評(píng)論
0/150
提交評(píng)論