【发布时间】:2014-01-23 02:40:11
【问题描述】:
这是我的 PER_IO_CONTEXT 结构(我将它们存储在单链表中):
typedef struct _PER_IO_CONTEXT
{
SLIST_ENTRY ItemEntry;
WSAOVERLAPPED Overlapped;
WSABUF wsabuf;
/* some other data*/
} PER_IO_CONTEXT, *PPER_IO_CONTEXT;
以下是 WSAsend ,它使用列表来获取 WSAOVERLAPPED 结构:
...
PSLIST_HEADER pListHead;
...
PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(pListHead);
PPER_IO_CONTEXT ovl = (PPER_IO_CONTEXT)pListEntry;
WSASend(pTmp1->Socket,..., &(ovl->Overlapped), NULL);
以及GQCS收到通知的最后一部分:
LPWSAOVERLAPPED lpOverlapped = NULL;
PPER_IO_CONTEXT lpIOContext = NULL;
....
GetQueuedCompletionStatus(..... (LPOVERLAPPED *)&lpOverlapped, INFINITE);
lpIOContext = (PPER_IO_CONTEXT)lpOverlapped;
lpIOContext->wsabuf // this fail
如您所见,以下转换 lpIOContext =(PPER_IO_CONTEXT)lpOverlapped 不起作用,因为 WSAsend 提供了 wsaoverlapped - PER_IO_CONTEXT 结构的第二个成员,因此不能取消引用,例如 lpIOContext->在这种情况下使用。
有办法处理这种情况吗?
【问题讨论】:
标签: c++ windows singly-linked-list iocp