Я работаю на сервере 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
);