2015-08-24 84 views
-1

我在x64平臺中使用IOCP時遇到了問題。IOCP無法在x64平臺上運行

當我在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()沒有錯誤,結構PerHandleData無法讀取內存:插座無法讀取內存也是如此ClientAddr。沒有價值。

所以當它運行到功能WSARecv(PerHandleData->socket, &(PerIoData->databuff), 1, &RecvBytes, &Flags, &(PerIoData->overlapped), NULL);應用程序將停止出現內存錯誤。

誰能告訴我該如何處理?

+0

我們需要看到更多的代碼。 –

回答

0

CreateIoCompletionPort的文檔告訴我們鑰匙從哪裏來;在使用GetQueuedCompletionStatus之前,您需要將密鑰傳遞給CreateIoCompletionPort

CreateIoCompletionPort的文檔還指出,密鑰應該是唯一的每個文件句柄。 (不只是每個文件)。

因此,由於我們沒有實際的代碼,這兩個要求是主要的嫌疑人。一個特別的挑戰可能是完成密鑰的間接程度。您將密鑰傳遞給CreateIoCompletionPort,並將指針傳遞給密鑰GetQueuedCompletionStatus(因此它會將密鑰放在指向位置 - 它是一個OUT參數)。而這個關鍵可能是一個指針本身。

0

我只是遇到同樣的問題,問題是在32位時,我只是將完成密鑰投給DWORD並將它傳遞給CreateIoCompletionPort調用。在64位應用程序中,它仍然可以構建,只是一個編譯器警告。更改代碼並轉換爲ULONG_PTR將解決該問題。 compler警告只是告訴原因:data truncated。當點地址大於32位時,GetQueuedCompletionStatus將得到截斷地址,只有32位。

相關問題