版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、windows socket編程實(shí)戰(zhàn)Socket中一個(gè)比較重要的結(jié)構(gòu)體:hostent,應(yīng)該用好這個(gè)結(jié)構(gòu)體。只允許復(fù)制應(yīng)用程序一個(gè)備份,不允許應(yīng)用程序自己修改,只能由系統(tǒng)修改,在調(diào)用任何socket結(jié)構(gòu)之前,都應(yīng)該copy自己需要的信息。通訊編程詳見MSDN中Windows CE document->Application Develop->Communication Services->Windows Sockets章節(jié)。1 winsock 的啟動(dòng)和終止WSAStartup():使用winsock之前,必須對(duì)其進(jìn)行初始化(VC中項(xiàng)目創(chuàng)建時(shí)不包括socket的時(shí)候),將其加載
2、,否則,將返回SOCKET_ERROR錯(cuò)誤,錯(cuò)誤信息為WSANOTINITIALIZED。用WSAStartup函數(shù)可加載WinSock庫函數(shù)聲明:int WSAStartup(WORD wVersionRequested , LPWSADATA lpWSAData);/成功返0,否則返非0參數(shù)說明:wVersionRequested : WinSock庫的版本號(hào),高位指定副版本,低位指定主版本,可通過MAKEWORD(X , Y )宏指定,X為低位,Y為高位。例:wVersionRequested =MAKEWORD(1,2);lpWSAData :接收WinSock實(shí)現(xiàn)細(xì)節(jié)的LPWSADA
3、TA結(jié)構(gòu)。Typedef struct WSAData WORD wVersion;/設(shè)置成準(zhǔn)備使用的WinSock版本 WORD wHighVersion;/存放的是現(xiàn)有的WinSock庫的最高版本,與wVersionRequested 參數(shù)相同
4、0; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYSSTATUS_LEN+1; unsigned short iMaxSockets; &
5、#160; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA , FAR* LPWSADATA;則一個(gè)程序要使用1.2版本的WinSock,程序?yàn)椋?include "afxsock.h"WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 2 ); err = WSAS
6、tartup( wVersionRequested, &wsaData );if ( err != 0 ) AfxMessageBox("socket初始化失敗!");return;if ( LOBYTE( wsaData.wVersion ) != 2 |HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( );AfxMessageBox("socket創(chuàng)建版本錯(cuò)誤!");return; 各windows平臺(tái)支持的WinSock最新版本平臺(tái)WinSock版本W(wǎng)in951.1Win982.2NT4.02.2W
7、in20002.2Win CE1.1使用完WinSock釋放所使用的資料:int WSACleanup(void);/成功返回0,否則返回SOCKET_ERROR示例代碼:WSACleanup();2創(chuàng)建套接字Socket()和WSASocket()網(wǎng)絡(luò)通信必須得創(chuàng)建套接字,創(chuàng)建一個(gè)套接字,使用下面的函數(shù):SOCKET Socket(int af ,int type,int protocol);或者:SOCKET WSASocket(int af,int type,int protocol,LPWSAPROTOCOL_INFO lpProtocolinfo,GROUP g , DWORD dw
8、Flags)注:WSASocket為Socket的WinSock2版本,其原理與方式與原函數(shù)類似。調(diào)用成功則返回SOCKET類型的套接字句柄,否則返回INVALID_SOCKET錯(cuò)誤參數(shù)說明:af:協(xié)議簇,是常值,在windows Socket網(wǎng)絡(luò)程序中,其只能為AF_INET,以下所有內(nèi)容皆針對(duì)于AF_INET協(xié)議所言協(xié)議簇常值協(xié)議簇注釋AF_INET網(wǎng)際協(xié)議AF_IPXIPX/SPX協(xié)議AF_NETBIOSNetBIOS協(xié)議AF_APPLETALKAppleTalkAF_TAMATMAF_IRDAInfrared SocketsType :套接字的類型,常值。下列為AFINET協(xié)議簇支持的
9、套接字類型:AFINET協(xié)議簇支持的套接字類型套接字類型注釋所用的通信協(xié)議SOCK_STREAM字節(jié)流套接字TCP協(xié)議SOCK_DGRAM數(shù)據(jù)報(bào)套接字UDP協(xié)議SOCK_RAW原始套接字ICMP ,IGMP等協(xié)議,此時(shí)protocol參數(shù)需進(jìn)行設(shè)置例如創(chuàng)建一個(gè)TCP套接字:s=Socket(AF_INET , SOCK_STREAM , 0 ) ;3 指定本機(jī)地址bind()創(chuàng)建套接字后:服務(wù)器端:必須將其綁定到一個(gè)已知地址客戶端:不必綁定,內(nèi)核會(huì)為其選擇地址。Int bind(SOCKET s , const struct sockaddr FAR* name , int namelen)參
10、數(shù)說明:s:等待客戶進(jìn)行連接的套接字name:指向struct sockaddr類型的緩沖區(qū)的指針,在調(diào)用bind前,必須先對(duì)其進(jìn)行填充。內(nèi)容為本地地址信息。Sockaddr結(jié)構(gòu)體定義:struct sockaddru_short sa_family;charsa_data14;常使用的是另一種結(jié)構(gòu)體類型的Socket地址類型sockaddr_in :struct sockaddr_in short sin_family;/協(xié)議簇,必為AF_INET u_short sin_port;/端口號(hào),使用前應(yīng)用htons函數(shù)轉(zhuǎn)換。 struct in_addr sin_addr;/IP地址,使用前應(yīng)
11、用htonl函數(shù)轉(zhuǎn)換 char sin_zero8;namelen:name參數(shù)所指的緩沖區(qū)的長度,可用sizeof函數(shù)取得。使用如下代碼為一個(gè)已創(chuàng)建的套接字綁定地址:SOCKET s;Struct sockaddr_in localaddr;s=socket(AF_INET,SOCK_STREAM,0);localaddr.sin_family=AF_INET;localaddr.sin_port=htons(5555);localaddr.sin_addr.s_addr=htonl(INADDR_ANY);/自動(dòng)選取本地地址進(jìn)行填充bind(s,(SOCKADDR*)&locala
12、ddr,sizeof(localaddr);4建立套接字連接connect()和WSAConnect()函數(shù)原型:int connect( SOCKET s, const struct sockaddr FAR *name, int namelen )參數(shù)說明:s:上面連接服務(wù)器的套接字name:一個(gè)指向struct sockaddr 類型的緩沖區(qū)的指針,調(diào)用connect前,必須對(duì)其進(jìn)行緩沖。namelen:name參數(shù)所指的緩沖區(qū)的長度,可用sizeof函數(shù)取得。WSAConnect()為connect的WinSock2版本:int WSAConnect( SOCKET s, const
13、struct sockaddr FAR *name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS );調(diào)用方法與connect類似。使用如下代碼與地址為03.03.03.1,端口為5555的TCP服務(wù)器建立聯(lián)系:SOCKET s;struct sockaddr_in remoteaddr;s=socket(AF_INET,SOCK_STREAM,0);remoteaddr.sin_family=AF_INET;remoteaddr.sin_port=htons(555
14、5);remoteaddr.sin_addr.s_addr=inet_addr(“03.03.03.1”);/inet_addr將字符串形式的IP地址轉(zhuǎn)換為正確的IN_ADDR結(jié)構(gòu)的IP地址connect(s,(SOCKADDR*)&remoteaddr,sizeof(remoteaddr);如果成功的與服務(wù)器建立連接,connect函數(shù)返回0,否則返回SOCKET_ERROR錯(cuò)誤.5監(jiān)聽連接listen()指示一個(gè)套接字等候進(jìn)入連接,listen僅僅被TCP服務(wù)器調(diào)用。當(dāng)函數(shù)Socket創(chuàng)建一個(gè)套接字時(shí),它被假設(shè)一個(gè)主動(dòng)套接字,即它是一個(gè)將調(diào)用connect發(fā)起連接的客戶套接字,函數(shù)
15、listen將未連接的套接字轉(zhuǎn)換為被動(dòng)套接字,指示內(nèi)核應(yīng)接收指向此套接字的連接請求。此時(shí)套接字將從CLOSED狀態(tài)轉(zhuǎn)換到LISTEN狀態(tài),套接字進(jìn)入監(jiān)聽模式。函數(shù)原型為:int listen( SOCKET s, int backlog );參數(shù)說明:s:要監(jiān)聽的已綁定但卻沒有連接的套接字backlog:內(nèi)核為此套接字排隊(duì)的最大連接個(gè)數(shù),通過指定backlog值我們可以對(duì)同時(shí)可處理的連接數(shù)進(jìn)行限制,多于則被丟棄?;鶎訁f(xié)議本身對(duì)backlog有最大限制,如果設(shè)定大于它則被用最接近的合法數(shù)值代替。調(diào)用成功則返回0,不成功則返回SOCKET_ERROR錯(cuò)誤。Listen()通常在bind()之后,a
16、ccept之前調(diào)用,如下:(省略了錯(cuò)誤檢測代碼)bind(s,(SOCKADDR*)&localaddr,sizeof(localaddr);listen(s,5);accept(.);6 接受連接請求accept()和WSAAccept()accept()函數(shù)由TCP服務(wù)器調(diào)用,它從已完成連接隊(duì)列頭返回下一個(gè)已完成連接。在阻塞方式下,如果隊(duì)列已完成隊(duì)列為空,則導(dǎo)致進(jìn)程進(jìn)入睡眠狀態(tài)函數(shù)原型:SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen );SOCKET WSAAccept( SOCKET s,
17、struct sockaddr FAR *addr, LPINT addrlen, LPCONDITIONPROC lpfnCondition, DWORD dwCallbackData );WSAAceept是accept的WinSock2版本。參數(shù)說明:s:指定一個(gè)處于監(jiān)聽連接狀態(tài)的套接字addr:指向一個(gè) struct sockaddr類型的緩沖區(qū),用來接收連接方的地,可以置NULL。addlen:整形指針,在調(diào)用時(shí)它所指的空間存放addr指向的緩沖區(qū)長度。在調(diào)用返回后,里面是返回的連接方的地址的確切長度。如果我們對(duì)客戶的身份不想知道,則可將addr和addrlen參數(shù)置NULL.例如:
18、newsock=accept(s,NULL,NULL);如果調(diào)用成功,則accept返回一個(gè)由內(nèi)核生成的全新的套接字,注意,這個(gè)套接字和原來的bind的套接字不為同一個(gè),即,一端至少得兩個(gè)套接字,一個(gè)套接字為windows套接字,由socket創(chuàng)建,負(fù)責(zé)綁定,監(jiān)聽,一個(gè)為C/S間通訊的套接字,代表與客戶機(jī)的連接,由accept創(chuàng)建,而原來的套接字狀態(tài)不變,仍處于監(jiān)聽狀態(tài),等待客戶的連接請求。如果調(diào)用失敗,則返回一個(gè)INVALID_SOCKET的錯(cuò)誤。7數(shù)據(jù)發(fā)送send()和sendto()函數(shù)原型:int send( SOCKET s, const char FAR *buf, int len
19、, int flags);int sendto( SOCKET s, const char FAR *buf, int len, int flags,const struct sockaddr FAR *to, int tolen);參數(shù)描述:s :發(fā)送端套接字描述符。Buf:發(fā)送數(shù)據(jù)的緩沖區(qū)地址。Len:實(shí)際要發(fā)送數(shù)據(jù)的字節(jié)數(shù),應(yīng)小于或者等于套接字s的緩沖區(qū)長度,否則報(bào)錯(cuò)。Flags:發(fā)送數(shù)據(jù)方式(MSG_DONTROUTE:指定數(shù)據(jù)不交給路由選擇;MSG_OOB:表示要發(fā)送帶外數(shù)據(jù),一般置0)to:接收方sockaddr 結(jié)構(gòu)形式的地址。Tolen:地址結(jié)構(gòu)的長度。說明:send函數(shù)并不傳
20、送數(shù)據(jù),只是協(xié)議傳的,send只是把buf中的數(shù)據(jù)copy到s的發(fā)送緩沖區(qū)的剩余空間里。Copy成功則返回拷貝的實(shí)際長度,否則任何錯(cuò)誤都返回SOCKET_ERROR錯(cuò)誤。注:sendto一般用于數(shù)據(jù)報(bào)(UDP).8 數(shù)據(jù)接收recv()和recvfrom()recv()用于流套接字,TCP協(xié)議。和recvfrom()用于數(shù)據(jù)報(bào),UDP協(xié)議。int recv(SOCKET s, char FAR *buf, int len, int flags );int recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr
21、 FAR *from, int FAR fromlen);參數(shù)說明:s:接收端套接字描述符。Buf:用來存放接收數(shù)據(jù)的緩沖區(qū)地址。Len:接收數(shù)據(jù)緩沖區(qū)的長度。Flags:處理數(shù)據(jù)方式(MSG_OOB:讀取套接字上的帶外數(shù)據(jù);MSG_PEEK:查看輸入數(shù)據(jù),數(shù)據(jù)將被復(fù)制到緩沖區(qū)去,但不從輸入隊(duì)列中清除,一般置0)From:recv函數(shù)返回的發(fā)送方sockaddr 結(jié)構(gòu)形式的地址。fomlen:地址結(jié)構(gòu)的長度。說明:recv把接收緩沖區(qū)中的數(shù)據(jù)copy到buf中,返回實(shí)際copy的字節(jié)數(shù),任何出錯(cuò)則返回SOCKET_RROR。Recvfom用于數(shù)據(jù)報(bào)協(xié)議。9 I/O多路復(fù)用Select()指示多
22、個(gè)事件中任何一個(gè)的發(fā)生,并且僅在一個(gè)或者多個(gè)事件發(fā)生或者經(jīng)過某指定的時(shí)間后才喚醒進(jìn)程??梢詸z測一個(gè)或者多個(gè)套接字的狀態(tài),滿足給定狀態(tài)的套接字集合由fd_set結(jié)構(gòu)體指示,當(dāng)select返回時(shí),fd_set結(jié)構(gòu)體被更新,同時(shí)select函數(shù)返回滿足條件的套接字?jǐn)?shù)目。int select( int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout);參數(shù)說明:nfds:可忽略,系統(tǒng)為兼容性而設(shè)readfds,:指向套接字集合,select
23、函數(shù)對(duì)該集合內(nèi)的套接字是否可讀進(jìn)行檢測??蛇x參數(shù)。Writefds:指向套接字集合,select函數(shù)對(duì)該集合內(nèi)的套接字是否可寫進(jìn)行檢測??蛇x參數(shù)。Exceptfds:指向套接字集合,select函數(shù)對(duì)該集合內(nèi)的套接字是否出錯(cuò)進(jìn)行檢測??蛇x參數(shù)。Timeout: select等待超時(shí)的最大時(shí)間,timeval 結(jié)構(gòu)類型的結(jié)構(gòu)指針。如果設(shè)為NULL,則為阻塞操作。timeval 結(jié)構(gòu)體定義:struct timeval long tv_sec; / seconds long tv_usec; / and microseconds ;fd_set結(jié)構(gòu)體的定義:typedef struct fd_se
24、t u_int fd_count; / how many are SET? SOCKET fd_arrayFD_SETSIZE; / an array of SOCKETs fd_set;常用一組宏定義操作fd_set類型的描述符集合:FD_CLR(s, *set):從集合中刪除描述符s;FD_ISSET(s, *set):判斷描述符s是否是集合中的一個(gè)元素,是則返回非0,不是則返回0;FD_SET(s, *set):增加描述符s到集合中。FD_ZERO(*set):清空集合。10 釋放連接closesocket()和shutdown()通訊任務(wù)完成后,必須關(guān)閉連接以釋放套接字句柄的資源。函數(shù)
25、原型:int closesocket( SOCKET s );int shutdown( SOCKET s, int how);參數(shù)說明:s:要關(guān)閉的套接字句柄how:關(guān)閉時(shí)的操作選擇(SD_RECEIVE:表示不再接收數(shù)據(jù);SD_SEND:表示不再發(fā)送數(shù)據(jù);SD_BOTH:表示取消連接兩端的收發(fā)操作 )說明:1. 函數(shù)操作成功則返回0,否則返回SOCKET_ERROR2. closesocket有可能造成數(shù)據(jù)丟失,因?yàn)橛锌赡苡袔讉€(gè)套接字描述符指向同一個(gè)套接字?jǐn)?shù)據(jù)結(jié)構(gòu)。套接字?jǐn)?shù)據(jù)結(jié)構(gòu)中有一個(gè)字段專門存放該結(jié)構(gòu)的被引用次數(shù)。當(dāng)次數(shù)為1時(shí)系統(tǒng)則清除該結(jié)構(gòu),大于1時(shí)系統(tǒng)僅清除套接字描述符表中對(duì)應(yīng)的表
26、項(xiàng),并次數(shù)遞減1。Shutdown則可能做到“從容關(guān)閉”,因此盡可能選用shutdown函數(shù)。11 其它API函數(shù)11.1 getpeername()說明:獲得與套接字相連的端地址信息。函數(shù)原型:調(diào)用成功則int getpeername( SOCKET s, struct sockaddr FAR *name, int FAR *namelen);參數(shù)說明:s:標(biāo)識(shí)一已連接的套接字描述符name:接收端地址結(jié)構(gòu)的名字namelen: 一個(gè)指向名字結(jié)構(gòu)的指針。注:成功則返回0,否則返回SOCKET_ERROR。11.2 getsockname()說明:獲得一個(gè)套接字的本地名字。函數(shù)原型:int
27、getsockname( SOCKET s, struct sockaddr FAR *name, int FAR *namelen);參數(shù)說明:s:標(biāo)識(shí)一已連接的套接字描述符name:接收端地址的名字結(jié)構(gòu)。namelen: 名字緩沖區(qū)長度。注:1.成功則返回0,否則返回SOCKET_ERROR。 2.其用于一個(gè)已捆綁或者已連接的套接字s,本地址將被返回。當(dāng)未綁定就connect()時(shí),唯有此函數(shù)可以獲知系統(tǒng)內(nèi)定的本地地址。在返回時(shí),namelen參數(shù)包含了名字的實(shí)際字節(jié)數(shù)。3>. 若一個(gè)套接字與INADDR_ANY捆綁,即該套接字可以用任意主機(jī)的地址,此時(shí)除非用OnConnect或者a
28、ccept來連接,否則getsockname不會(huì)返回主機(jī)地址的任何信息,所以INADDR_ANY主要用于多個(gè)主機(jī)環(huán)境中,單主機(jī)環(huán)境不應(yīng)該使用此參數(shù)。11.3 gethostbyaddr()函數(shù)原型:struct HOSTENT FAR * gethostbyaddr( const char FAR *addr, int len, int type )參數(shù)說明:addr: 指向網(wǎng)絡(luò)字節(jié)順序地址的指針。len: 地址的長度,在AF_INET類型地址中為4。type: 地址類型,應(yīng)為AF_INET。struct HOSTENT結(jié)構(gòu):struct hostent char FAR * h_name;/
29、正規(guī)的主機(jī)名字。 char FAR * FAR * h_aliases;/一個(gè)以空指針結(jié)尾的可選主機(jī)名隊(duì)列。 short h_addrtype;/返回地址的類型:AF_INET。 short h_length;/每個(gè)地址的長度(字節(jié)數(shù)),對(duì)AF_INET域?yàn)? char FAR * FAR * h_addr_list;/以空指針結(jié)尾的主機(jī)地址列表,返回地址以網(wǎng)絡(luò)順序排列。;注:gethostbyaddr()函數(shù)成功則返回對(duì)應(yīng)于給定地址的包含主機(jī)名字和地址信息的hostent結(jié)構(gòu)指針,這個(gè)結(jié)構(gòu)由windows socket實(shí)現(xiàn)分配,應(yīng)用程序不應(yīng)該試圖修改或者釋放其任何部分,每線程僅有這個(gè)結(jié)構(gòu)的拷
30、貝,所以應(yīng)用程序在發(fā)出其它的socket API調(diào)用前,應(yīng)該把自己所需的信息拷貝下來。失敗返回空指針。11.4 Gethostbyname()根據(jù)名稱取得運(yùn)行代碼的機(jī)器IP:一個(gè)例子:PHOSTENT hostinfo;CString ip;char name255;if(hostinfo = gethostbyname(name) != NULL)ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);11.5文件下載函數(shù):來自于MSDN的web Workshop文檔HRESULT URLDownloadToFile( LP
31、UNKNOWN pCaller,/調(diào)用者:若為組件,則為組件接口地址,不為組件,則置NULL LPCTSTR szURL,/下載的URL地址,不能置NULL LPCTSTR sz,/下載的文件保存的文件名 DWORD dwReserved,/ 0LPBINDSTATUSCALLBACK lpfnCB/調(diào)用者的IBindStatusCallback函數(shù)接口地址,可為NULL);12 在程序中顯示SOCKET錯(cuò)誤信息Ø 程序員自行分配信息緩沖區(qū)的方法WSAShowError()TCHAR errMsg2048 = 0;FormatMessage(FORMAT_MESSAGE_FROM_S
32、YSTEM,GetModuleHandle(TEXT("ws2_32.dll"), WSAGetLastError(),NULL,errMsg,sizeof(errMsg)/sizeof(TCHAR),NULL);MessageBox(errMsg, TEXT("ws2_32.dll模塊中關(guān)于此錯(cuò)誤的詳細(xì)說明:"), MB_ICONERROR);/AfxMessageBox(errMsg);/或者用系統(tǒng)對(duì)話框來顯示/SetDlgItemText(IDC_STATIC1,errMsg);/或者用靜態(tài)文本框顯示/MessageBox(ghMainWnd, errMsg, TEXT("ws2_32.dll"), MB
溫馨提示
- 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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版簡單的土石方承包合同范本
- 臨時(shí)安保服務(wù)定制協(xié)議:2024年標(biāo)準(zhǔn)版B版
- 二零二五年跨境電商平臺(tái)合作銷售合同3篇
- 個(gè)性化制作服務(wù)費(fèi)及銷售權(quán)合同(2024版)版
- 二零二五年度高端房地產(chǎn)信托借款服務(wù)合同3篇
- 2025年度企業(yè)社會(huì)責(zé)任報(bào)告編輯服務(wù)合同范本3篇
- 天津城市職業(yè)學(xué)院《鑄造工藝》2023-2024學(xué)年第一學(xué)期期末試卷
- 蘇州大學(xué)應(yīng)用技術(shù)學(xué)院《生物工程單元操作原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 四川鐵道職業(yè)學(xué)院《游戲治療》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度門窗安裝與建筑一體化設(shè)計(jì)合同協(xié)議3篇
- Unit-1-The-Dinner-Party市公開課一等獎(jiǎng)省賽課微課金獎(jiǎng)?wù)n件
- 加油站反恐演練工作方案及流程
- 【閱讀提升】部編版語文五年級(jí)下冊第五單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 挖掘機(jī)運(yùn)輸方案
- 民企廉潔培訓(xùn)課件
- 飛書使用培訓(xùn)課件
- 食品生產(chǎn)許可證辦理流程詳解
- 2023年1月自考07484社會(huì)保障學(xué)試題及答案含解析
- 餐飲咨詢服務(wù)合同范本
- 股權(quán)投資的基本概念與原理
- 數(shù)據(jù)交換詳細(xì)設(shè)計(jì)說明書
評(píng)論
0/150
提交評(píng)論