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

不會飛的鳥

2010年12月10日 ... 不鳥他們!!! 我要用自己開發的分布式文件系統、分布式調度系統、分布式檢索系統, 做自己的搜索引擎!!!大魚有大志!!! ---楊書童

Windows Sockets 網絡編程(三) —— WINDOWS SOCKETS 1.1 程序設計

一、簡介
WINDOWS SOCKETS 是從 Berkeley Sockets 擴展而來的,其在繼承 Berkeley Sockets 的基礎上,又進行了新的擴充。這些擴充主要是提供了一些異步函數,并增加了符合WINDOWS消息驅動特性的網絡事件異步選擇機制。
WINDOWS SOCKETS由兩部分組成:開發組件和運行組件。
開發組件:WINDOWS SOCKETS 實現文檔、應用程序接口(API)引入庫和一些頭文件。
運行組件:WINDOWS SOCKETS 應用程序接口的動態鏈接庫(WINSOCK.DLL)。


二、主要擴充說明

1、異步選擇機制:
WINDOWS SOCKETS 的異步選擇函數提供了消息機制的網絡事件選擇,當使用它登記網絡事件發生時,應用程序相應窗口函數將收到一個消息,消息中指示了發生的網絡事件,以及與事件相關的一些信息。
WINDOWS SOCKETS 提供了一個異步選擇函數 WSAAsyncSelect(),用它來注冊應用程序感興趣的網絡事件,當這些事件發生時,應用程序相應的窗口函數將收到一個消息。
函數結構如下:

int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);
參數說明:
hWnd:窗口句柄
wMsg:需要發送的消息
lEvent:事件(以下為事件的內容)
值: 含義:
FD_READ 期望在套接字上收到數據(即讀準備好)時接到通知
FD_WRITE 期望在套接字上可發送數據(即寫準備好)時接到通知
FD_OOB 期望在套接字上有帶外數據到達時接到通知
FD_ACCEPT 期望在套接字上有外來連接時接到通知
FD_CONNECT 期望在套接字連接建立完成時接到通知
FD_CLOSE 期望在套接字關閉時接到通知
例如:我們要在套接字讀準備好或寫準備好時接到通知,語句如下:
rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);
如果我們需要注銷對套接字網絡事件的消息發送,只要將 lEvent 設置為0

2、異步請求函數
在 Berkeley Sockets 中請求服務是阻塞的,WINDOWS SICKETS 除了支持這一類函數外,還增加了相應的異步請求函數(WSAAsyncGetXByY();)。

3、阻塞處理方法
WINDOWS SOCKETS 為了實現當一個應用程序的套接字調用處于阻塞時,能夠放棄CPU讓其它應用程序運行,它在調用處于阻塞時便進入一個叫“HOOK”的例程,此例程負責接收和分配WINDOWS消息,使得其它應用程序仍然能夠接收到自己的消息并取得控制權。
WINDOWS 是非搶先的多任務環境,即若一個程序不主動放棄其控制權,別的程序就不能執行。因此在設計 WINDOWS SOCKETS 程序時,盡管系統支持阻塞操作,但還是反對程序員使用該操作。但由于 SUN 公司下的 Berkeley Sockets 的套接字默認操作是阻塞的,WINDOWS 作為移植的 SOCKETS 也不可避免對這個操作支持。
在 WINDOWS SOCKETS 實現中,對于不能立即完成的阻塞操作做如下處理:DLL初始化→循環操作。在循環中,它發送任何 WINDOWS 消息,并檢查這個 WINDOWS SOCKETS 調用是否完成,在必要時,它可以放棄CPU讓其它應用程序執行(當然使用超線程的CPU就不會有這個麻煩了^_^)。我們可以調用 WSACancelBlockingCall() 函數取消此阻塞操作。
在 WINDOWS SOCKETS 中,有一個默認的阻塞處理例程 BlockingHook() 簡單地獲取并發送 WINDOWS 消息。如果要對復雜程序進行處理,WINDOWS SOCKETS 中還有 WSASetBlockingHook() 提供用戶安裝自己的阻塞處理例程能力;與該函數相對應的則是 SWAUnhookBlockingHook(),它用于刪除先前安裝的任何阻塞處理例程,并重新安裝默認的處理例程。請注意,設計自己的阻塞處理例程時,除了函數 WSACancelBlockingHook() 之外,它不能使用其它的 WINDOWS SOCKETS API 函數。在處理例程中調用 WSACancelBlockingHook()函數將取消處于阻塞的操作,它將結束阻塞循環。

4、出錯處理
WINDOWS SOCKETS 為了和以后多線程環境(WINDOWS/UNIX)兼容,它提供了兩個出錯處理函數來獲取和設置當前線程的最近錯誤號。(WSAGetLastEror()和WSASetLastError())

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


三、WINDOWS SOCKETS 網絡程序設計核心

我們終于可以開始真正的 WINDOWS SOCKETS 網絡程序設計了。不過我們還是先看一看每個 WINDOWS SOCKETS 網絡程序都要涉及的內容。讓我們一步步慢慢走。

1、啟動與終止
在所有 WINDOWS SOCKETS 函數中,只有啟動函數 WSAStartup() 和終止函數 WSACleanup() 是必須使用的。
啟動函數必須是第一個使用的函數,而且它允許指定 WINDOWS SOCKETS API 的版本,并獲得 SOCKETS的特定的一些技術細節。本結構如下:
int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
其中 wVersionRequested 保證 SOCKETS 可正常運行的 DLL 版本,如果不支持,則返回錯誤信息。
我們看一下下面這段代碼,看一下如何進行 WSAStartup() 的調用
WORD wVersionRequested;// 定義版本信息變量
    WSADATA wsaData;//定義數據信息變量
    int err;//定義錯誤號變量
    wVersionRequested = MAKEWORD(1,1);//給版本信息賦值
    err = WSAStartup(wVersionRequested, &wsaData);//給錯誤信息賦值
    if(err!=0)
    {
        return;//告訴用戶找不到合適的版本
    }
    //確認 WINDOWS SOCKETS DLL 支持 1.1 版本
    //DLL 版本可以高于 1.1
    //系統返回的版本號始終是最低要求的 1.1,即應用程序與DLL 中可支持的最低版本號
    if(LOBYTE(wsaData.wVersion)!= 1|| HIBYTE(wsaData.wVersion)!=1)
    {
        WSACleanup();//告訴用戶找不到合適的版本
        return;
    }
    //WINDOWS SOCKETS DLL 被進程接受,可以進入下一步操作
關閉函數使用時,任何打開并已連接的 SOCK_STREAM 套接字被復位,但那些已由 closesocket() 函數關閉的但仍有未發送數據的套接字不受影響,未發送的數據仍將被發送。程序運行時可能會多次調用 WSAStartuo() 函數,但必須保證每次調用時的 wVersionRequested 的值是相同的。

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

3、異步數據傳輸
使用 send() 或 sendto() 函數來發送數據,使用 recv() 或recvfrom() 來接收數據。Windows Sockets 不鼓勵用戶使用阻塞方式傳輸數據,因為那樣可能會阻塞整個 Windows 環境。下面我們看一個異步數據傳輸實例:
假設套接字 s 在連接建立后,已經使用了函數 WSAAsyncSelect() 在其上注冊了網絡事件 FD_READ 和 FD_WRITE,并且 wMsg 值為 UM_SOCK,那么我們可以在 Windows 消息循環中增加如下的分支語句:

   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、出錯處理
Windows 提供了一個函數來獲取最近的錯誤碼 WSAGetLastError(),推薦的編寫方式如下:
    len = send (s,lpBuffer,len,0);
    of((len==SOCKET_ERROR)&&(WSAGetLastError()==WSAWOULDBLOCK)){...}

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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三区| 91久久国产综合久久蜜月精品| 久热精品视频在线| 欧美激情久久久| 国产欧美一区二区在线观看| 在线观看精品一区| 亚洲一区二区视频在线观看| 久久天堂av综合合色| 日韩午夜激情av| 亚洲视频欧美视频| 激情六月婷婷综合| 亚洲第一偷拍| 亚洲伊人色欲综合网| 久久婷婷国产综合尤物精品| 亚洲精品免费网站| 久久久国产精彩视频美女艺术照福利| 欧美风情在线| 黄色精品一区二区| 亚洲一区二区视频在线| 性欧美激情精品| 麻豆精品在线观看| 一区二区久久久久久| 久久在线视频| 国产色视频一区| 亚洲天堂av高清| 欧美国产第一页| 欧美在线视频免费| 国产精品人人做人人爽| 在线一区二区视频| 亚洲精品国产视频| 欧美jizz19hd性欧美| 狠狠色狠狠色综合日日小说| 夜夜躁日日躁狠狠久久88av| 蜜桃av久久久亚洲精品| 亚洲欧美日韩直播| 欧美日韩日韩| 艳女tv在线观看国产一区| 欧美成人午夜激情视频| 欧美尤物巨大精品爽| 国产婷婷色一区二区三区| 午夜精品久久久久久久99水蜜桃| 亚洲人成啪啪网站| 欧美国产专区| 日韩一二三区视频| 亚洲国产欧洲综合997久久| 久久久亚洲高清| 在线不卡视频| 女人天堂亚洲aⅴ在线观看| 久久久91精品国产一区二区精品| 激情久久五月天| 美女亚洲精品| 欧美不卡在线视频| 99热精品在线观看| 夜夜嗨一区二区三区| 国产精品家庭影院| 久久精品30| 久久一区二区三区四区五区| 亚洲肉体裸体xxxx137| 亚洲国产一区视频| 欧美日韩视频一区二区三区| 亚洲系列中文字幕| 亚洲午夜激情免费视频| 国产一区二区三区在线观看精品 | 免费看成人av| 欧美顶级少妇做爰| 亚洲免费影视| 欧美一区永久视频免费观看| 亚洲黄页视频免费观看| 在线精品亚洲一区二区| 欧美在线视频不卡| 久久久免费av| 亚洲午夜久久久久久久久电影院| 亚洲一区二区三区涩| 国产在线拍偷自揄拍精品| 嫩草影视亚洲| 欧美视频在线观看免费网址| 久久久久久一区二区三区| 欧美va亚洲va日韩∨a综合色| 亚洲一区二区三区视频| 久久色中文字幕| 午夜精品久久久久久久蜜桃app| 久久精品电影| 亚洲影院色在线观看免费| 久久久久久久久久看片| 中文精品视频| 久久视频精品在线| 亚洲欧美另类综合偷拍| 蜜臀av性久久久久蜜臀aⅴ| 欧美亚洲免费电影| 欧美精品一区在线发布| 久久久久女教师免费一区| 欧美三级在线| 欧美国产日本韩| 国产真实久久| 亚洲视频一区二区| 亚洲精品国产品国语在线app| 午夜国产不卡在线观看视频| 一二三区精品| 欧美电影资源| 欧美激情一区二区三区全黄| 国产亚洲一区二区三区在线观看| 亚洲精品在线观| 亚洲精品日韩精品| 久久综合久久久久88| 久久九九久久九九| 国产精品美女久久久久久免费| 亚洲精品美女免费| 91久久精品一区二区三区| 久久国内精品视频| 久久久九九九九| 国产女主播一区| 亚洲欧美日韩直播| 久久国产天堂福利天堂| 国产欧美一区二区三区在线老狼| 一区二区三区久久网| 中文亚洲字幕| 欧美日韩亚洲一区二区三区四区| 亚洲欧洲一区二区在线观看| 亚洲精品乱码久久久久久日本蜜臀| 噜噜噜噜噜久久久久久91 | 免费在线播放第一区高清av| 久久免费少妇高潮久久精品99| 国产精品视频自拍| 在线综合亚洲| 午夜在线视频一区二区区别| 国产女主播一区二区| 亚洲欧美在线磁力| 久久野战av| 亚洲精品久久久久久久久| 欧美伦理91| 亚洲精品一二区| 亚洲深夜福利在线| 亚洲日本va午夜在线电影| 在线免费观看日韩欧美| 久久精品日韩| 欧美激情一区在线观看| 亚洲久久一区| 欧美视频一区在线| 亚洲欧美卡通另类91av| 欧美专区在线播放| …久久精品99久久香蕉国产| 欧美91福利在线观看| 日韩一级精品视频在线观看| 欧美一区2区视频在线观看| 国产欧美日韩综合精品二区| 久久久噜久噜久久综合| 亚洲欧洲美洲综合色网| 香蕉成人伊视频在线观看| 韩国欧美一区| 欧美日本在线播放| 午夜性色一区二区三区免费视频| 免费日本视频一区| 中文精品一区二区三区| 精品电影一区| 欧美亚男人的天堂| 久久视频在线免费观看| 亚洲天堂久久| 亚洲电影在线观看| 久久精品国产69国产精品亚洲 | 国产曰批免费观看久久久| 欧美成人a视频| 亚洲欧美电影院| 亚洲国产另类久久精品| 香蕉久久一区二区不卡无毒影院| 在线观看日韩欧美| 国产精品黄色在线观看| 欧美成人精品影院| 欧美一区二区福利在线| 一二美女精品欧洲| 亚洲国产二区| 美女国内精品自产拍在线播放| 亚洲免费网址| 日韩天堂在线视频| 一区二区三区在线免费视频 | 一本久道久久综合狠狠爱| 国产一区美女| 国产精品久久7| 欧美精品一区二区在线观看| 久久久国产精品亚洲一区 | 男女精品网站| 久久国产精品久久久久久久久久 | 亚洲国产精品欧美一二99| 午夜精品久久久久久久| av成人国产| 亚洲每日在线| 亚洲巨乳在线| 亚洲人人精品| 99精品国产在热久久下载|