Как получить буфер в CompletionROUTINE отдельно от вызова WSARecvFrom? - PullRequest
0 голосов
/ 07 июня 2018

Я работаю на сервере UDP и пытаюсь использовать перекрывающийся ввод-вывод.Я пытался использовать примеры MSDN и документацию для исследования, но не нашел использования аргумента lpCompletionRoutine функции.

Я заметил, что вы передаете PWSAOVERLAPPED в WSARecvFrom, и этосодержит LPVOID Pointer член.Могу ли я создать свою собственную структуру пользовательских данных, которая содержит ссылку на буфер, и передать ее в качестве указателя внутри этого Pointer члена PWSAOVERLAPPED?

Я думал, что это немного избыточно, хотя получаемыйбайты были доступны в двух местах:

WSARecvFrom аргумент lpNumberOfBytesRecvd и lpCompletionRoutine cbTransferred параметр.

Пример моей текущей процедуры завершения:

void CALLBACK CompletionROUTINE(
  DWORD dwError, 
  DWORD cbTransferred, 
  LPWSAOVERLAPPED lpOverlapped, 
  DWORD dwFlags
) {
    UNREFERENCED_PARAMETER(dwError);
    UNREFERENCED_PARAMETER(lpOverlapped);
    UNREFERENCED_PARAMETER(dwFlags);

    /* Best way to get the bytes read here? */
    Printf(L"Recieved %d bytes\n", cbTransferred);
}

и мой звонок WSARecvFrom:

iResult = WSARecvFrom(
    listenSocket, 
    &wsaBuffer, 
    1, 
    &dwBytesRecieved, 
    &dwFlags, 
    (PSOCKADDR)&sender, 
    &senderAddrSize, 
    &wsaOverlapped,
    CompletionROUTINE
);

1 Ответ

0 голосов
/ 08 июня 2018

Из документации WSAOVERLAPPED структура документация :

hEvent Тип: HANDLE Если перекрывающаяся операция ввода-вывода выполняется без процедуры завершения ввода-вывода (операция lpCompletionRoutineпараметр имеет значение null), тогда этот параметр должен содержать допустимый дескриптор объекта WSAEVENT или быть нулевым.Если параметр вызова lpCompletionRoutine не равен нулю, приложения могут использовать этот параметр по мере необходимости.

Так как я предоставляю параметр lpCompletionRoutine, я могу использовать WSAEvent в качествеуказатель на мои пользовательские данные.

Спасибо комментатору, который привел меня к этому выводу.

...