首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

IOCP编程,lpComletionKey和lpOverlapped参数是什么意思?该如何处理

2012-03-08 
IOCP编程,lpComletionKey和lpOverlapped参数是什么意思?C/C++ codeBOOL WINAPI GetQueuedCompletionStatus

IOCP编程,lpComletionKey和lpOverlapped参数是什么意思?

C/C++ code
BOOL WINAPI GetQueuedCompletionStatus(      __in          HANDLE CompletionPort,      __out         LPDWORD lpNumberOfBytes,      __out         PULONG_PTR lpCompletionKey,      __out         LPOVERLAPPED* lpOverlapped,      __in          DWORD dwMilliseconds    );


这个函数原型我搬来了,看了一天技术博客我已经晕掉了,求各位大虾大牛讲讲lpCompletionKey,尤其是lpOverlapped到底是怎么用的,越浅显易懂越好,实在是不会了……
(我知道lpOverlapped是和重叠IO有关,但是实在不知怎么用啊)

作为一名菜鸟级非雄性程序员,谢谢大家了T_T~

[解决办法]
lpcompletionkey:当文件I/O操作完成后,用于存放与之关联的completion key。 
lpoverlapped:为调用IOCP机制所引用的OVERLAPPED结构。

二者都是指针参数。

该函数用于实现从指定的IOCP获取CP。当CP队列为空时,对此函数的调用将被阻塞,而不是一直等待I/O的完成。当CP队列不为空时,被阻塞的线程将以后进先出(LIFO)顺序被释放。对于IOCP机制,它允许多线程并发调用GetQueuedCompletionStatus函数,最大并发数是在调用CreateIoCompletionPort函数时指定的,超出最大并发数的调用线程,将被阻塞。

调用成功,则返回非零数值,相关数据存于lpNumberOfBytes、lpCompletionKey、lpCompletionKey变量中

更详细的解释楼主可参考:http://tech.ddvip.com/2009-09/1254299357134884.html
[解决办法]
我最近也刚开始学IOCP,遇到N多问题,不过现在还算了解了不少,慢慢积累,一口吃不成胖子
http://blog.csdn.net/yu52000guang/article/details/7061382
[解决办法]
__out PULONG_PTR lpCompletionKey,
__out LPOVERLAPPED* lpOverlapped,

----
lpCompletionKey, 这个是你将套接字与完成端口建立关系时提供给完成端口的上下文指针,从这个函数里,完成端口再提示给你。

lpOverlapped,这个是与本次完成操作相关的上下文。

总结来说,lpCompletionKey是与套接字句柄相关的上下文,lpOverlapped是与此次操作相关的上下文。
[解决办法]
lpCompletionKey 就是"谁"
lpOverlapped 就是"做了什么"
连起来就是 谁做(完成)了什么

[解决办法]
BOOL GetQueuedCompletionStatus(   
HANDLE CompletionPort,   
LPDWORD lpNumberOfBytes,   
PULONG_PTR lpCompletionKey,   
LPOVERLAPPED *lpOverlapped,   
DWORD dwMilliseconds);
   
调用参数:   
CompletionPort:指定的IOCP,该值由CreateIoCompletionPort函数创建。   
lpnumberofbytes:一次完成后的I/O操作所传送数据的字节数。   
lpcompletionkey:当文件I/O操作完成后,用于存放与之关联的CK。   
lpoverlapped:为调用IOCP机制所引用的OVERLAPPED结构。   
dwmilliseconds:用于指定调用者等待CP的时间。   

返回值:   
调用成功,则返回非零数值,相关数据存于lpNumberOfBytes、lpCompletionKey、lpoverlapped变量中。失败则返回零值。
[解决办法]
pCompletionKey 是一个句柄唯一数据,指示套接字的唯一性,常常适合套接字关联一起的
其实这个参数在GetQueuedCompletionStatus()函数中指示一个对象,用来从完成端口队列中读出完成封包时,会将套接字写入这个对象中;
而这个对象的创建是在服务器接受到连接请求时createIoCompletionPort()函数关联通过accept创建的新的套接字时创建,尤其可以指出的是他往往是一个指针。
HANDLE WINAPI CreateIoCompletionPort(
__in HANDLE FileHandle,
__in HANDLE ExistingCompletionPort,
__in ULONG_PTR CompletionKey,
__in DWORD NumberOfConcurrentThreads
);

你可以这样定义这个对象
typedef struct _per_handle
{
SOCKET s; //连接套接字
SOCKADDR_IN addr;//连接客服端地址
}PER_HANDLE, *PPER_HANDLE;

然后在ACCEPT创建套接字并且成功后
例如:SOCKET sNew = accept(sLiten, (sockaddr*)&sin, iLength);

//分配pCompletionKey 对象
PPER_HANDLE per_handle = (PPER_HANDLE)GlobalAlloc(GPTR, sizeof(PER_HANDLE));
CreateIoCompletionPort(sNew, //套接字句柄
hCompletion, //完成端口对象
per_handle,//这里好像要注意下类型转换
0//默认同时运行的线程数与处理器相同
)

而在GetQueuedCompletionStatus()函数中只是一个对象罢了!
[解决办法]
探讨

lpCompletionKey 就是"谁"


lpOverlapped 就是"做了什么"
连起来就是 谁做(完成)了什么

热点排行