gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:31:11 26 4
gpt4 key购买 nike

我正在 UDP 服务器上工作,并尝试使用重叠 IO。我一直在尝试使用 MSDN 示例和文档进行研究,但尚未找到该函数的 lpCompletionRoutine 参数的使用。

我注意到您将 PWSAOVERLAPPED 传递给 WSARecvFrom,并且它包含一个 LPVOID Pointer 成员。我是否可以创建自己的用户数据结构,其中包含对缓冲区的引用,并将其作为指针传递到 PWSAOVERLAPPED 的此 Pointer 成员中?

我认为这有点多余,尽管接收到的字节在两个地方可用:

WSARecvFromlpNumberOfBytesRecvd 参数和 lpCompletionRoutinecbTransferred 参数。

我当前完成例程的示例:

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
);

最佳答案

来自WSAOVERLAPPED结构documentation :

hEvent Type: HANDLE If an overlapped I/O operation is issued without an I/O completion routine (the operation's lpCompletionRoutine parameter is set to null), then this parameter should either contain a valid handle to a WSAEVENT object or be null. If the lpCompletionRoutine parameter of the call is non-null then applications are free to use this parameter as necessary.

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

感谢评论者引导我得出这一发现。

关于c - 如何将缓冲区放入 CompletionROUTINE 作为 WSARecvFrom 调用的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50736594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com