2015-08-24 5 views
-1

Я столкнулся с проблемой при использовании IOCP в платформе x64.IOCP не может работать на платформе x64

Когда я компилирую свой код на платформе win32, он работает хорошо. Но когда я изменить его на платформе x64, функция

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

returnes правда, не передать значения 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 бит.

Смежные вопросы