我正在使用UDP服务器,并尝试使用重叠IO。我一直在尝试使用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
);
答案 0 :(得分:0)
来自WSAOVERLAPPED
结构documentation:
hEvent类型:HANDLE 如果在没有I / O完成例程的情况下发出重叠I / O操作(操作的lpCompletionRoutine参数为 设置为null),那么此参数应包含有效句柄 到WSAEVENT对象或为null。如果是lpCompletionRoutine参数 调用是非null然后应用程序可以自由使用它 参数必要。
因为我提供lpCompletionRoutine
参数,我可以使用WSAEvent
作为指向我的用户定义数据的指针。
感谢那位让我了解这一发现的评论者。