青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

不會(huì)飛的鳥

2010年12月10日 ... 不鳥他們!?。?我要用自己開發(fā)的分布式文件系統(tǒng)、分布式調(diào)度系統(tǒng)、分布式檢索系統(tǒng), 做自己的搜索引擎?。?!大魚有大志?。?! ---楊書童

Windows Sockets 網(wǎng)絡(luò)編程(三) —— WINDOWS SOCKETS 1.1 程序設(shè)計(jì)

一、簡介
WINDOWS SOCKETS 是從 Berkeley Sockets 擴(kuò)展而來的,其在繼承 Berkeley Sockets 的基礎(chǔ)上,又進(jìn)行了新的擴(kuò)充。這些擴(kuò)充主要是提供了一些異步函數(shù),并增加了符合WINDOWS消息驅(qū)動(dòng)特性的網(wǎng)絡(luò)事件異步選擇機(jī)制。
WINDOWS SOCKETS由兩部分組成:開發(fā)組件和運(yùn)行組件。
開發(fā)組件:WINDOWS SOCKETS 實(shí)現(xiàn)文檔、應(yīng)用程序接口(API)引入庫和一些頭文件。
運(yùn)行組件:WINDOWS SOCKETS 應(yīng)用程序接口的動(dò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ù)(即讀準(zhǔn)備好)時(shí)接到通知
FD_WRITE 期望在套接字上可發(fā)送數(shù)據(jù)(即寫準(zhǔn)備好)時(shí)接到通知
FD_OOB 期望在套接字上有帶外數(shù)據(jù)到達(dá)時(shí)接到通知
FD_ACCEPT 期望在套接字上有外來連接時(shí)接到通知
FD_CONNECT 期望在套接字連接建立完成時(shí)接到通知
FD_CLOSE 期望在套接字關(guān)閉時(shí)接到通知
例如:我們要在套接字讀準(zhǔn)備好或?qū)憸?zhǔn)備好時(shí)接到通知,語句如下:
rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_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è)程序不主動(dòng)放棄其控制權(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就不會(huì)有這個(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ò)誤號(hào)。(WSAGetLastEror()和WSASetLastError())

5、啟動(dòng)與終止
使用函數(shù) WSAStartup() 和 WSACleanup() 啟動(dòng)和終止套接字。


三、WINDOWS SOCKETS 網(wǎng)絡(luò)程序設(shè)計(jì)核心

我們終于可以開始真正的 WINDOWS SOCKETS 網(wǎng)絡(luò)程序設(shè)計(jì)了。不過我們還是先看一看每個(gè) WINDOWS SOCKETS 網(wǎng)絡(luò)程序都要涉及的內(nèi)容。讓我們一步步慢慢走。

1、啟動(dòng)與終止
在所有 WINDOWS SOCKETS 函數(shù)中,只有啟動(dòng)函數(shù) WSAStartup() 和終止函數(shù) WSACleanup() 是必須使用的。
啟動(dòng)函數(shù)必須是第一個(gè)使用的函數(shù),而且它允許指定 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ò)誤號(hào)變量
    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)返回的版本號(hào)始終是最低要求的 1.1,即應(yīng)用程序與DLL 中可支持的最低版本號(hào)
    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í)可能會(huì)多次調(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)識(shí)這個(gè)操作。當(dāng)結(jié)果存儲(chǔ)在調(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è)置為可移動(dòng)和可丟棄,因此在操作內(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)槟菢涌赡軙?huì)阻塞整個(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)){...}

posted on 2006-04-25 13:12 不會(huì)飛的鳥 閱讀(955) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中国女人久久久| 国产一区二区三区四区五区美女| 91久久久久久久久| 毛片一区二区三区| 欧美成人久久| 亚洲国产精彩中文乱码av在线播放| 牛牛国产精品| 亚洲黄一区二区三区| 日韩午夜中文字幕| 欧美一级理论性理论a| 久久久无码精品亚洲日韩按摩| 美女被久久久| 欧美日韩精品欧美日韩精品| 国产精品久久久一区二区| 国产亚洲精品一区二区| 亚洲国产精品激情在线观看| 日韩一区二区精品| 久久成人一区二区| 亚洲国产精品悠悠久久琪琪| 在线一区二区日韩| 久久午夜电影网| 欧美香蕉视频| 亚洲国产另类久久精品| 亚洲欧美日韩国产成人| 欧美暴力喷水在线| 亚洲一二三区在线| 欧美风情在线观看| 国产区精品视频| 日韩亚洲视频在线| 国产精品久久午夜夜伦鲁鲁| 亚洲精品网址在线观看| 亚洲一区二区少妇| 美日韩精品免费| 国产精品99久久久久久宅男| 蜜桃精品一区二区三区| 国产麻豆精品视频| 亚洲精品一区二区三区婷婷月| 欧美在线免费观看| 一本色道久久| 欧美大片网址| 在线成人h网| 欧美一区深夜视频| 一区二区三区www| 欧美激情综合色| 亚洲福利视频网| 久久人体大胆视频| 亚洲婷婷在线| 欧美视频在线看| 亚洲乱码国产乱码精品精可以看 | 亚洲欧美日本精品| 欧美精品1区| 亚洲精品免费在线| 欧美大尺度在线观看| 久久激情五月婷婷| 国产午夜精品理论片a级探花| 亚洲欧美日韩精品久久奇米色影视| 亚洲伦理一区| 欧美日韩视频不卡| 亚洲视频一区| 亚洲免费观看视频| 欧美日韩久久| 亚洲性图久久| 亚洲一区二区三区精品在线 | 亚洲人成艺术| 亚洲大片免费看| 麻豆亚洲精品| 99在线精品视频在线观看| 亚洲欧洲日本一区二区三区| 欧美韩日一区二区三区| 中文精品视频一区二区在线观看| 日韩亚洲欧美中文三级| 欧美性猛片xxxx免费看久爱| 亚洲欧美中文字幕| 性18欧美另类| 亚洲黄色成人| 一本久道久久久| 国产精品视频免费观看www| 久久精品一区蜜桃臀影院| 久久久久国内| 一本色道**综合亚洲精品蜜桃冫| 亚洲精品网站在线播放gif| 欧美亚洲成人网| 久久综合九色综合欧美就去吻| 久热国产精品视频| 宅男精品视频| 99www免费人成精品| 亚洲成人在线免费| 国产精品看片资源| 久久九九国产精品怡红院| 久久久亚洲一区| 一区二区三区久久精品| 欧美一区二区三区另类| 91久久嫩草影院一区二区| 在线一区视频| 亚洲福利一区| 亚洲综合电影| 亚洲精选成人| 欧美一区二区国产| 一区二区三区 在线观看视| 午夜电影亚洲| 亚洲美女在线视频| 欧美一区二区精美| 一区二区三区高清在线| 久久精品国产91精品亚洲| 中文av字幕一区| 噜噜噜在线观看免费视频日韩| 午夜精品短视频| 欧美精品v日韩精品v国产精品| 久久国产精品一区二区| 欧美日韩一区二区精品| 欧美69wwwcom| 国产一区二区三区在线观看视频 | 亚洲美女中文字幕| 精品动漫一区| 亚洲欧美在线看| 亚洲一二三区在线观看| 美女999久久久精品视频| 久久九九国产精品| 国产精品丝袜xxxxxxx| 亚洲乱码精品一二三四区日韩在线| 在线精品观看| 久久精品国产综合| 欧美资源在线| 国产精品亚洲一区| 制服丝袜亚洲播放| 亚洲午夜免费视频| 欧美日韩精品一本二本三本| 亚洲黄一区二区三区| 亚洲高清网站| 麻豆成人综合网| 欧美成人免费网站| 亚洲电影第三页| 久久综合电影| 欧美国产亚洲另类动漫| 亚洲高清视频一区| 蜜桃精品一区二区三区 | 亚洲第一在线| 亚洲三级电影全部在线观看高清| 另类欧美日韩国产在线| 永久久久久久| 亚洲九九九在线观看| 欧美在线观看视频一区二区三区| 亚洲欧美另类久久久精品2019| 欧美日韩中文精品| 这里只有精品视频在线| 午夜久久99| 国产一区二区三区的电影| 久久99伊人| 欧美高清视频免费观看| 亚洲精品无人区| 欧美日韩一区二区三区在线看| 亚洲最新中文字幕| 午夜精品久久久久久久久久久| 国产精品视频一二三| 久久精品国产清自在天天线| 欧美国产1区2区| 亚洲美女黄色| 国产精品美女久久久久久2018| 亚洲欧美在线另类| 蜜臀91精品一区二区三区| 亚洲精品一区二区三区四区高清| 欧美日韩国产综合视频在线观看中文| av成人动漫| 久久视频精品在线| 亚洲人成在线观看网站高清| 国产精品99免视看9| 久久黄金**| 日韩亚洲在线| 裸体一区二区| 亚洲性图久久| 亚洲福利视频免费观看| 欧美性大战久久久久| 久久久噜噜噜| 一区二区三区导航| 欧美成年网站| 销魂美女一区二区三区视频在线| 国外成人在线| 欧美三级电影大全| 久久久99久久精品女同性| 99riav国产精品| 欧美韩国日本一区| 性伦欧美刺激片在线观看| 亚洲激情成人网| 国产亚洲视频在线观看| 欧美日韩和欧美的一区二区| 久久精品免费看| 亚洲午夜女主播在线直播| 欧美国产日本在线| 久久精品成人一区二区三区蜜臀 | 久久精品一区四区| 亚洲视频你懂的| 91久久精品美女高潮| 国产欧美在线观看| 国产精品yjizz| 欧美精品一区二区三区视频| 久久久久久久激情视频| 性欧美videos另类喷潮| 亚洲一区一卡| 亚洲天堂免费在线观看视频| 亚洲精品黄色|