• <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 厚積薄發 閱讀(689) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

            導航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            久久国产精品-国产精品| 少妇熟女久久综合网色欲| 狠狠狠色丁香婷婷综合久久俺| 97久久久精品综合88久久| 国产精自产拍久久久久久蜜| 久久夜色精品国产亚洲av| 精品熟女少妇av免费久久| 99久久婷婷国产综合精品草原| 伊人色综合久久天天人守人婷 | 99久久www免费人成精品| 色播久久人人爽人人爽人人片AV| 国产综合久久久久| 久久精品中文无码资源站| 99久久成人18免费网站| 无码人妻久久一区二区三区免费 | 久久国产精品波多野结衣AV| 久久天天躁狠狠躁夜夜网站| 国产亚洲色婷婷久久99精品91 | 99久久精品免费看国产一区二区三区| 色欲综合久久中文字幕网 | 国产V亚洲V天堂无码久久久| 久久精品女人天堂AV麻| 久久美女网站免费| 欧美va久久久噜噜噜久久| 日韩欧美亚洲国产精品字幕久久久 | 久久免费精品视频| 亚洲日韩中文无码久久| 久久人人爽人爽人人爽av| 99久久精品免费国产大片| 91麻精品国产91久久久久| 久久99精品国产麻豆宅宅| 久久亚洲AV成人无码电影| 久久久久久久久波多野高潮| 欧美亚洲国产精品久久高清| 午夜精品久久久内射近拍高清| 久久亚洲精品无码观看不卡| 久久精品女人天堂AV麻| 色综合久久中文字幕综合网| 国产香蕉久久精品综合网| 综合网日日天干夜夜久久| 成人国内精品久久久久一区|