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]\r\n", ::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_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"USERPostMessageLimit"=dword:000FFFFF

转载于:https://www.cnblogs.com/gegelaopiaoke/p/10610200.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值