《網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)》課件第8章 Windows網(wǎng)絡(luò)編程_第1頁(yè)
《網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)》課件第8章 Windows網(wǎng)絡(luò)編程_第2頁(yè)
《網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)》課件第8章 Windows網(wǎng)絡(luò)編程_第3頁(yè)
《網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)》課件第8章 Windows網(wǎng)絡(luò)編程_第4頁(yè)
《網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)》課件第8章 Windows網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論