




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章Windows網(wǎng)絡(luò)編程8.1Winsock編程接口
8.2Windows與Linux網(wǎng)絡(luò)編程環(huán)境的異同習(xí)題8.1Winsock編程接口
8.1.1Winsock的發(fā)展
Winsock(Windowssocket)是隨著Windows的飛速發(fā)展而誕生的。最初,socket只是用于UNIX系統(tǒng)中,但Windows系統(tǒng)的發(fā)展使人們想到是否可以把它移植過(guò)來(lái)。于是,1993年就出現(xiàn)了Winsock1.0版本規(guī)范,這個(gè)版本定義了16位的網(wǎng)絡(luò)編程接口。當(dāng)然,它很快就不能適應(yīng)32位的需要了,接著,1994年5月,Winsock2.0版本問(wèn)世了。1997年5月,Winsock2.0的規(guī)范版本W(wǎng)insock2.2.1正式發(fā)布。有了這個(gè)接口,程序員就可以很方便地編寫(xiě)符合Windows編程模式的軟件,大大方便了網(wǎng)絡(luò)程序的開(kāi)發(fā)。接下來(lái)介紹一下Winsock的組成和使用。 8.1.2Winsock規(guī)范的組成及適用范圍 因?yàn)閃insock是從UNIX系統(tǒng)中的socket得到的啟發(fā)和利用,當(dāng)然就少不了UNIX的一些特性。完成一個(gè)網(wǎng)絡(luò)連接的信息主要有協(xié)議族、本地端口號(hào)、本地主機(jī)地址、遠(yuǎn)程端口號(hào)、遠(yuǎn)程主機(jī)地址、服務(wù)類(lèi)型等,socket中必須包含這些信息才能完成連接。在Winsock2.0及以后的版本中均提供了標(biāo)準(zhǔn)服務(wù)提供接口(SPI,StandardServiceProviderInterface),如果系統(tǒng)安裝了相應(yīng)的協(xié)議后,則通過(guò)SPI,Winsock可以應(yīng)用于很多的網(wǎng)絡(luò)中。
對(duì)于網(wǎng)絡(luò)應(yīng)用程序的開(kāi)發(fā)者來(lái)說(shuō),Winsock提供的開(kāi)發(fā)組件包括WinsockAPI和一些頭文件。對(duì)于網(wǎng)絡(luò)通信的實(shí)現(xiàn)來(lái)說(shuō),Winsock提供的運(yùn)行組件是WinsockAPI的動(dòng)態(tài)鏈接庫(kù)(DLL)。WinsockDLL有不同的版本,但它的使用對(duì)用戶(hù)來(lái)說(shuō)是透明的,用戶(hù)不必關(guān)心不同版本之間的協(xié)商問(wèn)題。
Winsock支持流socket和數(shù)據(jù)報(bào)socket,這兩種類(lèi)型的socket提供的數(shù)據(jù)流服務(wù)不同,前者提供面向連接的、可靠的、無(wú)重復(fù)的數(shù)據(jù)傳輸,內(nèi)設(shè)流量控制機(jī)制;后者提供無(wú)連接的、不可靠的數(shù)據(jù)傳輸,沒(méi)有流量控制機(jī)制,所以接收的數(shù)據(jù)可能和發(fā)送的數(shù)據(jù)順序不一致。
就像網(wǎng)絡(luò)通信需要協(xié)議的支持一樣,網(wǎng)絡(luò)程序的開(kāi)發(fā)和使用也要有一定規(guī)則的支持,Winsock規(guī)范的初衷就是提供這樣的支持。遵循這套規(guī)范開(kāi)發(fā)的軟件就被認(rèn)為是Winsock兼容的。
8.1.3Winsock的主要特點(diǎn) 正如前面提到的,Winsock是從UNIX移植過(guò)來(lái)的,這就注定了它具有繼承性,同時(shí),它又是針對(duì)Windows系統(tǒng)而開(kāi)發(fā)的,具有其擴(kuò)展性。
熟悉UNIX系統(tǒng)的人在用到Winsock的時(shí)候會(huì)感到很親切,因?yàn)樗鼈兌加邢嗨频沫h(huán)境。在Winsock中使用的一些庫(kù)函數(shù)都保留了BerkeleySocket的風(fēng)格。Winsock的BSDSocketAPI函數(shù)都源自于UNIX系統(tǒng)。 隨著Windows版本的更新,Winsock的版本也隨之更新,由Winsock1.0、Winsock1.1到現(xiàn)在的Winsock2.2.1,其內(nèi)容都是為了更好地適應(yīng)用戶(hù)在不同版本的Windows系統(tǒng)下使用。比較特殊的是WindowsCE只支持Winsock1.1版本,其他的Windows系統(tǒng)都可以適用最新的Winsock2.0以上的版本。
由于Winsock支持的Windows版本眾多,其中既有單線(xiàn)程的,也有多線(xiàn)程的,因此在使用多線(xiàn)程時(shí)尤其要注意終止socket的工作。接下來(lái)我們就來(lái)看一下Winsock是如何開(kāi)始和終止它的工作的。 8.1.4Winsock的啟動(dòng)和終止 前面已經(jīng)介紹了使用一個(gè)socket的時(shí)候要先創(chuàng)建它,Winsock也是如此。這里介紹WSAStartup()函數(shù)和WSACleanup()函數(shù)。當(dāng)一個(gè)Winsock應(yīng)用程序啟動(dòng)時(shí),首先要加載WinsockDLL,并且視不同的版本而加載不同的WinsockDLL,然后,我們就可以開(kāi)始啟動(dòng)工作了。Winsock的實(shí)現(xiàn)依賴(lài)于它的庫(kù)函數(shù)DLL,每一個(gè)Winsock應(yīng)用程序首先都要調(diào)用WSAStartup()函數(shù),成功啟動(dòng)該函數(shù)之后,應(yīng)用程序就可以執(zhí)行其他的Winsock API函數(shù)了。WSAStartup()函數(shù)的描述如下:
intPASCALFARWSAStartup(WORDwVersionRequested,LPWSADATA*lpWSAData);
其中各函數(shù)的含義為: ●?PASCAL:使用PASCAL風(fēng)格的函數(shù); ●?FAR:說(shuō)明此函數(shù)所在的代碼段可能和應(yīng)用程序所在的代碼段不同; ●?wVersionRequested:指定WinsockAPI的版本號(hào); ●?lpWSAData:指向LPWSADATA數(shù)據(jù)結(jié)構(gòu)的指針。 以下程序段形成WSADATA:
typedefstructWSAData{ WORDwVersion; WORDwHighVersion; charszDescription[WSAOESCRIPTION_LEN+1]; charszSystemStatus[WSASYS_STATUS_LEN+1]; unsignedshortiMaxSockets; unsignedshortiMaxUdpDg; charFAR*lpVendorInfo; }; WSAOESCRIPTION_LEN=256; WSASYS_STATUS_LEN=128; WSADATAFAR*LPWSADATA; ●?wVersion:返回由wVersionRequested設(shè)置的版本號(hào); ●?wHighVersion:返回Winsock能兼容的最高版本號(hào); ●?szDescription:說(shuō)明修訂版本號(hào)等信息; ●?szSystemStatus:返回特殊系統(tǒng)組合設(shè)置; ●?iMaxSockets:在較低版本的Winsock中返回應(yīng)用程序可以使用的最大版本號(hào),Winsock2.0以上版本不再使用; ●?iMaxUdpDg:在較低版本的Winsock中返回Winsock發(fā)送或接收的UDP數(shù)據(jù)最大長(zhǎng)度,Winsock2.0以上版本不再使用; ●?lpVendorInfo:在較低版本的Winsock中返回Winsock制造商信息,Winsock2.0以上版本不再使用。
應(yīng)用程序可以視不同的需要多次讀取WSAData結(jié)構(gòu)信息,每一次讀取都是對(duì)WSAStartup()函數(shù)的調(diào)用,在結(jié)束的時(shí)候必須調(diào)用同樣次數(shù)的WSACleanup()函數(shù),因?yàn)樗鼈儽仨毷浅蓪?duì)出現(xiàn)的。WSACleanup()函數(shù)的描述如下:
intWSACleanup(void);
其中,void=0表示完成。 以下是調(diào)用WSAStartup()函數(shù)和WSACleanup()函數(shù)的示例:
/*socketversionrequested2.0*/ WORDversion=0x0002; WSADATAWSAData; /*
用來(lái)獲取Windows套接字的具體實(shí)現(xiàn)信息
*/ /*獲取當(dāng)前套接字的信息,將結(jié)果保存在WSAData變量里
*/voidSocketmodel(void){intiReturn;iReturn=WSAStartup(Version,&WSAData); /*
獲取版本信息
*/if(iReturn!=ERROR_SUCCESS){/*錯(cuò)誤處理程序
*/cout<<"WindowsSocketisnotresponded.";}/*應(yīng)用程序代碼段
*/iReturn=WSACleanup();/*
進(jìn)行所有的清除工作,并且終止所有的套接字操作線(xiàn)程
*/if(iReturn!=ERROR_SUCCESS){cout<<"WindowsSocketscannotbeclosed.";}else{cout<<"WindowsSocketsisclosed.";}}
為了實(shí)現(xiàn)安全的網(wǎng)絡(luò)連接,我們?cè)谡{(diào)用此函數(shù)之前,應(yīng)該先調(diào)用shutdown()函數(shù),關(guān)閉連接,然后再執(zhí)行終止socket的工作,釋放資源。并不是每一次調(diào)用的時(shí)候都釋放資源,否則仍在使用該套接字的應(yīng)用程序就會(huì)受到影響。實(shí)質(zhì)上,最后一個(gè)調(diào)用的WSACleanup()函數(shù)才真正地釋放資源,之前其他的調(diào)用只是在計(jì)數(shù)器上減少數(shù)量而已。 8.1.5WinsockAPI函數(shù) 在8.1.4節(jié)中我們已經(jīng)接觸到了Winsock的兩個(gè)函數(shù):WSAStartup()函數(shù)和WSACleanup()函數(shù)。本節(jié)將詳細(xì)介紹WinsockAPI函數(shù),了解各函數(shù)的定義、功能、參數(shù)設(shè)置及意義。 對(duì)于標(biāo)準(zhǔn)的socket函數(shù),前面已經(jīng)詳細(xì)描述,這里不再詳述,下面只介紹Winsock1.1專(zhuān)用函數(shù)和Winsock2擴(kuò)展函數(shù)。 1.域名地址 在Internet上訪(fǎng)問(wèn)遠(yuǎn)程主機(jī)的時(shí)候,我們會(huì)輸入IP地址或如這樣的地址,但在Winsock中,這樣的地址是不能被識(shí)別的,必須轉(zhuǎn)換為socket地址結(jié)構(gòu)。反之,socket數(shù)據(jù)結(jié)構(gòu)的地址也必須轉(zhuǎn)換為用戶(hù)理解的形式。這種地址轉(zhuǎn)換工作是由數(shù)據(jù)庫(kù)函數(shù)實(shí)現(xiàn)的。這些函數(shù)通過(guò)訪(fǎng)問(wèn)各種數(shù)據(jù)庫(kù)資源,獲得域名、服務(wù)、協(xié)議等信息。在Winsock2.0以后的版本中,應(yīng)用程序要使用其他函數(shù)實(shí)現(xiàn)(參見(jiàn)本章Winsock2擴(kuò)展函數(shù)),此類(lèi)函數(shù)只是為了兼容而保留了下來(lái),但我們還是需要了解一下這些函數(shù)。具體函數(shù)描述如下: ●?gethostbyaddr():根據(jù)網(wǎng)絡(luò)地址獲得域名或IP地址。
定義:
structhostentFAR*WSAAPI stcharFAR*addr,/*指向一個(gè)以網(wǎng)絡(luò)字節(jié)順序表示的32位網(wǎng)絡(luò)地址指針
*/??INintlen,
/*addr的字節(jié)數(shù)
*/??INinttype); ?/*
地址類(lèi)型
*/
函數(shù)根據(jù)網(wǎng)絡(luò)地址獲得遠(yuǎn)程主機(jī)信息,返回的信息包含在以下指針結(jié)構(gòu)中:
structhostent{ charFAR*h_name; ?/*
返回主機(jī)名字
*/ charFAR*h_aliases; ? /*
返回主機(jī)別名,是一個(gè)以NULL結(jié)束的別名數(shù)組
*/ shorth_length; ? /*
返回地址的字節(jié)數(shù)
*/ charFAR*h_addr_list; ?/*
一個(gè)以NULL結(jié)束的地址表,以網(wǎng)絡(luò)字節(jié)順序表示
*/} structhostent{ charFAR*h_name; ?/*
返回主機(jī)名字
*/ charFAR*h_aliases; ? /*
返回主機(jī)別名,是一個(gè)以NULL結(jié)束的別名數(shù)組
*/ shorth_length; ? /*
返回地址的字節(jié)數(shù)
*/ charFAR*h_addr_list; ?/*
一個(gè)以NULL結(jié)束的地址表,以網(wǎng)絡(luò)字節(jié)順序表示
*/ } structhostent{ charFAR*h_name; ?/*
返回主機(jī)名字
*/ charFAR*h_aliases; ? /*
返回主機(jī)別名,是一個(gè)以NULL結(jié)束的別名數(shù)組
*/ shorth_length; ? /*
返回地址的字節(jié)數(shù)
*/ charFAR*h_addr_list; ?/*
一個(gè)以NULL結(jié)束的地址表,以網(wǎng)絡(luò)字節(jié)順序表示
*/} ●?gethostbyname():根據(jù)主機(jī)名獲得主機(jī)信息。 定義:
structhostentFAR*WSAAPI gethostbyname(INconstcharFAR*name); /*獲得主機(jī)名字
*/
該函數(shù)返回一個(gè)hostent結(jié)構(gòu)指針,包括主機(jī)名和地址信息。 以下是該函數(shù)調(diào)用的示例: voidResolveHostMsg(void) { charHostName[256]; /*
首先獲取本地主機(jī)名稱(chēng),將主機(jī)名保存在HostName里
*/ gethostname(HostName,sizeof(HostName)); /*
得到主機(jī)名,主機(jī)名長(zhǎng)度
*/ ethostbyname(HostName); /*
通過(guò)函數(shù)gethostbyname取得的主機(jī)名和地址信息生成hostent結(jié)構(gòu)
*/ if(Host==0){ /*如果主機(jī)名非法,則輸出錯(cuò)誤提示
*/ cout<<"IPError."; }else /*輸出主機(jī)信息
*/ { cout<<Host->h_name<<endl; /*
輸出主機(jī)名
*/
cout<<Host->h_alias<<endl; /*
輸出主機(jī)別名
*/ cout<<Host->addrtype<<endl; /*
輸出IP地址類(lèi)型
*/ } } ●?gethostname():在指定緩沖區(qū)中返回主機(jī)名。 定義:
intWSAAPI gethostname( OUTcharFAR*name,
/*指向接收主機(jī)名的緩沖區(qū)的指針
*/ INintnamelen /*緩沖區(qū)長(zhǎng)度*/ };
以下是該函數(shù)調(diào)用的示例:
/*解析主機(jī)名,并將解析結(jié)果保存成AnsiString類(lèi)型。AnsiString類(lèi)是功能很強(qiáng)的字串類(lèi)。AnsiString類(lèi)構(gòu)造器可以從Char、Char*、int或double生成AnsiString類(lèi)對(duì)象。這些構(gòu)造器很容易將直接字串賦予AnsiString類(lèi)并將整數(shù)或浮點(diǎn)數(shù)變成字串
*/ AnsiStringResolveHostName(void){ charHostName[256]; /*首先獲取本地主機(jī)名稱(chēng),將主機(jī)名保存在HostName里
*/ gethostname(HostName,sizeof(HostName)); /*得到主機(jī)名,主機(jī)名長(zhǎng)度
*/return(Strpas (HostName));/*將解析結(jié)果通過(guò)Strps()函數(shù)轉(zhuǎn)化成指定的AnsiString類(lèi)型,
并返回
*/}
以下是該函數(shù)調(diào)用的示例:AnsiStringGetProtol(AnsiStringProtocalName){Protoent*Protocol=getprotobyname(ProtocalName.c_strc);/*
定義一個(gè)Protoent類(lèi)型的指針變量來(lái)保存獲取的協(xié)議信息
*/if(Protocol!=0){/*
如果獲取的協(xié)議合法,返回協(xié)議號(hào):協(xié)議名稱(chēng)
*/return(IntToStr(Protocol->p_proto)+":"+StrPas(Protocol->p_name));/*
通過(guò)IntToStr函數(shù)將結(jié)果轉(zhuǎn)化為字串類(lèi)型
*/else{/*如果不合法,則返回0*/return(AnsiString)0;}}} ●?getprotobynumber():通過(guò)協(xié)議號(hào)獲得協(xié)議信息。 定義:
structprotoentFAR*WSAAPI getprotobynumber(INintnumber); /*
以主機(jī)字節(jié)順序表示的協(xié)議號(hào)
*/
以下是該函數(shù)調(diào)用的示例:
/*獲取協(xié)議
*/ voidGetProtocol(void){ /*獲取協(xié)議,判斷協(xié)議是否合法,并循環(huán)輸出合法的協(xié)議號(hào)及對(duì)應(yīng)的協(xié)議名稱(chēng)
*/ for(inti=1;i<=100;i++) {protoent*Protocol=getprotobynumber(i); if(Protocol!=0) cout<<Protocol->p_proto<<”:”<<Protocol->p_name<<endl; } } ●?getservbyname():獲得服務(wù)信息,包括服務(wù)名和服務(wù)端口號(hào)。它通過(guò)給定服務(wù)名和協(xié)議名獲得。
定義:
structserventFAR*WSAAPI getservbyname(INconstcharFAR*name,
/*指向服務(wù)的指針
*/INconstcharFAR*proto); /*指向協(xié)議名的指針
*/
返回的信息包含在以下指針結(jié)構(gòu)中:
structservent{
charFAR*s_name; /*
服務(wù)正式名
*/ charFAR*FAR*s_aliases; /*
服務(wù)別名
*/ shorts_port; /*
以網(wǎng)絡(luò)字節(jié)順序表示的服務(wù)端口號(hào)
*/ charFAR*s_proto /*
連接時(shí)所用到的協(xié)議名
*/ }; ●?getservbyport():獲得服務(wù)信息,包括服務(wù)名和服務(wù)端口號(hào)。與getservbyname不同的是它通過(guò)給定端口號(hào)和協(xié)議名獲得。 定義:
structserventFAR*WSAAPI getservbyport( INintport,
/*以網(wǎng)絡(luò)字節(jié)順序表示的服務(wù)使用的端口號(hào)
*/INconstcharFAR*proto /*指向協(xié)議名的指針*/ );以下是該函數(shù)調(diào)用的示例:voidGetServent(intPort,
char*ProtoName){servent*Serv=getservbyname(Port,
ProtoName);if(Serv!=0){ /*輸出通信協(xié)議服務(wù)相關(guān)信息
*/cout<<Serv->s_name<<endl; /*協(xié)議服務(wù)名稱(chēng)
*/cout<<Serv->s_port<<endl; /*協(xié)議服務(wù)端口號(hào)
*/cout<<Serv->s_proto<<endl; /*協(xié)議號(hào)
*/}} 2.Winsock1.1專(zhuān)用函數(shù)
Winsock1.1對(duì)BerkeleySocket標(biāo)準(zhǔn)函數(shù)的擴(kuò)充主要是實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)事件基于消息的異步存取。根據(jù)實(shí)現(xiàn)功能的不同,可以將這些函數(shù)分為以下五類(lèi):
1)啟動(dòng)和終止函數(shù)
WSAStartup()函數(shù)和WSACleanup()函數(shù),前面我們已經(jīng)介紹過(guò),這里不再贅述。
2)異步服務(wù)函數(shù) 在BerkeleySockets標(biāo)準(zhǔn)函數(shù)中,請(qǐng)求服務(wù)是阻塞的,在Winsock中,這些函數(shù)可以實(shí)現(xiàn)應(yīng)用程序異步獲取請(qǐng)求信息,并在服務(wù)完成后返回一個(gè)應(yīng)答消息。這類(lèi)函數(shù)主要有: ●?WSAAsyncGetHostByAddr():通過(guò)網(wǎng)絡(luò)地址獲得主機(jī)名字和地址信息。
定義:
HANDLEWSAAPI/*初始化成功后返回一個(gè)HANDLE類(lèi)型的非零值*/ WSAAsyncGetHostByAddr( INHWNDhWnd,
/*請(qǐng)求完成時(shí),接收消息的窗口句柄
*/INunsignedintwMsg,
/*請(qǐng)求完成時(shí)接收到的消息
*/INconstcharFAR*addr,
/*指向用網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)的主機(jī)網(wǎng)絡(luò)地址的指針
*/INintlen,
/*地址長(zhǎng)度
*/INinttype,
/*地址類(lèi)型
*/OUTcharFAR*buf,
/*接收主機(jī)信息的數(shù)據(jù)緩沖區(qū)指針
*/INintbuflen,
/*?buf的長(zhǎng)度
*/);
●?WSAAsyncGetProtoByName():通過(guò)協(xié)議名獲得協(xié)議名字和協(xié)議號(hào)信息。 定義:
HANDLEWSAAPI WSAAsyncGetProtoByName( INHWNDhWnd,
/*
請(qǐng)求完成時(shí),接收消息的窗口句柄
*/INunsignedintwMsg,
/*
請(qǐng)求完成時(shí)接收到的消息
*/INconstcharFAR*name,
/*
指向主機(jī)名字的指針
*/OUTcharFAR*buf,
/*
接收協(xié)議信息的數(shù)據(jù)緩沖區(qū)指針
*/INintbuflen,
/*?buf的長(zhǎng)度
*/);
●?WSAAsyncGetServByName():通過(guò)服務(wù)名和協(xié)議名獲得服務(wù)信息。 定義:
HANDLEWSAAPI WSAAsyncGetServByName(INHWNDhWnd,
/*
請(qǐng)求完成時(shí),接收消息的窗口句柄
*/INunsignedintwMsg,
/*
請(qǐng)求完成時(shí)接收到的消息
*/
INconstcharFAR*name,
/*
指向服務(wù)名的指針
*/INconstcharFAR*proto,
/*
指向協(xié)議名的指針
*/OUTcharFAR*buf,
/*
接收服務(wù)數(shù)據(jù)的緩沖區(qū)指針
*/INintbuflen,
/*buf的長(zhǎng)度
*/); ●?WSACancelAsyncRequest():取消以上的異步服務(wù)類(lèi)函數(shù)引起的異步操作。 定義:
intWSAAPI WSACancelAsyncRequest( INHANDLEhAsyncTaskHandle/*指示被取消的操作的任務(wù)句柄*/); 3)異步選擇函數(shù)
Winsock提供的異步選擇函數(shù)用來(lái)選擇應(yīng)用程序感興趣的網(wǎng)絡(luò)事件,它允許應(yīng)用程序注冊(cè)一個(gè)或多個(gè)感興趣的網(wǎng)絡(luò)事件,當(dāng)這些事件發(fā)生時(shí),應(yīng)用程序相應(yīng)的窗口會(huì)收到一個(gè)消息。這類(lèi)函數(shù)主要有: ●?WSAAsyncSelect():發(fā)生注冊(cè)的感興趣的網(wǎng)絡(luò)事件時(shí),向指定窗口發(fā)送消息。 定義:
intWSAAPI WSAAsyncSelect( NSOCKETs,
/*
標(biāo)識(shí)請(qǐng)求事件通知的套接字描述符
*/ INunsignedintwMsg,
/*
事件發(fā)生時(shí)接收到的消息
*/ INlonglEvent,
/*
注冊(cè)網(wǎng)絡(luò)事件的位屏蔽
*/);
參數(shù)lEvent有以下八種,在某一時(shí)刻只能發(fā)生其中的一種情況:
FD_READ:讀就緒時(shí)接收通知。
FD_WRITE:寫(xiě)就緒時(shí)接收通知。
FD_OOB:帶外數(shù)據(jù)來(lái)到時(shí)接收通知。
FD_ACCEPT:連接時(shí)接收通知。 FD_CONNECT:連接建立時(shí)接收通知。
FD_CLOSE:socket關(guān)閉時(shí)接收通知。
FD_QOS:socket服務(wù)質(zhì)量改變時(shí)接收通知。
FD_GROUP_QOS:socket服務(wù)質(zhì)量改變時(shí)接收通知(為套接字組保留使用)。
4)阻塞處理函數(shù) 阻塞處理是必不可少的功能,這是Winsock提供的重要功能。之所以安排這樣的函數(shù)主要是適應(yīng)Windows的多線(xiàn)程環(huán)境,讓用戶(hù)可以自行建立和取消阻塞調(diào)用。這類(lèi)函數(shù)主要有: ●?WSAIsBlocking():檢測(cè)當(dāng)前是否有阻塞調(diào)用(在Winsock2.0之前的版本中使用)。定義:
BOOLWSAAPI sBlocking(void); /*如果有未完成的阻塞調(diào)用返回值TRUE*/ ●?WSACancelBlockingCall():結(jié)束當(dāng)前尚未完成的任何阻塞調(diào)用(在Winsock2.0之前的版本中使用)。 定義:
intWSAAPIWSACancelBlockingCall(void); /*返回值為0表示調(diào)用被取消
*/
定義:
intWSAAPIWSAUnhookBlockingHook(void); /*返回值為0表示程序被刪除
*/ 5)錯(cuò)誤處理函數(shù)
Winsock提供了兩個(gè)錯(cuò)誤處理函數(shù),在多線(xiàn)程環(huán)境中獲得和設(shè)置當(dāng)前線(xiàn)程的最近錯(cuò)誤號(hào)。這兩個(gè)函數(shù)分別為: ●?WSAGetLastError():獲得最近的錯(cuò)誤操作碼。
定義:
intWSAAPIWSAGetLastError(void); /*返回最近的錯(cuò)誤操作碼
*/
在應(yīng)用中,同樣可以使用getsockopt()的SO_ERROR獲得錯(cuò)誤碼,但它只能獲得特定的socket的錯(cuò)誤碼,而WSAGetLastError()得到的是所有socket中最近發(fā)生的錯(cuò)誤碼。 以下是該函數(shù)調(diào)用的示例:
/*根據(jù)錯(cuò)誤代碼,輸出相應(yīng)的錯(cuò)誤信息
*/ voidGetWSAError(){ intError; ●?WSASetLastError():應(yīng)用程序?yàn)楫?dāng)前線(xiàn)程設(shè)置錯(cuò)誤碼。 定義:
voidWSAAPI WSASetLastError( INintiError); /*指示由WSAGetLastError調(diào)用返回的錯(cuò)誤碼
*/
3.Winsock2擴(kuò)展函數(shù)
Winsock2.0版本是為了適應(yīng)32位網(wǎng)絡(luò)編程而制定的,網(wǎng)絡(luò)技術(shù)發(fā)展突飛猛進(jìn),早期的16位編程規(guī)范已經(jīng)不能適應(yīng)當(dāng)前的應(yīng)用,所以,在Winsock1.1版的基礎(chǔ)上,Winsock2.0提供了一個(gè)與協(xié)議無(wú)關(guān)的、具有實(shí)時(shí)網(wǎng)絡(luò)傳輸能力的socket。Winsock2.0在保證完全向下兼容的同時(shí),新增加了支持不同傳輸協(xié)議、與協(xié)議無(wú)關(guān)的名字解析協(xié)議、重疊I/O、QoS擴(kuò)展機(jī)制、與協(xié)議無(wú)關(guān)的多址廣播和多點(diǎn)通信等許多擴(kuò)展功能。
擴(kuò)展函數(shù)可以分為以下兩類(lèi):數(shù)據(jù)傳輸函數(shù)和名字注冊(cè)解析函數(shù)。
1)數(shù)據(jù)傳輸函數(shù) ●?WSAAccept():類(lèi)似于accept(),支持有條件的接收連接。 定義:
SOCKETWSAAPI WSAAccept(INSOCKETs,
/*標(biāo)識(shí)請(qǐng)求事件通知的套接字描述符
*/OUTstructsockaddrFAR*addr,
/*指向連接實(shí)體地址緩沖區(qū)指針
*/ INLPWSABUFlpCallerData,
/*
與連接請(qǐng)求一起發(fā)送的數(shù)據(jù)
*/ INOUTLPQOSlpSQOS,
/*
調(diào)用者指定的socket的流規(guī)格
*/ INOUTLPQOSlpGQOS,
/*
調(diào)用者創(chuàng)建socket組的流規(guī)格
*/ INLPWSABUFlpCalleeId,
/*
值參,連接實(shí)體的本地地址
*/OUTLPWSABUFlpCalleeData,
/*
接收連接實(shí)體發(fā)回的用戶(hù)數(shù)據(jù)
*/ OUTGROUPFAR*g,
/*
條件函數(shù)為g賦值以進(jìn)行不同的操作
*/ INDWORDdwCallbackData); /*WSAAccept調(diào)用的該參數(shù)的初始值
*/ ●?WSACloseEvent():關(guān)閉一個(gè)打開(kāi)的事件對(duì)象句柄。 定義:
BOOLWSAAPI WSACloseEvent(INWSAEVENThEvent); /*標(biāo)識(shí)一個(gè)打開(kāi)的事件對(duì)象句柄
*/ ●?WSAConnect():創(chuàng)建一個(gè)對(duì)等連接,交換連接數(shù)據(jù),并根據(jù)所提供的流規(guī)格確定提供的服務(wù)質(zhì)量,是connect()的擴(kuò)展形式。 定義:
intWSAAPI WSAConnect(INSOCKETs,
/*
標(biāo)識(shí)一個(gè)未連接socket的標(biāo)識(shí)符
*/
INconststructsockaddrFAR*name,
/*
連接方的名字
*/INintnamelen,
/*?name的長(zhǎng)度
*/ INLPWSABUF lpCallerData,
/*
指向用戶(hù)數(shù)據(jù)的指針,建立連接時(shí)傳送給對(duì)等方
*/ OUTLPWSABUFlpCalleeData,
/*
和lpCallerData相反,在建立連接時(shí)從對(duì)等方送回
本地主機(jī)
*/INLPQOSlpSQOS,
/*
每個(gè)該指針指向一個(gè)流規(guī)格的方向
*/ INLPQOSlpGQOS); /*
為套接字組保留,用法同lpSQOS?*/ ●?WSACreateEvent():創(chuàng)建一個(gè)事件對(duì)象。 定義:
WSAEVENTWSAAPIWSACcreate(Void); /*返回事件對(duì)象的句柄
*/ ●?WSADuplicateSocket():返回指定結(jié)構(gòu)的信息,為共享套接字創(chuàng)建新的套接字描述符。 定義:
intWSAAPI WSADuplicateSocket( INSOCKETs,
/*
標(biāo)識(shí)一個(gè)本地socket的標(biāo)識(shí)符
*/ INDWORDdwProcessID,
/*
上述socket的目標(biāo)進(jìn)程標(biāo)識(shí)
*/ OUTLPWSAPROTOCOL_INFOlpProtocolInfo); /*緩沖區(qū),用以存放WSAPROTOCOL_INFO
結(jié)構(gòu)
*/
●?WSAEnumNetworkEvents():檢查是否有網(wǎng)絡(luò)事件發(fā)生。 定義:
intWSAAPI WSAEnumNetworkEvents(INSOCKETs,
/*
標(biāo)識(shí) 一個(gè)本地socket的標(biāo)識(shí)符
*/ INWSAEVENThEventObject,
/*
標(biāo)識(shí)需要復(fù)位的事件(如果有這樣的事件)?*/ OUTLPWSANETWORKEVENTSlpNetworkEvents); /*
記錄事件和錯(cuò)誤代碼的數(shù)組
*/ ●?WSAEventSelect():把網(wǎng)絡(luò)事件和一個(gè)事件對(duì)象連接。 定義:
intWSAAPI WSAEventSelect( INSOCKETs,
/*
標(biāo)識(shí)一個(gè)本地socket的標(biāo)識(shí)符
*/ INWSAEVENThEventObject,
/*
標(biāo)識(shí)需要復(fù)位的事件(如果有這樣的事件)*/ INlonglNetworkEvents); /*
標(biāo)識(shí)一個(gè)lNetworkEvents指定的事件對(duì)象
*/ ●?WSAGetOverlappedResult():得到重疊操作的完成結(jié)果。 定義:
BOOLWSAAPI WSAGetOverlappedResult( INSOCKETs,
/*標(biāo)識(shí)一個(gè)本地socket的標(biāo)識(shí)符
*/ INLPWSAOVERL APPEDlpOverlapped, /*指向重疊操作時(shí)指定WSAOVERLAPPED結(jié)構(gòu)*/OUTLPDWORDlpcbTransfer,
/*指向一個(gè)存放發(fā)送字節(jié)數(shù)的變量
*/INBOOLfWait,
/*指示重疊操作是否完成
*/OUTLPDWORDlpdwFlags); /*完成狀態(tài)的標(biāo)志位變量
*/
●?WSAGetQoSByName():對(duì)于一個(gè)傳輸協(xié)議服務(wù)名字提供相應(yīng)的QoS參數(shù),初始化一個(gè)QoS結(jié)構(gòu)。 定義:
BOOLWSAAPI WSAGetQoSByName(INSOCKETs,
/*標(biāo)識(shí)一個(gè)本地socket的標(biāo)識(shí)符
*/ INOUTLPWSABUFlpQoSName,
/*?IN標(biāo)識(shí)QoS模板名,OUT標(biāo)識(shí)可用模板列表的緩沖區(qū)
*/OUTLPQOSlpQoS); /*
指向填充QoS結(jié)構(gòu)的指針
*/
●?WSAHtonl():把一個(gè)以主機(jī)字節(jié)順序表示的32位無(wú)符號(hào)長(zhǎng)整型數(shù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。 定義:
intWSAAPI WSAHtonl( INSOCKETs,
/*標(biāo)識(shí)一個(gè)本地socket的標(biāo)識(shí)符
*/ INu_longhostlong,
/*以主機(jī)字節(jié)順序表示的數(shù)
*/ OUTu_longFAR*lpnetlong); /*指向轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)順序的數(shù)的指針
*/ ●?WSAHtons():把一個(gè)以主機(jī)字節(jié)順序表示的16位無(wú)符號(hào)短整型數(shù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。 定義:
intWSAAPI WSAHtons( INSOCKETs,
/*標(biāo)識(shí)一個(gè)本地socket的標(biāo)識(shí)符
*/ INu_shorthostshort,
/*以主機(jī)字節(jié)順序表示的數(shù)
*/OUTu_shortFAR*lpnetshort); /*指向轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)順序的數(shù)的指針
*/ INDWORDcbOutBuffer,
/*?lpvOutBuffer的大小
*/OUTLPDWORDlpcbBytesReturned,
/*實(shí)際輸出字節(jié)數(shù)地址
*/ INLPWSAOVERLAPPEDlpOverlapped,
/*WSAOVERLAPPED結(jié)構(gòu)的地址
*/ INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine); /*指向操作結(jié)束后完成例程的指針
*/ OUTLPWSABUFlpCalleeData,
/*返回的用戶(hù)數(shù)據(jù)指針
*/INLPQOSlpSQOS,
/*每個(gè)該指針指向一個(gè)流規(guī)格的方向
*/INLPQOSlpGQOS); /*為套接字組保留,用法同lpSQOS?*/INDWORDdwFlags,
/*標(biāo)識(shí)socket是發(fā)送者或接收者
*/ ●?WSANtohl():ntohl()函數(shù)的擴(kuò)展版本,與WSAHtonl操作相反,將一個(gè)以網(wǎng)絡(luò)字節(jié)順序標(biāo)識(shí)的無(wú)符號(hào)長(zhǎng)整型數(shù)轉(zhuǎn)換為32位主機(jī)字節(jié)順序。
定義:
intWSAAPI WSANtohl( INSOCKETs,
/*標(biāo)識(shí)一個(gè)本地socket的標(biāo)識(shí)符
*/INu_longnetlong,
/*以網(wǎng)絡(luò)字節(jié)順序表示的數(shù)
*/OUTu_longFAR*lphostlong); /*指向轉(zhuǎn)換后的主機(jī)字節(jié)順序的數(shù)的指針
*/ ●?WSANtohs():ntohs()函數(shù)的擴(kuò)展版本,與WSAHtons操作相反,將一個(gè)以網(wǎng)絡(luò)字節(jié)順序標(biāo)識(shí)的無(wú)符號(hào)短整型數(shù)轉(zhuǎn)換為16位主機(jī)字節(jié)順序。
定義:
intWSAAPI WSARecv(INSOCKETs,
/*標(biāo)識(shí)一個(gè)已經(jīng)連接的socket的標(biāo)識(shí)符
*/INOUTLPWSABUFlpBuffer,
/*指向
WSABUF結(jié)構(gòu)數(shù)組的指針
*/INDWORDdwBufferCount,
/*緩沖區(qū)中WSABUF結(jié)構(gòu)的數(shù)目
*/
OUTLPDWORDlpNumberOfBytesRecvd,
/*指向本操作接收字節(jié)數(shù)的指針
*/ INOUTLPDWORDlpFlags,
/*指向標(biāo)志位的指針
*/INLPWSAOVERLAPPEDlpOverlapped,
/*WSAOVERLAPPED結(jié)構(gòu)的地址
*/INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine); /*指向操作結(jié)束后完成例程的指針
*/ OUTLPDWORDlpNumberOfBytesRecvd,
/*指向本操作接收字節(jié)數(shù)的指針
*/INOUTLPDWORDlpFlags,
/*指向標(biāo)志位的指針
*/INLPWSAOVERLAPPEDlpOverlapped,
/*WSAOVERLAPPED結(jié)構(gòu)的地址
*/INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine);/*指向操作結(jié)束后完成例程的指針
*/ ●?WSARecvDisconnect():終止套接字的接收操作。如果套接字是基于連接的,則讀取終止連接數(shù)據(jù)。 定義:
intWSAAPI WSARecvDisconnect(INSOCKETs,
/*標(biāo)識(shí)一個(gè)socket的標(biāo)識(shí)符
*/OUTLPWSABUFlpInboundDisconnectData); /*指向終止連接數(shù)據(jù)的指針
*/
●?WSARecvFrom():recvfrom()函數(shù)的擴(kuò)展版本,它支持分散/聚集I/O和重疊socket操作,接收一個(gè)數(shù)據(jù)報(bào)并保存源地址。 定義:
intWSAAPI WSARecvFrom( INSOCKETs,
/*標(biāo)識(shí)一個(gè)socket的標(biāo)識(shí)符
*/ INOUTLPWSABUFlpBuffer,
/*指向
WSABUF結(jié)構(gòu)數(shù)組的指針
*/INDWORDdwBufferCount,
/*緩沖區(qū)中WSABUF結(jié)構(gòu)的數(shù)目
*/OUTLPDWORDlpNumberOfBytesRecvd,
/*指向本操作接收字節(jié)數(shù)的指針
*/ ●?WSAResetEvent():重新初始化一個(gè)事件對(duì)象。 定義:
BOOLWSAAPI WSAResetEvent(INWSAEVENThEvent); /*標(biāo)識(shí)一個(gè)開(kāi)放的事件對(duì)象句柄
*/ ●?WSASend():send()函數(shù)的擴(kuò)展版本,它支持分散/聚集I/O和重疊套接字操作,在一個(gè)已經(jīng)連接的socket上發(fā)送數(shù)據(jù)。
定義:
intWSAAPI WSASend( INSOCKETs,
/*標(biāo)識(shí)一個(gè)已連接的socket的標(biāo)識(shí)符
*/INLPWSABUFlpBuffer,
/*指向
WSABUF結(jié)構(gòu)數(shù)組的指針
*/ INDWORDdwBufferCount,
/*緩沖區(qū)中WSABUF結(jié)構(gòu)的數(shù)目
*/ OUTLPDWORDlpNumberOfBytesSent, /*指向本操作發(fā)送字節(jié)數(shù)的指針
*/ INDWORDdwFlags,
/*操作標(biāo)志位
*/ INLPWSAOVERLAPPEDlpOverlapped,
/*WSAOVERLAPPED結(jié)構(gòu)的地址
*/ INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine); /*指向操作結(jié)束后完成例程的指針
*/ ●?WSASendTo():sendto()函數(shù)的擴(kuò)展版本,它支持分散/聚集I/O和重疊套接字操作,可以向指定地址發(fā)送數(shù)據(jù)。 定義:
intWSAAPI WSASendTo(INSOCKETs,
/*標(biāo)識(shí)一個(gè)socket的標(biāo)識(shí)符
*/ INLPWSABUFlpBuffer,
/*指向
WSABUF結(jié)構(gòu)數(shù)組的指針
*/ INDWORDdwBufferCount,
/*緩沖區(qū)中WSABUF結(jié)構(gòu)的數(shù)目
*/ OUTLPDWORDlpNumberOfBytesSent,
/*指向本操作發(fā)送字節(jié)數(shù)的指針
*/ INDWORDdwFlags,
/*操作標(biāo)志位
*/INconststructsockaddrFAR*lpTo,
/*指向目的socket地址的指針
*/INintiTolen,
/*?lpTo的長(zhǎng)度
*/
定義:
SOCKETWSAAPI WSASocket( INintaf,
/*地址描述參數(shù)
*/INinttype,
/*創(chuàng)建的socket類(lèi)型描述
*/INintprotocol,
/*使用的協(xié)議
*/INLPWSAPROTOCOL_INFOlpProtocolInfo,
/*指向結(jié)構(gòu)定義的指針
*/INGROUPg,
/*保留為socket組使用
*/INDWORDdwFlags); /*?socket屬性描述
*/ 2)名字注冊(cè)解析函數(shù) ●?WSAAddressToString():顯示SOCKADDR中的信息。 定義:
INTWSAAPI WSAAddressToString( INLPSOCKADDRlpsaAddress,
/*要轉(zhuǎn)換的SOCKADDR結(jié)構(gòu)的信息
*/INDWORDdwAddressLength,
/*SOCKADDR的地址長(zhǎng)度
*/ INLPWSAPROTOCOL_INFOlpProtocolInfo,
/*指向結(jié)構(gòu)定義的指針
*/ OUTLPTSTRlpszAddressString,
/*存放轉(zhuǎn)換后的地址字符串的緩沖區(qū)
*/ INOUTLPDWORDlpdwAddressStringlength); /*作輸入是指地址緩沖區(qū)長(zhǎng)度,作輸出是
指緩沖區(qū)字符串的實(shí)際長(zhǎng)度
*/ ●?WSAEnumNameSpaceProviders():檢索可用的名字空間。 定義:
INTWSAAPI WSAEnumNameSpaceProviders( INOUTLPDWORDlpdwBufferLength,
/*作輸入是指緩沖區(qū)字節(jié)數(shù),作輸出是指檢索所有
請(qǐng)求信息需要傳遞的緩沖區(qū)的最小字節(jié)數(shù)
*/ OUTLPWSANAMES PACE_INFOlpnspBuffer); /*指示該函數(shù)返回值緩沖區(qū)的指針
*/ ●?WSAGetServiceClassInfo():檢索服務(wù)所屬類(lèi)的信息。 定義:
INTWSAAPI WSAGetServiceClassInfo( INLPGUIDlpProviderId,
/*指向名字空間提供著的指針
*/ INLPGUIDlpServiceClassId,
/*指向要查詢(xún)的服務(wù)類(lèi)的指針
*/
INOUTLPGUIDlpdwBufferLength,
/*作輸入是指緩沖區(qū)字節(jié)數(shù),作輸出是指檢索所有請(qǐng)求信息需要傳遞的緩沖區(qū)的最小字節(jié)數(shù)
*/ OUTLPWSASERVICECLASSINFOlpServiceClassInfo); /*存放服務(wù)類(lèi)信息的緩沖區(qū)
*/ ●?WSAInstallServiceClass():注冊(cè)服務(wù)類(lèi)的特定信息。 定義:
INTWSAAPI WSAInstallServiceClass(INLPWSASERVICECLASSINFOlpServiceClassInfo); /*存放服務(wù)類(lèi)信息的緩沖區(qū)
*/ ●?WSALookupServiceBegin():用戶(hù)指定查詢(xún)的初始化,返回一個(gè)句柄,和函數(shù)WSALookupServiceNext()配合使用。 定義:
INTWSAAPI WSALookupServiceBegin( INLPWSAQUERYSETlpqsRestrictions, ?/*WSAQUERYSET結(jié)構(gòu)指定查詢(xún)標(biāo)準(zhǔn)
*/INDWORDdwControlFlags,
/*控制查詢(xún)深度標(biāo)志
*/OUTLPHANDLElphLookup); /*?WSALookupServiceNext()調(diào)用的句柄
*/ INDWORDdwControlFlags,
/*指示下一次操作的標(biāo)識(shí)
*/ INOUTLPGUIDlpdwBufferLength,
/*作輸入是指lpqsResults的字節(jié)數(shù),作輸出是指lpqsResults指示的最小字節(jié)數(shù)
*/OUTLPWSAQUERYSETlpqsResults); /*返回結(jié)果所在的內(nèi)存地址指針
*/ ●?WSARemoveServiceClass():注銷(xiāo)服務(wù)類(lèi)概要。 定義:
INTWSAAPIWSARemoveServiceClass(INLPGUIDlpServiceClassId);/*指示要注銷(xiāo)服務(wù)類(lèi)指針
*/ ●?WSAStringToAddress():將可讀字符串轉(zhuǎn)換為socket地址結(jié)構(gòu)。 定義:
INTWSAAPI WSAStringToAddress( INLPTSTRAddressString,
/*指示需要轉(zhuǎn)換的字符串
*/ ININTAddressFamily,
/*字符串所屬地址簇
*/ INLPWSAPROTOCOL_INFOlpProtocolInfo,/*指向與要使用的提供者相關(guān)的
WSAPROTOCOL_INFO?*/
●?FD_ISSET:如果fd是socket集合的元素,則返回真值,否則為0。 定義:
BOOLFD_ISSET(SOCKETfd,
fd_setFAR*set) /*?set是指向socket集合結(jié)構(gòu)的指針
*/ ●?FD_SET:添加socket描述符fd到集合set中。 定義:
voidFD_SET(SOCKETfd,
fd_setFAR*set) /*?set是指向socket集合結(jié)構(gòu)的指針
*/ ●?FD_ZERO:初始化socket集合。 定義:voidFD_ZERO(fd_setFAR*set) /*?fd_setFAR*是指向socket結(jié)構(gòu)的指針
*/
注意:以上以FD開(kāi)頭定義的宏都是針對(duì)socket集合fd_set制定的,應(yīng)用程序開(kāi)發(fā)者最好使用這些宏對(duì)集合進(jìn)行操作,可以避免很多錯(cuò)誤。 ●?WSAGETASYNCBFLEN:從異步服務(wù)函數(shù)的操作完成
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 文體活動(dòng)大比賽活動(dòng)方案
- 春季科技宣傳月活動(dòng)方案
- 春耕幫扶活動(dòng)方案
- 新農(nóng)村戶(hù)外運(yùn)動(dòng)活動(dòng)方案
- 文化徒步活動(dòng)方案
- 斗地主工會(huì)活動(dòng)方案
- 文安理發(fā)活動(dòng)方案
- 春節(jié)女裝活動(dòng)方案
- 文體活動(dòng)方案活動(dòng)方案
- 春天居家親子活動(dòng)方案
- 中國(guó)凈菜行業(yè)市場(chǎng)深度研究及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 糖尿病飲食治療講課件
- 輸液反應(yīng)急救護(hù)理流程講課件
- 鋼結(jié)構(gòu)倉(cāng)庫(kù)施工組織設(shè)計(jì)
- 變電站電氣設(shè)備管理制度
- 中國(guó)農(nóng)田水利行業(yè)發(fā)展前景及發(fā)展策略與投資風(fēng)險(xiǎn)研究報(bào)告2025-2028版
- 50篇短文搞定高考英語(yǔ)3500單詞
- 物業(yè)消防檢查培訓(xùn)課件
- 專(zhuān)題 完形填空 七年級(jí)英語(yǔ)下冊(cè)期末復(fù)習(xí)考點(diǎn)培優(yōu)專(zhuān)項(xiàng)北師大版(2024版)(含答案解析)
- 江蘇省2025年中職職教高考文化統(tǒng)考數(shù)學(xué)試題答案
- GB/Z 27021.13-2025合格評(píng)定管理體系審核認(rèn)證機(jī)構(gòu)要求第13部分:合規(guī)管理體系審核與認(rèn)證能力要求
評(píng)論
0/150
提交評(píng)論