• <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完成端口簡單例子

            轉(zhuǎn)自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
            );
            /*
            這個(gè)函數(shù)完成兩個(gè)不同的任務(wù):1、創(chuàng)建一個(gè)完成端口對象;2、將一個(gè)或者多個(gè)文件句柄關(guān)聯(lián)到I/O完成端口對象。可分成兩個(gè)小函數(shù)對CreateIoCompletionPort調(diào)用進(jìn)行抽象。
            */
            //1、創(chuàng)建I/O完成端口
            HANDLE CreateNewCompletionPort(DWORD dwNumberOfConcurrentThreads)
            {
            return (CreateNewCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, dwNumberOfConcurrentThreads));
            }
            //2、將設(shè)備與I/O完成端口關(guān)聯(lián)起來
            BOOL AssociateDeviceWithCompletionPort(HANDLE hCompletionPort, HANDLE hDevice, DWORD dwCompletionKey)
            {
            HANDLE h
            = CreateIoCompletionPort(hDevice, hCompletionPort, dwCompletionKey, 0);
            return (h == hCompletionPort);
            }

            ?

            /////////////////////////////////////////////////
            // IOCPDemo.cpp文件 調(diào)試通過

            #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數(shù)據(jù)
            {
            SOCKET s;
            // 對應(yīng)的套節(jié)字句柄
            sockaddr_in addr; // 客戶方地址
            char buf[BUFFER_SIZE]; // 數(shù)據(jù)緩沖區(qū)
            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)
            {
            // 在關(guān)聯(lián)到此完成端口的所有套節(jié)字上等待I/O完成
            BOOL bOK = ::GetQueuedCompletionStatus(hCompletion,
            &dwTrans, (PULONG_PTR)&pPerHandle, &pOverlapped, WSA_INFINITE);
            if(!bOK) // 在此套節(jié)字上有錯(cuò)誤發(fā)生
            {
            ::closesocket(pPerHandle
            ->s);
            ::GlobalFree(pPerHandle);
            ::GlobalFree(pOverlapped);
            continue;
            }

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

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

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

            // 繼續(xù)投遞接收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;
            // 創(chuàng)建完成端口對象,創(chuàng)建工作線程處理完成端口對象中事件
            HANDLE hCompletion = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
            ::CreateThread(NULL,
            0, ServerThread, (LPVOID)hCompletion, 0, 0);

            // 創(chuàng)建監(jiān)聽套節(jié)字,綁定到本地地址,開始監(jiān)聽
            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);

            // 循環(huán)處理到來的連接
            while(TRUE)
            {
            // 等待接受未決的連接請求
            SOCKADDR_IN saRemote;
            int nRemoteLen = sizeof(saRemote);
            SOCKET sNew
            = ::accept(sListen, (sockaddr*)&saRemote, &nRemoteLen);
            // 接受到新連接之后,為它創(chuàng)建一個(gè)per-handle數(shù)據(jù),并將它們關(guān)聯(lián)到完成端口對象。
            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);
            // 投遞一個(gè)接收請求
            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 厚積薄發(fā) 閱讀(683) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程

            導(dǎo)航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            青青草原综合久久大伊人| 精品无码久久久久国产| 久久亚洲av无码精品浪潮| 久久99精品国产麻豆蜜芽| 国产精品美女久久福利网站| 久久人人爽人人爽AV片| 99久久精品免费看国产一区二区三区| 精品无码久久久久国产动漫3d| 国内精品伊人久久久久| 国产农村妇女毛片精品久久| 国产精品久久久久久久久久影院 | 一本综合久久国产二区| 亚洲午夜久久久久妓女影院| 久久综合久久综合久久综合| 伊人久久大香线蕉综合网站| 色综合久久中文色婷婷| 伊人久久大香线蕉亚洲五月天| 伊人久久大香线蕉精品| 久久精品国产亚洲av麻豆图片| 999久久久国产精品| 少妇精品久久久一区二区三区| 精品久久久久久无码免费| 国产精品久久久久AV福利动漫| 久久天天躁狠狠躁夜夜2020老熟妇| 久久亚洲日韩精品一区二区三区 | 国产A级毛片久久久精品毛片| 久久久亚洲裙底偷窥综合| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久天天躁狠狠躁夜夜躁2O2O| 亚洲一区中文字幕久久| 国产成人精品久久免费动漫| 婷婷久久久亚洲欧洲日产国码AV | 久久综合九色综合久99| 久久久久久久久无码精品亚洲日韩 | 99久久99久久精品国产片| 人妻精品久久无码区| 久久久WWW成人免费毛片| 久久超乳爆乳中文字幕| 国内精品九九久久精品 | 高清免费久久午夜精品| 亚洲乱码日产精品a级毛片久久 |