gpt4 book ai didi

c++ - WSARecv() 和 lpNumberOfBytesRecvd 参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:23 25 4
gpt4 key购买 nike

documentation WSARecv() 说明了关于 lpNumberOfBytesRecvd 参数的以下内容:

A pointer to the number, in bytes, of data received by this call if the receive operation completes immediately.

Use NULL for this parameter if the lpOverlapped parameter is not NULL to avoid potentially erroneous results. This parameter can be NULL only if the lpOverlapped parameter is not NULL.

我正在使用IOCP,所以lpOverlapped不能为NULL,同时WSARecv()可以立即完成。因此,如果 WSARecv() 立即完成,如果 lpNumberOfBytesRecvdNULL,我怎么知道读取了多少字节?!或者文档只是意味着我可以将 NULL 用于 lpNumberOfBytesRecvd 但我不必这样做?

最佳答案

当一个重叠的 WSARecv()IO_PENDINGSUCCESS 完成时,一个完成数据包被排队到 IOCP,参见 this MSDN article for details .

对于 Vista 或更高版本,您可以通过调用 SetFileCompletionNotificationModes() 来更改此设置。对于套接字并传递 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS(请注意,您可以在文档中阅读 File as Socket,文件句柄的概念直接转换为套接字)。

如果您确实启用完成端口跳过,那么当 WSARecv() 立即返回数据时(即 SUCCESS 返回而不是 IO_PENDING return) 那么你必须在 WSARecv() 调用点直接处理它,因为你不会得到一个完成数据包。

请注意,启用“跳过完成端口”处理对于减少上下文切换非常有用,但是您现在需要以两种方式处理完成,或者直接(当WSARecv() 返回SUCCESS 时) ) 或在您的正常完成处理程序中(当 WSARecv() 返回错误且错误为 IO_PENDING 时)。而之前两个结果都生成了一个完成数据包。

那么,在回答你的问题时......

除非您启用了“跳过完成端口”处理,否则没有理由在 WSARecv() 的调用站点使用 lpNumberOfBytesRecvd 的值,因为即使调用返回 SUCCESS 因为数据已经可用,你仍然会得到一个排队到 IOCP 的完成,你必须以通常的方式处理它。

当且仅当您已启用“跳过完成端口”处理时,您才应处理调用 WSARecv() 返回的数据,该调用返回 SUCCESS你得到了 SUCCESS 结果。

关于c++ - WSARecv() 和 lpNumberOfBytesRecvd 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28756844/

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