IOCP无法在x64平台上运行

时间:2015-08-24 12:23:48

标签: c++ 64-bit iocp

我在x64平台上使用IOCP时遇到了问题。

当我在win32平台上编译我的代码时,它运行良好。但是当我将其更改为x64平台时,功能

GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,(PULONG_PTR)&PerHandleData, (LPOVERLAPPED*)&IpOverlapped, INFINITE)

返回true而不将值传递给PerHandleData。

PerHandleData定义为:

typedef struct
{
SOCKET socket;
SOCKADDR_STORAGE ClientAddr;
}PER_HANDLE_DATA,*LPPER_HANDLE_DATA;
LPPER_HANDLE_DATA PerHandleData;

这意味着,即使函数GetQueuedCompletionStatus()似乎没有错误,struct PerHandleData也无法读取内存:socket无法读取内存,ClientAddr也是如此。没有价值观。

所以当它运行到WSARecv(PerHandleData->socket, &(PerIoData->databuff), 1, &RecvBytes, &Flags, &(PerIoData->overlapped), NULL)时;应用程序将停止内存错误。

谁能告诉我如何处理它?<​​/ p>

2 个答案:

答案 0 :(得分:0)

target的文档告诉我们密钥的来源;在将其与CreateIoCompletionPort一起使用之前,您需要将密钥传递给GetQueuedCompletionStatus

CreateIoCompletionPort的文档还指出,每个文件句柄的密钥应该是唯一的。 (不仅仅是每个文件)。

因此,由于我们没有实际代码,因此这两个要求是主要的嫌疑人。一个特别的挑战可能是完成密钥的间接级别。您将密钥传递给CreateIoCompletionPort并将指针传递给CreateIoCompletionPort的密钥(因此它会将密钥放在指向的位置 - 它是一个&#39} OUT论点)。那个键可能是一个指针本身。

答案 1 :(得分:0)

我刚遇到同样的问题,问题是在32位时,我只是将完成密钥转换为DWORD并将其传递给CreateIoCompletionPort调用。在64位应用程序中,它仍然可以构建,只是编译器警告。更改代码并转换为ULONG_PTR将解决问题。编译器警告只是说明原因:data truncated。当点地址大于32位时,GetQueuedCompletionStatus将获得截断的地址,仅为32位。