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

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

        sNew = ::WSASocket(AF_INET, SOCK_STREAM, , NULL, , WSA_FLAG_OVERLAPPED);
if (sNew != SOCKET_ERROR)
{
::CreateIoCompletionPort((HANDLE)sNew, hCompletion, (DWORD)sNew+0x01000000, );
::bind(sNew, (sockaddr*)&Local, sizeof(Local));
if (ConnectEx(sNew, (PSOCKADDR)&SSer, sizeof(SSer), NULL, , &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[])
{
case 0x:
{
cTmp[] = ;
.....处理
}
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

IOCP之客户端及消息传递的更多相关文章

  1. 【转】IOCP创建

    转自:http://www.cmnsoft.com/wordpress/?p=248 感谢原作者.我在此整理一下: 完成端口(IOCP)是WINDOWS平台上特有的一种技术.要使用IOCP技术,就要用 ...

  2. 多线程下的神奇的IOCP

    https://blog.csdn.net/lijia626482312/article/details/40858061 一个人从接到项目到昨天终于完成,用了差不多4个月,其中各种心酸和眼泪.我的项 ...

  3. IOCP~~

    下载源代码 原文网址:http://www.codeproject.com/KB/IP/iocp_server_client.aspx 源码使用了高级的完成端口(IOCP)技术,该技术可以有效地服务于 ...

  4. 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  5. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  6. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  7. 高性能 Socket 组件 HP-Socket v3.2.1 正式发布

    HP-Socket 是一套通用的高性能 TCP/UDP Socket 组件,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C ...

  8. 高性能 Socket 组件 HP-Socket v3.1.3 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件,提供服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP/ ...

  9. 【新年呈献】高性能 Socket 组件 HP-Socket v3.1.2 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

随机推荐

  1. 并发编程 17—— Lock

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  2. 字符串与模式匹配(一)——KMP算法

    源码:kmp.cpp // KMP.cpp : Defines the entry point for the console application. // #include "stdaf ...

  3. Windows—JDK安装与环境变量配置

    本文介绍JDK的安装与环境变量配置. 工具/原料 JDK1.8.0_65 WIN7 32bit jdk-8u65-windows-i586.exe 方法/步骤  安装JDK 选择安装目录 安装过程中会 ...

  4. Android Genymotion无法启动

    virtualbox无法启动,闷声作大死改了uxtheme.dll导致系统无法启动,正确的解决方法 关于在64位win7下运行Virtualbox安装系统时出错(提示VBoxDD.DLL错误)的解决方 ...

  5. ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别

    一.Delegate Delegate本质是一种程序设计模型,iOS中使用Delegate主要用于两个页面之间的数据传递.iphone中常用@protocol和delegate的机制来实现接口的功能. ...

  6. 使用Markdown+Pandoc+LaTex+Beamer制作幻灯片

    概述 为什么使用markdown? mardown是一种轻量级的标记语言,语法简单,可读性好,并且容易转化成其他格式的文档, 在技术文档撰写中得到越来越广泛的应用.相信大家对markdown都有一定了 ...

  7. codeforces 451D Count Good Substrings

    题意:给定一个字符串,求有多少个奇数子串和多少偶数子串为 “回文串”   这边回文串很特殊之含有  ab  两种字母  而且  相邻的字母相同则消去一个  一直到不存在相邻的相同. 思路:  在这种串 ...

  8. CSS垂直居中指南

    大概整理下css中的垂直居中问题 主要分两大类 1 知道块元素尺寸,一般就是指知道元素高度. 方法一:最简单的,类比水平居中. 思路:子元素设置为absolute;  top bottom都设置为0 ...

  9. 如何使用DDMS

    Android DDMS如何使用? DDMS 的全称是Dalvik Debug Monitor Service,它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息.Logca ...

  10. vs2013 遇到的web性能记录器无法使用问题

    诊断和修复Web测试记录栏的问题.自2005年以来VSTS运也出现了各种由客户多年来提出不同的问题.记录Web测试时,这在一定程度经常提到的一个话题是一个残疾或不存在的Web测试记录吧.因为它可以令人 ...