• IOCP之客户端及消息传递


    上篇说到IOCP的精简实现,这篇来讲IOCP客户端和消息传递

    在ConnectEx代码之前,CreateIoCompletionPort的第三个参数,把socket句柄+0x01000000作为传递

    复制代码
            sNew = ::WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
            if (sNew != SOCKET_ERROR)
            {
                ::CreateIoCompletionPort((HANDLE)sNew, hCompletion, (DWORD)sNew+0x01000000, 0);
                ::bind(sNew, (sockaddr*)&Local, sizeof(Local));
                if (ConnectEx(sNew, (PSOCKADDR)&SSer, sizeof(SSer), NULL, 0, &dwRecv, &over) == FALSE)
                {
                    if (::WSAGetLastError() != ERROR_IO_PENDING)
                    {
                        printf("ConnectEx failed with error [%d]
    ", ::WSAGetLastError());
                    }
                }
            }
    复制代码

    工作线程接收到,ConnectEx异步处理结果时,通过GetQueuedCompletionStatus接收第三个参数,做响应的处理即可

    复制代码
    char *cTmp = (char*)&SSoc;
    
    ::GetQueuedCompletionStatus(hCompletion, &dTmp,(LPDWORD)&SSoc, &OverLapped, WSA_INFINITE);
    
    switch (cTmp[3])
    {
        case 0x01:
        {
            cTmp[3] = 0;
            .....处理
        }
        break;
    }
    复制代码

    后续WSASend、WSARecv等可以使用PostQueuedCompletionStatus方式调用即可,当然消息可以自定义,CON:0x01、Send:0x02,Recv:0x03、closesocket:0x04等等,要注意后面要补齐6个0,这样就实现了SOCKET句柄带消息类型传递。

    PostQueuedCompletionStatus(hCompletion, DWORD(0), (DWORD)sNew+0x01000000, NULL);

    甚至还可以用WSAAsyncSelect这货的PostThreadMessage传递MSG,用之前要修改注册表设置最大消息上限。

    Windows Registry Editor Version 5.00

    ;增加消息上限
    [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWindows]
    "USERPostMessageLimit"=dword:000FFFFF

  • 相关阅读:
    CSS3 选择器——伪类选择器详细讲解
    关于endnote与word或wps关联的问题
    高通量测序中,reads、contigs、scaffold之间的联系
    转录组中 实验设计 的相关问题
    RNA-Seq分析软件HTSeq的安装
    bash下特殊字符的含义
    常见的测序名词解释
    RNA-seq数据分析注意事项
    RNASeq中常见的分析流程
    WGS/WES/RNAseq/CHIP-seq之间的差别
  • 原文地址:https://www.cnblogs.com/gegelaopiaoke/p/10610200.html
Copyright © 2020-2023  润新知