我在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>
答案 0 :(得分:0)
target
的文档告诉我们密钥的来源;在将其与CreateIoCompletionPort
一起使用之前,您需要将密钥传递给GetQueuedCompletionStatus
。
CreateIoCompletionPort
的文档还指出,每个文件句柄的密钥应该是唯一的。 (不仅仅是每个文件)。
因此,由于我们没有实际代码,因此这两个要求是主要的嫌疑人。一个特别的挑战可能是完成密钥的间接级别。您将密钥传递给CreateIoCompletionPort
并将指针传递给CreateIoCompletionPort
的密钥(因此它会将密钥放在指向的位置 - 它是一个&#39} OUT论点)。那个键可能是一个指针本身。
答案 1 :(得分:0)
我刚遇到同样的问题,问题是在32位时,我只是将完成密钥转换为DWORD
并将其传递给CreateIoCompletionPort
调用。在64位应用程序中,它仍然可以构建,只是编译器警告。更改代码并转换为ULONG_PTR
将解决问题。编译器警告只是说明原因:data truncated
。当点地址大于32位时,GetQueuedCompletionStatus
将获得截断的地址,仅为32位。