【问题标题】:casting issue with linked list item链接列表项的铸造问题
【发布时间】: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


    【解决方案1】:

    要获取相应 PER_IO_CONTEXT 结构的地址,您可以使用:

    lpIOContext = CONTAINING_RECORD(lpOverlapped, PER_IO_CONTEXT, Overlapped);
    

    CONTAINING_RECORD 是在VC\crt\src\collections.h 中定义的宏:

    #define CONTAINING_RECORD(address, type, field) \
        ((type *)((char *)(address) - (ULONG_PTR)(&((type *)0)->field)))
    

    更多信息:http://msdn.microsoft.com/en-us/library/windows/hardware/ff542043%28v=vs.85%29.aspx

    【讨论】:

      【解决方案2】:

      我不确定是否支持将指向结构成员的指针转换为指向该结构的指针的机制。您可以将所有内容转换为 BYTE * 并进行算术运算,这在实践中可行,但根据您的需要,重新组织可能会更简洁以避免必要性:

      typedef struct _PER_IO_CONTEXT 
      {
         WSAOVERLAPPED     Overlapped;
         WSABUF                 wsabuf; 
         /* some other data*/
      } PER_IO_CONTEXT, *PPER_IO_CONTEXT;
      
      typedef struct _PER_IO_CONTEXT_LIST_ITEM
      {
         SLIST_ENTRY       ItemEntry;
         PER_IO_CONTEXT    Item;
      } PER_IO_CONTEXT_LIST_ITEM, *PPER_IO_CONTEXT_LIST_ITEM;
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      相关资源
      最近更新 更多