• <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
            );
            /*
            這個函數(shù)完成兩個不同的任務(wù):1、創(chuàng)建一個完成端口對象;2、將一個或者多個文件句柄關(guān)聯(lián)到I/O完成端口對象。可分成兩個小函數(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é)字上有錯誤發(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: // 完成一個接收請求
            {
            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)建一個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);
            // 投遞一個接收請求
            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)計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            久久久久久A亚洲欧洲AV冫| 久久久久一本毛久久久| 久久久久波多野结衣高潮| 久久久无码精品亚洲日韩蜜臀浪潮| 久久久久这里只有精品| 伊人久久综合无码成人网| 亚洲综合婷婷久久| 亚洲精品美女久久777777| 国产AⅤ精品一区二区三区久久| 欧美成人免费观看久久| 9999国产精品欧美久久久久久| 久久夜色撩人精品国产小说| 人妻少妇久久中文字幕| 99久久国产综合精品女同图片| 久久久久久国产精品免费无码| 日本WV一本一道久久香蕉| 久久嫩草影院免费看夜色| 色综合久久无码中文字幕| 久久se这里只有精品| 国产精品久久久久一区二区三区| 国内精品伊人久久久影院 | 青青青青久久精品国产h久久精品五福影院1421 | 久久久久亚洲av毛片大| 精品免费tv久久久久久久| 亚洲日本久久久午夜精品| 精品一区二区久久| 97久久精品无码一区二区| 潮喷大喷水系列无码久久精品| 久久久久久毛片免费播放| 久久人人添人人爽添人人片牛牛 | 人妻精品久久无码专区精东影业| 国产高潮久久免费观看| 久久综合九色综合精品| www亚洲欲色成人久久精品| 东京热TOKYO综合久久精品| www久久久天天com| 国产精品久久久久久吹潮| 一本大道久久香蕉成人网| 精品国产乱码久久久久久浪潮| 免费观看久久精彩视频| 久久人人爽人人爽人人片av高请|