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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第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ā)展使人們想到是否可以把它移植過來。于是,1993年就出現(xiàn)了Winsock1.0版本規(guī)范,這個版本定義了16位的網(wǎng)絡(luò)編程接口。當(dāng)然,它很快就不能適應(yīng)32位的需要了,接著,1994年5月,Winsock2.0版本問世了。1997年5月,Winsock2.0的規(guī)范版本W(wǎng)insock2.2.1正式發(fā)布。有了這個接口,程序員就可以很方便地編寫符合Windows編程模式的軟件,大大方便了網(wǎng)絡(luò)程序的開發(fā)。接下來介紹一下Winsock的組成和使用。 8.1.2Winsock規(guī)范的組成及適用范圍 因為Winsock是從UNIX系統(tǒng)中的socket得到的啟發(fā)和利用,當(dāng)然就少不了UNIX的一些特性。完成一個網(wǎng)絡(luò)連接的信息主要有協(xié)議族、本地端口號、本地主機地址、遠程端口號、遠程主機地址、服務(wù)類型等,socket中必須包含這些信息才能完成連接。在Winsock2.0及以后的版本中均提供了標(biāo)準(zhǔn)服務(wù)提供接口(SPI,StandardServiceProviderInterface),如果系統(tǒng)安裝了相應(yīng)的協(xié)議后,則通過SPI,Winsock可以應(yīng)用于很多的網(wǎng)絡(luò)中。

對于網(wǎng)絡(luò)應(yīng)用程序的開發(fā)者來說,Winsock提供的開發(fā)組件包括WinsockAPI和一些頭文件。對于網(wǎng)絡(luò)通信的實現(xiàn)來說,Winsock提供的運行組件是WinsockAPI的動態(tài)鏈接庫(DLL)。WinsockDLL有不同的版本,但它的使用對用戶來說是透明的,用戶不必關(guān)心不同版本之間的協(xié)商問題。

Winsock支持流socket和數(shù)據(jù)報socket,這兩種類型的socket提供的數(shù)據(jù)流服務(wù)不同,前者提供面向連接的、可靠的、無重復(fù)的數(shù)據(jù)傳輸,內(nèi)設(shè)流量控制機制;后者提供無連接的、不可靠的數(shù)據(jù)傳輸,沒有流量控制機制,所以接收的數(shù)據(jù)可能和發(fā)送的數(shù)據(jù)順序不一致。

就像網(wǎng)絡(luò)通信需要協(xié)議的支持一樣,網(wǎng)絡(luò)程序的開發(fā)和使用也要有一定規(guī)則的支持,Winsock規(guī)范的初衷就是提供這樣的支持。遵循這套規(guī)范開發(fā)的軟件就被認為是Winsock兼容的。

8.1.3Winsock的主要特點 正如前面提到的,Winsock是從UNIX移植過來的,這就注定了它具有繼承性,同時,它又是針對Windows系統(tǒng)而開發(fā)的,具有其擴展性。

熟悉UNIX系統(tǒng)的人在用到Winsock的時候會感到很親切,因為它們都有相似的環(huán)境。在Winsock中使用的一些庫函數(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)用戶在不同版本的Windows系統(tǒng)下使用。比較特殊的是WindowsCE只支持Winsock1.1版本,其他的Windows系統(tǒng)都可以適用最新的Winsock2.0以上的版本。

由于Winsock支持的Windows版本眾多,其中既有單線程的,也有多線程的,因此在使用多線程時尤其要注意終止socket的工作。接下來我們就來看一下Winsock是如何開始和終止它的工作的。 8.1.4Winsock的啟動和終止 前面已經(jīng)介紹了使用一個socket的時候要先創(chuàng)建它,Winsock也是如此。這里介紹WSAStartup()函數(shù)和WSACleanup()函數(shù)。當(dāng)一個Winsock應(yīng)用程序啟動時,首先要加載WinsockDLL,并且視不同的版本而加載不同的WinsockDLL,然后,我們就可以開始啟動工作了。Winsock的實現(xiàn)依賴于它的庫函數(shù)DLL,每一個Winsock應(yīng)用程序首先都要調(diào)用WSAStartup()函數(shù),成功啟動該函數(shù)之后,應(yīng)用程序就可以執(zhí)行其他的Winsock API函數(shù)了。WSAStartup()函數(shù)的描述如下:

intPASCALFARWSAStartup(WORDwVersionRequested,LPWSADATA*lpWSAData);

其中各函數(shù)的含義為: ●?PASCAL:使用PASCAL風(fēng)格的函數(shù); ●?FAR:說明此函數(shù)所在的代碼段可能和應(yīng)用程序所在的代碼段不同; ●?wVersionRequested:指定WinsockAPI的版本號; ●?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è)置的版本號; ●?wHighVersion:返回Winsock能兼容的最高版本號; ●?szDescription:說明修訂版本號等信息; ●?szSystemStatus:返回特殊系統(tǒng)組合設(shè)置; ●?iMaxSockets:在較低版本的Winsock中返回應(yīng)用程序可以使用的最大版本號,Winsock2.0以上版本不再使用; ●?iMaxUdpDg:在較低版本的Winsock中返回Winsock發(fā)送或接收的UDP數(shù)據(jù)最大長度,Winsock2.0以上版本不再使用; ●?lpVendorInfo:在較低版本的Winsock中返回Winsock制造商信息,Winsock2.0以上版本不再使用。

應(yīng)用程序可以視不同的需要多次讀取WSAData結(jié)構(gòu)信息,每一次讀取都是對WSAStartup()函數(shù)的調(diào)用,在結(jié)束的時候必須調(diào)用同樣次數(shù)的WSACleanup()函數(shù),因為它們必須是成對出現(xiàn)的。WSACleanup()函數(shù)的描述如下:

intWSACleanup(void);

其中,void=0表示完成。 以下是調(diào)用WSAStartup()函數(shù)和WSACleanup()函數(shù)的示例:

/*socketversionrequested2.0*/ WORDversion=0x0002; WSADATAWSAData; /*

用來獲取Windows套接字的具體實現(xiàn)信息

*/ /*獲取當(dāng)前套接字的信息,將結(jié)果保存在WSAData變量里

*/voidSocketmodel(void){intiReturn;iReturn=WSAStartup(Version,&WSAData); /*

獲取版本信息

*/if(iReturn!=ERROR_SUCCESS){/*錯誤處理程序

*/cout<<"WindowsSocketisnotresponded.";}/*應(yīng)用程序代碼段

*/iReturn=WSACleanup();/*

進行所有的清除工作,并且終止所有的套接字操作線程

*/if(iReturn!=ERROR_SUCCESS){cout<<"WindowsSocketscannotbeclosed.";}else{cout<<"WindowsSocketsisclosed.";}}

為了實現(xiàn)安全的網(wǎng)絡(luò)連接,我們在調(diào)用此函數(shù)之前,應(yīng)該先調(diào)用shutdown()函數(shù),關(guān)閉連接,然后再執(zhí)行終止socket的工作,釋放資源。并不是每一次調(diào)用的時候都釋放資源,否則仍在使用該套接字的應(yīng)用程序就會受到影響。實質(zhì)上,最后一個調(diào)用的WSACleanup()函數(shù)才真正地釋放資源,之前其他的調(diào)用只是在計數(shù)器上減少數(shù)量而已。 8.1.5WinsockAPI函數(shù) 在8.1.4節(jié)中我們已經(jīng)接觸到了Winsock的兩個函數(shù):WSAStartup()函數(shù)和WSACleanup()函數(shù)。本節(jié)將詳細介紹WinsockAPI函數(shù),了解各函數(shù)的定義、功能、參數(shù)設(shè)置及意義。 對于標(biāo)準(zhǔn)的socket函數(shù),前面已經(jīng)詳細描述,這里不再詳述,下面只介紹Winsock1.1專用函數(shù)和Winsock2擴展函數(shù)。 1.域名地址 在Internet上訪問遠程主機的時候,我們會輸入IP地址或如這樣的地址,但在Winsock中,這樣的地址是不能被識別的,必須轉(zhuǎn)換為socket地址結(jié)構(gòu)。反之,socket數(shù)據(jù)結(jié)構(gòu)的地址也必須轉(zhuǎn)換為用戶理解的形式。這種地址轉(zhuǎn)換工作是由數(shù)據(jù)庫函數(shù)實現(xiàn)的。這些函數(shù)通過訪問各種數(shù)據(jù)庫資源,獲得域名、服務(wù)、協(xié)議等信息。在Winsock2.0以后的版本中,應(yīng)用程序要使用其他函數(shù)實現(xiàn)(參見本章Winsock2擴展函數(shù)),此類函數(shù)只是為了兼容而保留了下來,但我們還是需要了解一下這些函數(shù)。具體函數(shù)描述如下: ●?gethostbyaddr():根據(jù)網(wǎng)絡(luò)地址獲得域名或IP地址。

定義:

structhostentFAR*WSAAPI stcharFAR*addr,/*指向一個以網(wǎng)絡(luò)字節(jié)順序表示的32位網(wǎng)絡(luò)地址指針

*/??INintlen,

/*addr的字節(jié)數(shù)

*/??INinttype); ?/*

地址類型

*/

函數(shù)根據(jù)網(wǎng)絡(luò)地址獲得遠程主機信息,返回的信息包含在以下指針結(jié)構(gòu)中:

structhostent{ charFAR*h_name; ?/*

返回主機名字

*/ charFAR*h_aliases; ? /*

返回主機別名,是一個以NULL結(jié)束的別名數(shù)組

*/ shorth_length; ? /*

返回地址的字節(jié)數(shù)

*/ charFAR*h_addr_list; ?/*

一個以NULL結(jié)束的地址表,以網(wǎng)絡(luò)字節(jié)順序表示

*/} structhostent{ charFAR*h_name; ?/*

返回主機名字

*/ charFAR*h_aliases; ? /*

返回主機別名,是一個以NULL結(jié)束的別名數(shù)組

*/ shorth_length; ? /*

返回地址的字節(jié)數(shù)

*/ charFAR*h_addr_list; ?/*

一個以NULL結(jié)束的地址表,以網(wǎng)絡(luò)字節(jié)順序表示

*/ } structhostent{ charFAR*h_name; ?/*

返回主機名字

*/ charFAR*h_aliases; ? /*

返回主機別名,是一個以NULL結(jié)束的別名數(shù)組

*/ shorth_length; ? /*

返回地址的字節(jié)數(shù)

*/ charFAR*h_addr_list; ?/*

一個以NULL結(jié)束的地址表,以網(wǎng)絡(luò)字節(jié)順序表示

*/} ●?gethostbyname():根據(jù)主機名獲得主機信息。 定義:

structhostentFAR*WSAAPI gethostbyname(INconstcharFAR*name); /*獲得主機名字

*/

該函數(shù)返回一個hostent結(jié)構(gòu)指針,包括主機名和地址信息。 以下是該函數(shù)調(diào)用的示例: voidResolveHostMsg(void) { charHostName[256]; /*

首先獲取本地主機名稱,將主機名保存在HostName里

*/ gethostname(HostName,sizeof(HostName)); /*

得到主機名,主機名長度

*/ ethostbyname(HostName); /*

通過函數(shù)gethostbyname取得的主機名和地址信息生成hostent結(jié)構(gòu)

*/ if(Host==0){ /*如果主機名非法,則輸出錯誤提示

*/ cout<<"IPError."; }else /*輸出主機信息

*/ { cout<<Host->h_name<<endl; /*

輸出主機名

*/

cout<<Host->h_alias<<endl; /*

輸出主機別名

*/ cout<<Host->addrtype<<endl; /*

輸出IP地址類型

*/ } } ●?gethostname():在指定緩沖區(qū)中返回主機名。 定義:

intWSAAPI gethostname( OUTcharFAR*name,

/*指向接收主機名的緩沖區(qū)的指針

*/ INintnamelen /*緩沖區(qū)長度*/ };

以下是該函數(shù)調(diào)用的示例:

/*解析主機名,并將解析結(jié)果保存成AnsiString類型。AnsiString類是功能很強的字串類。AnsiString類構(gòu)造器可以從Char、Char*、int或double生成AnsiString類對象。這些構(gòu)造器很容易將直接字串賦予AnsiString類并將整數(shù)或浮點數(shù)變成字串

*/ AnsiStringResolveHostName(void){ charHostName[256]; /*首先獲取本地主機名稱,將主機名保存在HostName里

*/ gethostname(HostName,sizeof(HostName)); /*得到主機名,主機名長度

*/return(Strpas (HostName));/*將解析結(jié)果通過Strps()函數(shù)轉(zhuǎn)化成指定的AnsiString類型,

并返回

*/}

以下是該函數(shù)調(diào)用的示例:AnsiStringGetProtol(AnsiStringProtocalName){Protoent*Protocol=getprotobyname(ProtocalName.c_strc);/*

定義一個Protoent類型的指針變量來保存獲取的協(xié)議信息

*/if(Protocol!=0){/*

如果獲取的協(xié)議合法,返回協(xié)議號:協(xié)議名稱

*/return(IntToStr(Protocol->p_proto)+":"+StrPas(Protocol->p_name));/*

通過IntToStr函數(shù)將結(jié)果轉(zhuǎn)化為字串類型

*/else{/*如果不合法,則返回0*/return(AnsiString)0;}}} ●?getprotobynumber():通過協(xié)議號獲得協(xié)議信息。 定義:

structprotoentFAR*WSAAPI getprotobynumber(INintnumber); /*

以主機字節(jié)順序表示的協(xié)議號

*/

以下是該函數(shù)調(diào)用的示例:

/*獲取協(xié)議

*/ voidGetProtocol(void){ /*獲取協(xié)議,判斷協(xié)議是否合法,并循環(huán)輸出合法的協(xié)議號及對應(yīng)的協(xié)議名稱

*/ 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ù)端口號。它通過給定服務(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ù)端口號

*/ charFAR*s_proto /*

連接時所用到的協(xié)議名

*/ }; ●?getservbyport():獲得服務(wù)信息,包括服務(wù)名和服務(wù)端口號。與getservbyname不同的是它通過給定端口號和協(xié)議名獲得。 定義:

structserventFAR*WSAAPI getservbyport( INintport,

/*以網(wǎng)絡(luò)字節(jié)順序表示的服務(wù)使用的端口號

*/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ù)名稱

*/cout<<Serv->s_port<<endl; /*協(xié)議服務(wù)端口號

*/cout<<Serv->s_proto<<endl; /*協(xié)議號

*/}} 2.Winsock1.1專用函數(shù)

Winsock1.1對BerkeleySocket標(biāo)準(zhǔn)函數(shù)的擴充主要是實現(xiàn)對網(wǎng)絡(luò)事件基于消息的異步存取。根據(jù)實現(xiàn)功能的不同,可以將這些函數(shù)分為以下五類:

1)啟動和終止函數(shù)

WSAStartup()函數(shù)和WSACleanup()函數(shù),前面我們已經(jīng)介紹過,這里不再贅述。

2)異步服務(wù)函數(shù) 在BerkeleySockets標(biāo)準(zhǔn)函數(shù)中,請求服務(wù)是阻塞的,在Winsock中,這些函數(shù)可以實現(xiàn)應(yīng)用程序異步獲取請求信息,并在服務(wù)完成后返回一個應(yīng)答消息。這類函數(shù)主要有: ●?WSAAsyncGetHostByAddr():通過網(wǎng)絡(luò)地址獲得主機名字和地址信息。

定義:

HANDLEWSAAPI/*初始化成功后返回一個HANDLE類型的非零值*/ WSAAsyncGetHostByAddr( INHWNDhWnd,

/*請求完成時,接收消息的窗口句柄

*/INunsignedintwMsg,

/*請求完成時接收到的消息

*/INconstcharFAR*addr,

/*指向用網(wǎng)絡(luò)字節(jié)順序存儲的主機網(wǎng)絡(luò)地址的指針

*/INintlen,

/*地址長度

*/INinttype,

/*地址類型

*/OUTcharFAR*buf,

/*接收主機信息的數(shù)據(jù)緩沖區(qū)指針

*/INintbuflen,

/*?buf的長度

*/);

●?WSAAsyncGetProtoByName():通過協(xié)議名獲得協(xié)議名字和協(xié)議號信息。 定義:

HANDLEWSAAPI WSAAsyncGetProtoByName( INHWNDhWnd,

/*

請求完成時,接收消息的窗口句柄

*/INunsignedintwMsg,

/*

請求完成時接收到的消息

*/INconstcharFAR*name,

/*

指向主機名字的指針

*/OUTcharFAR*buf,

/*

接收協(xié)議信息的數(shù)據(jù)緩沖區(qū)指針

*/INintbuflen,

/*?buf的長度

*/);

●?WSAAsyncGetServByName():通過服務(wù)名和協(xié)議名獲得服務(wù)信息。 定義:

HANDLEWSAAPI WSAAsyncGetServByName(INHWNDhWnd,

/*

請求完成時,接收消息的窗口句柄

*/INunsignedintwMsg,

/*

請求完成時接收到的消息

*/

INconstcharFAR*name,

/*

指向服務(wù)名的指針

*/INconstcharFAR*proto,

/*

指向協(xié)議名的指針

*/OUTcharFAR*buf,

/*

接收服務(wù)數(shù)據(jù)的緩沖區(qū)指針

*/INintbuflen,

/*buf的長度

*/); ●?WSACancelAsyncRequest():取消以上的異步服務(wù)類函數(shù)引起的異步操作。 定義:

intWSAAPI WSACancelAsyncRequest( INHANDLEhAsyncTaskHandle/*指示被取消的操作的任務(wù)句柄*/); 3)異步選擇函數(shù)

Winsock提供的異步選擇函數(shù)用來選擇應(yīng)用程序感興趣的網(wǎng)絡(luò)事件,它允許應(yīng)用程序注冊一個或多個感興趣的網(wǎng)絡(luò)事件,當(dāng)這些事件發(fā)生時,應(yīng)用程序相應(yīng)的窗口會收到一個消息。這類函數(shù)主要有: ●?WSAAsyncSelect():發(fā)生注冊的感興趣的網(wǎng)絡(luò)事件時,向指定窗口發(fā)送消息。 定義:

intWSAAPI WSAAsyncSelect( NSOCKETs,

/*

標(biāo)識請求事件通知的套接字描述符

*/ INunsignedintwMsg,

/*

事件發(fā)生時接收到的消息

*/ INlonglEvent,

/*

注冊網(wǎng)絡(luò)事件的位屏蔽

*/);

參數(shù)lEvent有以下八種,在某一時刻只能發(fā)生其中的一種情況:

FD_READ:讀就緒時接收通知。

FD_WRITE:寫就緒時接收通知。

FD_OOB:帶外數(shù)據(jù)來到時接收通知。

FD_ACCEPT:連接時接收通知。 FD_CONNECT:連接建立時接收通知。

FD_CLOSE:socket關(guān)閉時接收通知。

FD_QOS:socket服務(wù)質(zhì)量改變時接收通知。

FD_GROUP_QOS:socket服務(wù)質(zhì)量改變時接收通知(為套接字組保留使用)。

4)阻塞處理函數(shù) 阻塞處理是必不可少的功能,這是Winsock提供的重要功能。之所以安排這樣的函數(shù)主要是適應(yīng)Windows的多線程環(huán)境,讓用戶可以自行建立和取消阻塞調(diào)用。這類函數(shù)主要有: ●?WSAIsBlocking():檢測當(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)錯誤處理函數(shù)

Winsock提供了兩個錯誤處理函數(shù),在多線程環(huán)境中獲得和設(shè)置當(dāng)前線程的最近錯誤號。這兩個函數(shù)分別為: ●?WSAGetLastError():獲得最近的錯誤操作碼。

定義:

intWSAAPIWSAGetLastError(void); /*返回最近的錯誤操作碼

*/

在應(yīng)用中,同樣可以使用getsockopt()的SO_ERROR獲得錯誤碼,但它只能獲得特定的socket的錯誤碼,而WSAGetLastError()得到的是所有socket中最近發(fā)生的錯誤碼。 以下是該函數(shù)調(diào)用的示例:

/*根據(jù)錯誤代碼,輸出相應(yīng)的錯誤信息

*/ voidGetWSAError(){ intError; ●?WSASetLastError():應(yīng)用程序為當(dāng)前線程設(shè)置錯誤碼。 定義:

voidWSAAPI WSASetLastError( INintiError); /*指示由WSAGetLastError調(diào)用返回的錯誤碼

*/

3.Winsock2擴展函數(shù)

Winsock2.0版本是為了適應(yīng)32位網(wǎng)絡(luò)編程而制定的,網(wǎng)絡(luò)技術(shù)發(fā)展突飛猛進,早期的16位編程規(guī)范已經(jīng)不能適應(yīng)當(dāng)前的應(yīng)用,所以,在Winsock1.1版的基礎(chǔ)上,Winsock2.0提供了一個與協(xié)議無關(guān)的、具有實時網(wǎng)絡(luò)傳輸能力的socket。Winsock2.0在保證完全向下兼容的同時,新增加了支持不同傳輸協(xié)議、與協(xié)議無關(guān)的名字解析協(xié)議、重疊I/O、QoS擴展機制、與協(xié)議無關(guān)的多址廣播和多點通信等許多擴展功能。

擴展函數(shù)可以分為以下兩類:數(shù)據(jù)傳輸函數(shù)和名字注冊解析函數(shù)。

1)數(shù)據(jù)傳輸函數(shù) ●?WSAAccept():類似于accept(),支持有條件的接收連接。 定義:

SOCKETWSAAPI WSAAccept(INSOCKETs,

/*標(biāo)識請求事件通知的套接字描述符

*/OUTstructsockaddrFAR*addr,

/*指向連接實體地址緩沖區(qū)指針

*/ INLPWSABUFlpCallerData,

/*

與連接請求一起發(fā)送的數(shù)據(jù)

*/ INOUTLPQOSlpSQOS,

/*

調(diào)用者指定的socket的流規(guī)格

*/ INOUTLPQOSlpGQOS,

/*

調(diào)用者創(chuàng)建socket組的流規(guī)格

*/ INLPWSABUFlpCalleeId,

/*

值參,連接實體的本地地址

*/OUTLPWSABUFlpCalleeData,

/*

接收連接實體發(fā)回的用戶數(shù)據(jù)

*/ OUTGROUPFAR*g,

/*

條件函數(shù)為g賦值以進行不同的操作

*/ INDWORDdwCallbackData); /*WSAAccept調(diào)用的該參數(shù)的初始值

*/ ●?WSACloseEvent():關(guān)閉一個打開的事件對象句柄。 定義:

BOOLWSAAPI WSACloseEvent(INWSAEVENThEvent); /*標(biāo)識一個打開的事件對象句柄

*/ ●?WSAConnect():創(chuàng)建一個對等連接,交換連接數(shù)據(jù),并根據(jù)所提供的流規(guī)格確定提供的服務(wù)質(zhì)量,是connect()的擴展形式。 定義:

intWSAAPI WSAConnect(INSOCKETs,

/*

標(biāo)識一個未連接socket的標(biāo)識符

*/

INconststructsockaddrFAR*name,

/*

連接方的名字

*/INintnamelen,

/*?name的長度

*/ INLPWSABUF lpCallerData,

/*

指向用戶數(shù)據(jù)的指針,建立連接時傳送給對等方

*/ OUTLPWSABUFlpCalleeData,

/*

和lpCallerData相反,在建立連接時從對等方送回

本地主機

*/INLPQOSlpSQOS,

/*

每個該指針指向一個流規(guī)格的方向

*/ INLPQOSlpGQOS); /*

為套接字組保留,用法同lpSQOS?*/ ●?WSACreateEvent():創(chuàng)建一個事件對象。 定義:

WSAEVENTWSAAPIWSACcreate(Void); /*返回事件對象的句柄

*/ ●?WSADuplicateSocket():返回指定結(jié)構(gòu)的信息,為共享套接字創(chuàng)建新的套接字描述符。 定義:

intWSAAPI WSADuplicateSocket( INSOCKETs,

/*

標(biāo)識一個本地socket的標(biāo)識符

*/ INDWORDdwProcessID,

/*

上述socket的目標(biāo)進程標(biāo)識

*/ OUTLPWSAPROTOCOL_INFOlpProtocolInfo); /*緩沖區(qū),用以存放WSAPROTOCOL_INFO

結(jié)構(gòu)

*/

●?WSAEnumNetworkEvents():檢查是否有網(wǎng)絡(luò)事件發(fā)生。 定義:

intWSAAPI WSAEnumNetworkEvents(INSOCKETs,

/*

標(biāo)識 一個本地socket的標(biāo)識符

*/ INWSAEVENThEventObject,

/*

標(biāo)識需要復(fù)位的事件(如果有這樣的事件)?*/ OUTLPWSANETWORKEVENTSlpNetworkEvents); /*

記錄事件和錯誤代碼的數(shù)組

*/ ●?WSAEventSelect():把網(wǎng)絡(luò)事件和一個事件對象連接。 定義:

intWSAAPI WSAEventSelect( INSOCKETs,

/*

標(biāo)識一個本地socket的標(biāo)識符

*/ INWSAEVENThEventObject,

/*

標(biāo)識需要復(fù)位的事件(如果有這樣的事件)*/ INlonglNetworkEvents); /*

標(biāo)識一個lNetworkEvents指定的事件對象

*/ ●?WSAGetOverlappedResult():得到重疊操作的完成結(jié)果。 定義:

BOOLWSAAPI WSAGetOverlappedResult( INSOCKETs,

/*標(biāo)識一個本地socket的標(biāo)識符

*/ INLPWSAOVERL APPEDlpOverlapped, /*指向重疊操作時指定WSAOVERLAPPED結(jié)構(gòu)*/OUTLPDWORDlpcbTransfer,

/*指向一個存放發(fā)送字節(jié)數(shù)的變量

*/INBOOLfWait,

/*指示重疊操作是否完成

*/OUTLPDWORDlpdwFlags); /*完成狀態(tài)的標(biāo)志位變量

*/

●?WSAGetQoSByName():對于一個傳輸協(xié)議服務(wù)名字提供相應(yīng)的QoS參數(shù),初始化一個QoS結(jié)構(gòu)。 定義:

BOOLWSAAPI WSAGetQoSByName(INSOCKETs,

/*標(biāo)識一個本地socket的標(biāo)識符

*/ INOUTLPWSABUFlpQoSName,

/*?IN標(biāo)識QoS模板名,OUT標(biāo)識可用模板列表的緩沖區(qū)

*/OUTLPQOSlpQoS); /*

指向填充QoS結(jié)構(gòu)的指針

*/

●?WSAHtonl():把一個以主機字節(jié)順序表示的32位無符號長整型數(shù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。 定義:

intWSAAPI WSAHtonl( INSOCKETs,

/*標(biāo)識一個本地socket的標(biāo)識符

*/ INu_longhostlong,

/*以主機字節(jié)順序表示的數(shù)

*/ OUTu_longFAR*lpnetlong); /*指向轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)順序的數(shù)的指針

*/ ●?WSAHtons():把一個以主機字節(jié)順序表示的16位無符號短整型數(shù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。 定義:

intWSAAPI WSAHtons( INSOCKETs,

/*標(biāo)識一個本地socket的標(biāo)識符

*/ INu_shorthostshort,

/*以主機字節(jié)順序表示的數(shù)

*/OUTu_shortFAR*lpnetshort); /*指向轉(zhuǎn)換后的網(wǎng)絡(luò)字節(jié)順序的數(shù)的指針

*/ INDWORDcbOutBuffer,

/*?lpvOutBuffer的大小

*/OUTLPDWORDlpcbBytesReturned,

/*實際輸出字節(jié)數(shù)地址

*/ INLPWSAOVERLAPPEDlpOverlapped,

/*WSAOVERLAPPED結(jié)構(gòu)的地址

*/ INLPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine); /*指向操作結(jié)束后完成例程的指針

*/ OUTLPWSABUFlpCalleeData,

/*返回的用戶數(shù)據(jù)指針

*/INLPQOSlpSQOS,

/*每個該指針指向一個流規(guī)格的方向

*/INLPQOSlpGQOS); /*為套接字組保留,用法同lpSQOS?*/INDWORDdwFlags,

/*標(biāo)識socket是發(fā)送者或接收者

*/ ●?WSANtohl():ntohl()函數(shù)的擴展版本,與WSAHtonl操作相反,將一個以網(wǎng)絡(luò)字節(jié)順序標(biāo)識的無符號長整型數(shù)轉(zhuǎn)換為32位主機字節(jié)順序。

定義:

intWSAAPI WSANtohl( INSOCKETs,

/*標(biāo)識一個本地socket的標(biāo)識符

*/INu_longnetlong,

/*以網(wǎng)絡(luò)字節(jié)順序表示的數(shù)

*/OUTu_longFAR*lphostlong); /*指向轉(zhuǎn)換后的主機字節(jié)順序的數(shù)的指針

*/ ●?WSANtohs():ntohs()函數(shù)的擴展版本,與WSAHtons操作相反,將一個以網(wǎng)絡(luò)字節(jié)順序標(biāo)識的無符號短整型數(shù)轉(zhuǎn)換為16位主機字節(jié)順序。

定義:

intWSAAPI WSARecv(INSOCKETs,

/*標(biāo)識一個已經(jīng)連接的socket的標(biāo)識符

*/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)識一個socket的標(biāo)識符

*/OUTLPWSABUFlpInboundDisconnectData); /*指向終止連接數(shù)據(jù)的指針

*/

●?WSARecvFrom():recvfrom()函數(shù)的擴展版本,它支持分散/聚集I/O和重疊socket操作,接收一個數(shù)據(jù)報并保存源地址。 定義:

intWSAAPI WSARecvFrom( INSOCKETs,

/*標(biāo)識一個socket的標(biāo)識符

*/ INOUTLPWSABUFlpBuffer,

/*指向

WSABUF結(jié)構(gòu)數(shù)組的指針

*/INDWORDdwBufferCount,

/*緩沖區(qū)中WSABUF結(jié)構(gòu)的數(shù)目

*/OUTLPDWORDlpNumberOfBytesRecvd,

/*指向本操作接收字節(jié)數(shù)的指針

*/ ●?WSAResetEvent():重新初始化一個事件對象。 定義:

BOOLWSAAPI WSAResetEvent(INWSAEVENThEvent); /*標(biāo)識一個開放的事件對象句柄

*/ ●?WSASend():send()函數(shù)的擴展版本,它支持分散/聚集I/O和重疊套接字操作,在一個已經(jīng)連接的socket上發(fā)送數(shù)據(jù)。

定義:

intWSAAPI WSASend( INSOCKETs,

/*標(biāo)識一個已連接的socket的標(biāo)識符

*/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ù)的擴展版本,它支持分散/聚集I/O和重疊套接字操作,可以向指定地址發(fā)送數(shù)據(jù)。 定義:

intWSAAPI WSASendTo(INSOCKETs,

/*標(biāo)識一個socket的標(biāo)識符

*/ 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的長度

*/

定義:

SOCKETWSAAPI WSASocket( INintaf,

/*地址描述參數(shù)

*/INinttype,

/*創(chuàng)建的socket類型描述

*/INintprotocol,

/*使用的協(xié)議

*/INLPWSAPROTOCOL_INFOlpProtocolInfo,

/*指向結(jié)構(gòu)定義的指針

*/INGROUPg,

/*保留為socket組使用

*/INDWORDdwFlags); /*?socket屬性描述

*/ 2)名字注冊解析函數(shù) ●?WSAAddressToString():顯示SOCKADDR中的信息。 定義:

INTWSAAPI WSAAddressToString( INLPSOCKADDRlpsaAddress,

/*要轉(zhuǎn)換的SOCKADDR結(jié)構(gòu)的信息

*/INDWORDdwAddressLength,

/*SOCKADDR的地址長度

*/ INLPWSAPROTOCOL_INFOlpProtocolInfo,

/*指向結(jié)構(gòu)定義的指針

*/ OUTLPTSTRlpszAddressString,

/*存放轉(zhuǎn)換后的地址字符串的緩沖區(qū)

*/ INOUTLPDWORDlpdwAddressStringlength); /*作輸入是指地址緩沖區(qū)長度,作輸出是

指緩沖區(qū)字符串的實際長度

*/ ●?WSAEnumNameSpaceProviders():檢索可用的名字空間。 定義:

INTWSAAPI WSAEnumNameSpaceProviders( INOUTLPDWORDlpdwBufferLength,

/*作輸入是指緩沖區(qū)字節(jié)數(shù),作輸出是指檢索所有

請求信息需要傳遞的緩沖區(qū)的最小字節(jié)數(shù)

*/ OUTLPWSANAMES PACE_INFOlpnspBuffer); /*指示該函數(shù)返回值緩沖區(qū)的指針

*/ ●?WSAGetServiceClassInfo():檢索服務(wù)所屬類的信息。 定義:

INTWSAAPI WSAGetServiceClassInfo( INLPGUIDlpProviderId,

/*指向名字空間提供著的指針

*/ INLPGUIDlpServiceClassId,

/*指向要查詢的服務(wù)類的指針

*/

INOUTLPGUIDlpdwBufferLength,

/*作輸入是指緩沖區(qū)字節(jié)數(shù),作輸出是指檢索所有請求信息需要傳遞的緩沖區(qū)的最小字節(jié)數(shù)

*/ OUTLPWSASERVICECLASSINFOlpServiceClassInfo); /*存放服務(wù)類信息的緩沖區(qū)

*/ ●?WSAInstallServiceClass():注冊服務(wù)類的特定信息。 定義:

INTWSAAPI WSAInstallServiceClass(INLPWSASERVICECLASSINFOlpServiceClassInfo); /*存放服務(wù)類信息的緩沖區(qū)

*/ ●?WSALookupServiceBegin():用戶指定查詢的初始化,返回一個句柄,和函數(shù)WSALookupServiceNext()配合使用。 定義:

INTWSAAPI WSALookupServiceBegin( INLPWSAQUERYSETlpqsRestrictions, ?/*WSAQUERYSET結(jié)構(gòu)指定查詢標(biāo)準(zhǔn)

*/INDWORDdwControlFlags,

/*控制查詢深度標(biāo)志

*/OUTLPHANDLElphLookup); /*?WSALookupServiceNext()調(diào)用的句柄

*/ INDWORDdwControlFlags,

/*指示下一次操作的標(biāo)識

*/ INOUTLPGUIDlpdwBufferLength,

/*作輸入是指lpqsResults的字節(jié)數(shù),作輸出是指lpqsResults指示的最小字節(jié)數(shù)

*/OUTLPWSAQUERYSETlpqsResults); /*返回結(jié)果所在的內(nèi)存地址指針

*/ ●?WSARemoveServiceClass():注銷服務(wù)類概要。 定義:

INTWSAAPIWSARemoveServiceClass(INLPGUIDlpServiceClassId);/*指示要注銷服務(wù)類指針

*/ ●?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開頭定義的宏都是針對socket集合fd_set制定的,應(yīng)用程序開發(fā)者最好使用這些宏對集合進行操作,可以避免很多錯誤。 ●?WSAGETASYNCBFLEN:從異步服務(wù)函數(shù)的操作完成

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論