如何将缓冲区作为WSARecvFrom调用的一部分进入CompletionROUTINE?

时间:2018-06-07 08:36:00

标签: c windows winsock2

我正在使用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
);

1 个答案:

答案 0 :(得分:0)

来自WSAOVERLAPPED结构documentation

  

hEvent类型:HANDLE        如果在没有I / O完成例程的情况下发出重叠I / O操作(操作的lpCompletionRoutine参数为   设置为null),那么此参数应包含有效句柄   到WSAEVENT对象或为null。如果是lpCompletionRoutine参数   调用是非null然后应用程序可以自由使用它   参数必要。

因为我提供lpCompletionRoutine参数,我可以使用WSAEvent作为指向我的用户定义数据的指针。

感谢那位让我了解这一发现的评论者。