版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工廠勞動合同關(guān)鍵條款
- 裝修合同范本簡化版
- 房屋出租簡約合同樣式
- 出租車承包合同
- 線上辦公信息安全協(xié)議
- 旅館承包合同范例
- 房地產(chǎn)經(jīng)紀(jì)公司代理合同模板
- 技術(shù)成果轉(zhuǎn)讓股權(quán)協(xié)議
- 2024年汽車租賃合同范本
- 抵押物借款合同的社會責(zé)任
- 汽車起重機日常檢查維修保養(yǎng)記錄表
- 中國醫(yī)科大學(xué)2023年12月《康復(fù)工程學(xué)》作業(yè)考核試題-【答案】
- 浙江省9+1高中聯(lián)盟2022-2023學(xué)年高一上學(xué)期11月期中考物理試題(解析版)
- 七年級上冊英語期中專項復(fù)習(xí)-補全對話(含答案)
- 鐵的單質(zhì)(導(dǎo)學(xué)案)高一化學(xué)
- 絞吸式挖泥船水下疏挖河渠施工工法
- 反腐倡廉廉潔行醫(yī)
- 心血管內(nèi)科醫(yī)療質(zhì)量評價體系與考核標(biāo)準(zhǔn)
- 2022-2023學(xué)年廣州市南沙區(qū)小升初全真模擬數(shù)學(xué)檢測卷含答案
- 2023年食品安全糧食類理論知識考試題庫(含答案)
- 人教版五年級上冊數(shù)學(xué)《可能性》作業(yè)設(shè)計
評論
0/150
提交評論