Я работаю над UDP-сервером и пытаюсь использовать перекрывающийся ввод-вывод. Я пытался использовать примеры и документацию MSDN для исследования, но не нашел использования аргумента lpCompletionRoutine
функции.
Я заметил, что вы передаете PWSAOVERLAPPED
WSARecvFrom
, и он содержит LPVOID Pointer
член. Могу ли я создать свою собственную структуру пользовательских данных, содержащую ссылку на буфер, и передать ее как указатель внутри этого Pointer
члена PWSAOVERLAPPED
?
Я подумал, что это немного избыточно, хотя полученные байты были доступны в двух местах:
lpNumberOfBytesRecvd
аргумент WSARecvFrom
и параметр cbTransferred
lpCompletionRoutine
.
Пример моей текущей процедуры завершения:
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
);
WSAWaitForMultipleEvents
, потому что указываете собственное событие, которое не является допустимым дескриптором. - person jacob   schedule 08.06.2018