中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SOCKET重疊I/O模型

發布時間:2020-07-29 04:13:27 來源:網絡 閱讀:1603 作者:超級極客 欄目:編程語言

1重疊模型的優點

1可以運行在支持Winsock2的所有Windows平臺,而不像完成端口只支持NT系統

2比起阻塞,select,WSAAsyncSelect以及WSAEventSelect等模型,重疊I/O(Overlapped I/O)模型使應用程序能達到更加系統性能

因為他和其他4種模型不同的是,使用重疊模型的應用程序通知緩沖區收發系統直接使用數據,也就是說,如果應用程序

投遞了一個10kb大小的緩沖區來接收數據,而數據已經到達套接字,則將該數據直接拷貝到投遞的緩沖區,

而4種模型中,數據達到并拷貝到單套接字接收緩沖區,此時應用程序會被告知可以讀入的容量,當應用程序調用

接收函數之后,數據才從單套接字緩沖區拷貝應用程序到緩沖區,差別就體現了。


2重疊模型的基本原理

重疊模型是讓應用程序使用重疊數據結構(WSAOVERLAPPED),一次投遞一個或多個Winsock I/O請求,針對這些提交的

請求,在他們完成之后,應用程序會收到通知,于是就可通過自己的代碼來處理這些數據了。

使用事件通知的方法來實現重疊IO模型,基于事件的話,就要求將Win事件與WSAOVERLAPPED結構關聯在一起,

使用重疊結構,常用的send,sendto,recv,recvform也被WSASend,WSARecv等替換掉,

OVERLAPPER SOCKET(重疊Socket)上進行重疊發送的操作,(簡單的理解就是異步send,recv)

他們的參數中都有一個Overlapped參數,就是說所有的重疊Socket都要綁定到這個重疊結構體上,

提交一個請求,其他的事情就交給重疊結構去操心, 而其中重疊結構要與Windows事件綁定在一起, 

在樣,我們調用完WSARecv后.等重疊操作完成,就會有對應的事件來同意我們操作完成,



2重疊模型的基礎知識


typedef struct _OVERLAPPED {
    ULONG_PTR Internal;
    ULONG_PTR InternalHigh;
    union {
        struct {
            DWORD Offset;
            DWORD OffsetHigh;
        } DUMMYSTRUCTNAME;
        PVOID Pointer;
    } DUMMYUNIONNAME;
    HANDLE  hEvent;  //我們只要關注這個參數, 用來關聯事件的
} OVERLAPPED, *LPOVERLAPPED;

2WSARecv系列函數

在重疊模型中,接收數據就要靠他了,他的參數也比recv多定義是這樣的:

int WSArecv(
    SOCKET s, //投遞這個操作的套接字
    LPWSABUF lpBuffer,//接收緩沖區,與Recv函數不同
    LPDWORD lpNumberOfBytesRecvd,//如果接收操作立即完成,這里會返回函數調用
    LPDWORD lpFlags, //默認為0
    LPWSAOVERLAPPER lpOverlapper,//綁定的重疊結構
    LPWSAOVERLAPPER_COMPLETION_ROUTINE lpCompletionRoutine //一個回調
    );
    返回值:
    WSA_IO_PENDING:常見返回值,說明WSARecv操作成功,但是I/O材質沒完成,所以需要綁定一個事件來通知


3WSAWaitForMultipleEvents函數

等待某個事件觸發的函數,我們需要事件通知我們完成重疊操作,所以需要用到這個參數。

這個函數只能有WSA_MAXIMUM_WAIT_EVENTS對象定義的一個最大值,是64,就是他只能等待64個事件

如果決的小了,就要創建額外的線程,或線程池。

  DWORD WSAWaitForMultipleEvents(
     DWORD cEvents,                        // 等候事件的總數量
     const WSAEVENT* lphEvents,           // 事件數組的指針
     BOOL fWaitAll,          // 如果設置為TRUE則事件中所有的事件被傳信才返回,FALSE是當有事件立即返回
     DWORD dwTimeout,    // 超時時間,如果超時,函數會返回 WSA_WAIT_TIMEOUT
     // 如果設置為0,函數會立即返回  // 如果設置為 WSA_INFINITE只有在某一個事件被傳信后才會返回
        BOOL fAlertable  )     // 默認用FALSE
  返回值:
    WSA_WAIT_TIMEOUT :最常見的返回值,我們需要做的就是繼續等待
    WSA_WAIT_FAILED : 出現了錯誤,請檢查cEvents和lphEvents兩個參數是否有效


4WSAGetOverlappedResult函數

既然通過WSAWaitForMultipleEvents函數來得到重疊操作的結果,那我們也需要一個函數來查詢

一下重疊操作的結果, 這個函數不需要關注返回值 

BOOL WSAGetOverlappedResult(
  SOCKET s,                   // SOCKET,不用說了
  LPWSAOVERLAPPED lpOverlapped,  // 這里是我們想要查詢結果的那個重疊結構的指針
  LPDWORD lpcbTransfer,     // 本次重疊操作的實際接收(或發送)的字節數
  BOOL fWait,                // 設置為TRUE,除非重疊操作完成,否則函數不會返回
                              // 設置FALSE,而且操作仍處于掛起狀態,那么函數就會返回FALSE
  LPDWORD lpdwFlags       // 指向DWORD的指針,負責接收結果標志  
  第二個參數是輸出的  第三個參數也是輸出的,就是你接收的字節數 為0那說明對方關閉socket了






向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东方市| 新乡县| 岳阳市| 永川市| 隆昌县| 精河县| 怀仁县| 道真| 靖西县| 蒙山县| 登封市| 高唐县| 汽车| 周宁县| 杂多县| 开封县| 扬中市| 平顺县| 如皋市| 新竹县| 化德县| 裕民县| 东港市| 五指山市| 霸州市| 治县。| 肇庆市| 竹山县| 望江县| 武鸣县| 安陆市| 长子县| 浪卡子县| 红原县| 潍坊市| 大田县| 虹口区| 尚义县| 黔江区| SHOW| 郸城县|