• <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>

            yehao's Blog

            I/O完成端口簡單例子

            轉自http://www.cnblogs.com/pen-ink/articles/1834088.html


            HANDLE WINAPI CreateIoCompletionPort(
            __in HANDLE FileHandle,
            __in HANDLE ExistingCompletionPort,
            __in ULONG_PTR CompletionKey,
            __in DWORD NumberOfConcurrentThreads
            );
            /*
            這個函數完成兩個不同的任務:1、創建一個完成端口對象;2、將一個或者多個文件句柄關聯到I/O完成端口對象。可分成兩個小函數對CreateIoCompletionPort調用進行抽象。
            */
            //1、創建I/O完成端口
            HANDLE CreateNewCompletionPort(DWORD dwNumberOfConcurrentThreads)
            {
            return (CreateNewCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, dwNumberOfConcurrentThreads));
            }
            //2、將設備與I/O完成端口關聯起來
            BOOL AssociateDeviceWithCompletionPort(HANDLE hCompletionPort, HANDLE hDevice, DWORD dwCompletionKey)
            {
            HANDLE h
            = CreateIoCompletionPort(hDevice, hCompletionPort, dwCompletionKey, 0);
            return (h == hCompletionPort);
            }

            ?

            /////////////////////////////////////////////////
            // IOCPDemo.cpp文件 調試通過

            #include
            "WSAInit.h"
            #include
            <stdio.h>
            #include
            <windows.h>

            // 初始化Winsock庫
            CWSAInit theSock;

            #define BUFFER_SIZE 1024
            #define OP_READ 1
            #define OP_WRITE 2
            #define OP_ACCEPT 3

            typedef
            struct _PER_HANDLE_DATA // per-handle數據
            {
            SOCKET s;
            // 對應的套節字句柄
            sockaddr_in addr; // 客戶方地址
            char buf[BUFFER_SIZE]; // 數據緩沖區
            int nOperationType; // 操作類型
            } PER_HANDLE_DATA, *PPER_HANDLE_DATA;

            DWORD WINAPI ServerThread(LPVOID lpParam)
            {
            // 得到完成端口對象句柄
            HANDLE hCompletion = (HANDLE)lpParam;

            DWORD dwTrans;
            PPER_HANDLE_DATA pPerHandle;
            OVERLAPPED
            *pOverlapped;
            while(TRUE)
            {
            // 在關聯到此完成端口的所有套節字上等待I/O完成
            BOOL bOK = ::GetQueuedCompletionStatus(hCompletion,
            &dwTrans, (PULONG_PTR)&pPerHandle, &pOverlapped, WSA_INFINITE);
            if(!bOK) // 在此套節字上有錯誤發生
            {
            ::closesocket(pPerHandle
            ->s);
            ::GlobalFree(pPerHandle);
            ::GlobalFree(pOverlapped);
            continue;
            }

            if(dwTrans == 0 && // 套節字被對方關閉
            (pPerHandle->nOperationType == OP_READ || pPerHandle->nOperationType == OP_WRITE))

            {
            ::closesocket(pPerHandle
            ->s);
            ::GlobalFree(pPerHandle);
            ::GlobalFree(pOverlapped);
            continue;
            }

            switch(pPerHandle->nOperationType) // 通過per-I/O數據中的nOperationType域查看什么I/O請求完成了
            {
            case OP_READ: // 完成一個接收請求
            {
            pPerHandle
            ->buf[dwTrans] = '\0';
            printf(pPerHandle
            -> buf);

            // 繼續投遞接收I/O請求
            WSABUF buf;
            buf.buf
            = pPerHandle->buf ;
            buf.len
            = BUFFER_SIZE;
            pPerHandle
            ->nOperationType = OP_READ;

            DWORD nFlags
            = 0;
            ::WSARecv(pPerHandle
            ->s, &buf, 1, &dwTrans, &nFlags, pOverlapped, NULL);
            }
            break;
            case OP_WRITE: // 本例中沒有投遞這些類型的I/O請求
            case OP_ACCEPT:
            break;
            }
            }
            return 0;
            }


            void main()
            {
            int nPort = 4567;
            // 創建完成端口對象,創建工作線程處理完成端口對象中事件
            HANDLE hCompletion = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
            ::CreateThread(NULL,
            0, ServerThread, (LPVOID)hCompletion, 0, 0);

            // 創建監聽套節字,綁定到本地地址,開始監聽
            SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, 0);
            SOCKADDR_IN si;
            si.sin_family
            = AF_INET;
            si.sin_port
            = ::ntohs(nPort);
            si.sin_addr.S_un.S_addr
            = INADDR_ANY;
            ::bind(sListen, (sockaddr
            *)&si, sizeof(si));
            ::listen(sListen,
            5);

            // 循環處理到來的連接
            while(TRUE)
            {
            // 等待接受未決的連接請求
            SOCKADDR_IN saRemote;
            int nRemoteLen = sizeof(saRemote);
            SOCKET sNew
            = ::accept(sListen, (sockaddr*)&saRemote, &nRemoteLen);
            // 接受到新連接之后,為它創建一個per-handle數據,并將它們關聯到完成端口對象。
            PPER_HANDLE_DATA pPerHandle =
            (PPER_HANDLE_DATA)::GlobalAlloc(GPTR,
            sizeof(PER_HANDLE_DATA));
            pPerHandle
            ->s = sNew;
            memcpy(
            &pPerHandle->addr, &saRemote, nRemoteLen);
            pPerHandle
            ->nOperationType = OP_READ;
            ::CreateIoCompletionPort((HANDLE)pPerHandle
            ->s, hCompletion, (ULONG_PTR)pPerHandle, 0);
            // 投遞一個接收請求
            OVERLAPPED *pol = (OVERLAPPED *)::GlobalAlloc(GPTR, sizeof(OVERLAPPED));
            WSABUF buf;
            buf.buf
            = pPerHandle->buf;
            buf.len
            = BUFFER_SIZE;
            DWORD dwRecv;
            DWORD dwFlags
            = 0;
            ::WSARecv(pPerHandle
            ->s, &buf, 1, &dwRecv, &dwFlags, pol, NULL);
            }
            }

            posted on 2011-05-18 15:11 厚積薄發 閱讀(676) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

            導航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            99久久国产综合精品麻豆| 久久成人精品视频| 亚洲国产精品无码久久久蜜芽| 久久久久亚洲av综合波多野结衣| 亚洲精品乱码久久久久久| 久久福利青草精品资源站免费 | 中文字幕无码精品亚洲资源网久久| 国内高清久久久久久| 精品久久久久久无码中文字幕| 7777久久久国产精品消防器材| 91秦先生久久久久久久| 亚洲午夜无码久久久久| 久久久久久无码国产精品中文字幕| 国产69精品久久久久久人妻精品| 国产亚洲美女精品久久久| 欧美精品国产综合久久| 久久久精品人妻无码专区不卡| 久久狠狠高潮亚洲精品| 国产69精品久久久久APP下载| 国产精品欧美久久久天天影视| 久久天天婷婷五月俺也去| 国产精品99久久久久久www| 久久亚洲国产成人精品性色| 超级97碰碰碰碰久久久久最新| 久久本道久久综合伊人| a级成人毛片久久| 国产精品对白刺激久久久| 亚洲精品乱码久久久久久按摩 | 99久久99这里只有免费的精品| 国产毛片欧美毛片久久久| 伊人久久精品影院| 亚洲国产视频久久| 久久精品国产清自在天天线| 亚洲精品国产综合久久一线| 99久久精品国产一区二区三区| 四虎国产精品免费久久久| 久久精品国产影库免费看| 94久久国产乱子伦精品免费| 丁香久久婷婷国产午夜视频| 美女写真久久影院| 久久久久亚洲av成人无码电影|