国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Windows Socket1.1 程序設(shè)計(jì)

2019-11-17 05:06:08
字體:
供稿:網(wǎng)友
[文章導(dǎo)讀]Windows Sockets 是從 Berkeley Sockets 擴(kuò)展而來的,其在繼續(xù) Berkeley Sockets 的基礎(chǔ)上,又進(jìn)行了新的擴(kuò)充 一、簡介
Windows Sockets 是從 Berkeley Sockets 擴(kuò)展而來的,其在繼續(xù) Berkeley Sockets 的基礎(chǔ)上,又進(jìn)行了新的擴(kuò)充。這些擴(kuò)充主要是提供了一些異步函數(shù),并增加了符合WINDOWS消息驅(qū)動特性的網(wǎng)絡(luò)事件異步選擇機(jī)制。Windows Sockets由兩部分組成:開發(fā)組件和運(yùn)行組件。開發(fā)組件:Windows Sockets 實(shí)現(xiàn)文檔、應(yīng)用程序接口(API)引入庫和一些頭文件。運(yùn)行組件:Windows Sockets 應(yīng)用程序接口的動態(tài)鏈接庫(WINSOCK.DLL)。 二、主要擴(kuò)充說明1、異步選擇機(jī)制:Windows Sockets 的異步選擇函數(shù)提供了消息機(jī)制的網(wǎng)絡(luò)事件選擇,當(dāng)使用它登記網(wǎng)絡(luò)事件發(fā)生時(shí),應(yīng)用程序相應(yīng)窗口函數(shù)將收到一個(gè)消息,消息中指示了發(fā)生的網(wǎng)絡(luò)事件,以及與事件相關(guān)的一些信息。Windows Sockets 提供了一個(gè)異步選擇函數(shù) WSAAsyncSelect(),用它來注冊應(yīng)用程序感愛好的網(wǎng)絡(luò)事件,當(dāng)這些事件發(fā)生時(shí),應(yīng)用程序相應(yīng)的窗口函數(shù)將收到一個(gè)消息。函數(shù)結(jié)構(gòu)如下:int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);參數(shù)說明:hWnd:窗口句柄wMsg:需要發(fā)送的消息lEvent:事件(以下為事件的內(nèi)容)值:含義:FD_READ期望在套接字上收到數(shù)據(jù)(即讀預(yù)備好)時(shí)接到通知FD_WRITE期望在套接字上可發(fā)送數(shù)據(jù)(即寫預(yù)備好)時(shí)接到通知FD_OOB期望在套接字上有帶外數(shù)據(jù)到達(dá)時(shí)接到通知FD_ACCEPT期望在套接字上有外來連接時(shí)接到通知FD_CONNECT期望在套接字連接建立完成時(shí)接到通知FD_CLOSE期望在套接字關(guān)閉時(shí)接到通知例如:我們要在套接字讀預(yù)備好或?qū)戭A(yù)備好時(shí)接到通知,語句如下: rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READFD_WRITE);假如我們需要注銷對套接字網(wǎng)絡(luò)事件的消息發(fā)送,只要將 lEvent 設(shè)置為0 2、異步請求函數(shù)在 Berkeley Sockets 中請求服務(wù)是阻塞的,WINDOWS SICKETS 除了支持這一類函數(shù)外,還增加了相應(yīng)的異步請求函數(shù)(WSAAsyncGetXByY();)。 3、阻塞處理方法Windows Sockets 為了實(shí)現(xiàn)當(dāng)一個(gè)應(yīng)用程序的套接字調(diào)用處于阻塞時(shí),能夠放棄CPU讓其它應(yīng)用程序運(yùn)行,它在調(diào)用處于阻塞時(shí)便進(jìn)入一個(gè)叫“HOOK”的例程,此例程負(fù)責(zé)接收和分配WINDOWS消息,使得其它應(yīng)用程序仍然能夠接收到自己的消息并取得控制權(quán)。WINDOWS 是非搶先的多任務(wù)環(huán)境,即若一個(gè)程序不主動放棄其控制權(quán),別的程序就不能執(zhí)行。因此在設(shè)計(jì)Windows Sockets 程序時(shí),盡管系統(tǒng)支持阻塞操作,但還是反對程序員使用該操作。但由于 SUN 公司下的 Berkeley Sockets 的套接字默認(rèn)操作是阻塞的,WINDOWS 作為移植的 SOCKETS 也不可避免對這個(gè)操作支持。在Windows Sockets 實(shí)現(xiàn)中,對于不能立即完成的阻塞操作做如下處理:DLL初始化→循環(huán)操作。在循環(huán)中,它發(fā)送任何 WINDOWS 消息,并檢查這個(gè) Windows Sockets 調(diào)用是否完成,在必要時(shí),它可以放棄CPU讓其它應(yīng)用程序執(zhí)行(當(dāng)然使用超線程的CPU就不會有這個(gè)麻煩了^_^)。我們可以調(diào)用 WSACancelBlockingCall() 函數(shù)取消此阻塞操作。在 Windows Sockets 中,有一個(gè)默認(rèn)的阻塞處理例程 BlockingHook() 簡單地獲取并發(fā)送 WINDOWS 消息。假如要對復(fù)雜程序進(jìn)行處理,Windows Sockets 中還有 WSASetBlockingHook() 提供用戶安裝自己的阻塞處理例程能力;與該函數(shù)相對應(yīng)的則是 SWAUnhookBlockingHook(),它用于刪除先前安裝的任何阻塞處理例程,并重新安裝默認(rèn)的處理例程。請注重,設(shè)計(jì)自己的阻塞處理例程時(shí),除了函數(shù) WSACancelBlockingHook() 之外,它不能使用其它的 Windows Sockets API 函數(shù)。在處理例程中調(diào)用 WSACancelBlockingHook()函數(shù)將取消處于阻塞的操作,它將結(jié)束阻塞循環(huán)。4、出錯(cuò)處理Windows Sockets 為了和以后多線程環(huán)境(WINDOWS/UNIX)兼容,它提供了兩個(gè)出錯(cuò)處理函數(shù)來獲取和設(shè)置當(dāng)前線程的最近錯(cuò)誤號。(WSAGetLastEror()和WSASetLastError())5、啟動與終止使用函數(shù) WSAStartup() 和 WSACleanup() 啟動和終止套接字。 更多文章 更多內(nèi)容請看Windows操作系統(tǒng)安全集  Windows操作系統(tǒng)安裝  Windows頻道專題,或 三、Windows Sockets網(wǎng)絡(luò)程序設(shè)計(jì)核心
  我們終于可以開始真正的 Windows Sockets 網(wǎng)絡(luò)程序設(shè)計(jì)了。不過我們還是先看一看每個(gè) Windows Sockets 網(wǎng)絡(luò)程序都要涉及的內(nèi)容。讓我們一步步慢慢走。
  1、啟動與終止

   在所有 Windows Sockets 函數(shù)中,只有啟動函數(shù) WSAStartup() 和終止函數(shù) WSACleanup() 是必須使用的。

   啟動函數(shù)必須是第一個(gè)使用的函數(shù),而且它答應(yīng)指定 Windows Sockets API 的版本,并獲得 SOCKETS的特定的一些技術(shù)細(xì)節(jié)。本結(jié)構(gòu)如下:
int PASCAL FAR WSAStartup(Word wVersionRequested, LPWSADATA lpWSAData);  其中 wVersionRequested 保證 SOCKETS 可正常運(yùn)行的 DLL 版本,假如不支持,則返回錯(cuò)誤信息。
我們看一下下面這段代碼,看一下如何進(jìn)行 WSAStartup() 的調(diào)用
WORD wVersionRequested;// 定義版本信息變量
WSADATA wsaData;//定義數(shù)據(jù)信息變量
int err;//定義錯(cuò)誤號變量
wVersionRequested = MAKEWORD(1,1);//給版本信息賦值
err = WSAStartup(wVersionRequested, &wsaData);//給錯(cuò)誤信息賦值
if(err!=0)
{
return;//告訴用戶找不到合適的版本
}
//確認(rèn) Windows Sockets DLL 支持 1.1 版本
//DLL 版本可以高于 1.1
//系統(tǒng)返回的版本號始終是最低要求的 1.1,即應(yīng)用程序與DLL 中可支持的最低版本號
if(LOBYTE(wsaData.wVersion)!= 1 HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();//告訴用戶找不到合適的版本
return;
}
//Windows Sockets DLL 被進(jìn)程接受,可以進(jìn)入下一步操作
  關(guān)閉函數(shù)使用時(shí),任何打開并已連接的 SOCK_STREAM 套接字被復(fù)位,但那些已由 closesocket() 函數(shù)關(guān)閉的但仍有未發(fā)送數(shù)據(jù)的套接字不受影響,未發(fā)送的數(shù)據(jù)仍將被發(fā)送。程序運(yùn)行時(shí)可能會多次調(diào)用 WSAStartuo() 函數(shù),但必須保證每次調(diào)用時(shí)的 wVersionRequested 的值是相同的。  2、異步請求服務(wù)

   Windows Sockets 除支持 Berkeley Sockets 中同步請求,還增加了了一類異步請求服務(wù)函數(shù) WSAAsyncGerXByY()。該函數(shù)是阻塞請求函數(shù)的異步版本。應(yīng)用程序調(diào)用它時(shí),由 Windows Sockets DLL 初始化這一操作并返回調(diào)用者,此函數(shù)返回一個(gè)異步句柄,用來標(biāo)識這個(gè)操作。當(dāng)結(jié)果存儲在調(diào)用者提供的緩沖區(qū),并且發(fā)送一個(gè)消息到應(yīng)用程序相應(yīng)窗口。常用結(jié)構(gòu)如下:
HANDLE taskHnd;
char hostname="rs6000";
taskHnd = WSAAsyncBetHostByName(hWnd,wMsg,hostname,buf,buflen);
  需要注重的是,由于 Windows 的內(nèi)存對像可以設(shè)置為可移動和可丟棄,因此在操作內(nèi)存對象是,必須保證 WIindows Sockets DLL 對象是可用的。

   3、異步數(shù)據(jù)傳輸

   使用 send() 或 sendto() 函數(shù)來發(fā)送數(shù)據(jù),使用 recv() 或recvfrom() 來接收數(shù)據(jù)。Windows Sockets 不鼓勵(lì)用戶使用阻塞方式傳輸數(shù)據(jù),因?yàn)槟菢涌赡軙枞麄€(gè) Windows 環(huán)境。下面我們看一個(gè)異步數(shù)據(jù)傳輸實(shí)例:

   假設(shè)套接字 s 在連接建立后,已經(jīng)使用了函數(shù) WSAAsyncSelect() 在其上注冊了網(wǎng)絡(luò)事件 FD_READ 和 FD_WRITE,并且 wMsg 值為 UM_SOCK,那么我們可以在 Windows 消息循環(huán)中增加如下的分支語句:case UM_SOCK:
switch(lParam)
{
case FD_READ:
len = recv(wParam,lpBuffer,length,0);
break;
case FD_WRITE:
while(send(wParam,lpBuffer,len,0)!=SOCKET_ERROR)
break;
}
break;
  4、出錯(cuò)處理

   Windows 提供了一個(gè)函數(shù)來獲取最近的錯(cuò)誤碼 WSAGetLastError(),推薦的編寫方式如下:
len = send (s,lpBuffer,len,0);
of((len==SOCKET_ERROR)&&(WSAGetLastError()==WSAWOULDBLOCK)){...}
更多文章 更多內(nèi)容請看Windows操作系統(tǒng)安全集 
 Windows操作系統(tǒng)安裝  Windows頻道專題,或

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 榆林市| 锦州市| 庆安县| 巴楚县| 玉山县| 宁波市| 浙江省| 盈江县| 保亭| 安吉县| 疏附县| 澄江县| 馆陶县| 高尔夫| 桑日县| 绥江县| 南昌县| 宁晋县| 五峰| 华坪县| 蛟河市| 崇仁县| 高州市| 永州市| 新巴尔虎左旗| 杨浦区| 平利县| 尤溪县| 綦江县| 礼泉县| 留坝县| 三亚市| 北流市| 壤塘县| 易门县| 常州市| 余姚市| 都昌县| 宜都市| 江口县| 布尔津县|