- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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()
立即完成,如果 lpNumberOfBytesRecvd
为 NULL
,我怎么知道读取了多少字节?!或者文档只是意味着我可以将 NULL
用于 lpNumberOfBytesRecvd
但我不必这样做?
最佳答案
当一个重叠的 WSARecv()
以 IO_PENDING
或 SUCCESS
完成时,一个完成数据包被排队到 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/
调用WSARecv()时,有没有可能不经过完成端口阶段,直接返回数据。在 WSARecv() 文档中,它针对 lpNumberOfBytesRecvd 参数说: A pointer to the nu
我正在使用 std::vector 来表示我的 per IO 数据结构中的缓冲区: struct PerIoData { WSAOVERLAPPED m_overlapped; SOC
我想要 WSARecv 的精度。 基本上,您似乎可以将函数与 WSABUF 数组一起使用。 1- 在重叠的 I/O 上下文中 WITHOUT 完成端口,假设我在具有 48 个 WSABUF 数组的数据
我目前正在开展一个项目,该项目需要在 IE 中挂接 TCP 发送和接收 API 以监控 TCP 数据。它在 IE9 和 IE10 上运行良好。但它停止在 IE11 上工作。经过一番研究,我发现IE11
我想了解 IOCP 如何与套接字一起工作。我需要了解它们是否是这样工作的: 我创建了一个完成端口,它只是一个队列,当某些操作完成时将接收通知,然后我将我的套接字与它相关联,然后我处理传入的通知。 现在
当我调用 WSARecv()(或另一个 Overlapped IO 函数)时,我可能会立即收到错误,或者当我调用 GetQueuedCompletionStatus() 时可能会收到错误出列一个完成数
我正在尝试实现一个使用 IOCompletionPort 从其客户端读取的服务器。我有一些与 this example 非常相似的东西. 如果我没理解错的话,这应该是我的设计: [主线程] 创建监听套
我正在使用 WSARecv 实现一个异步服务器。根据文档,WSARecv 可以立即返回 0。这最终仍会调用我的完成例程,我会在其中再次调用 WSARecv 以获取其余数据。如果没有更多数据可供抓取,我
我正在做一个涉及 Hook WSARecv 的项目.我知道如何 Hook 这个函数,我的意思是它就像 Hook 另一个函数一样。无论如何,困难的部分是当WSARecv用于执行重叠操作。这个想法是,当应
我有几个关于 WSARecv 的问题 问题一:我如何准确地确定我们必须分配给 WSABUF.len 的大小? 问题二:WSARecv 是否读取长度为 0 的数据? 例如。WSABUF.len = 0
我有几个关于 WSARecv 的问题 问题一:我如何准确地确定我们必须分配给 WSABUF.len 的大小? 问题二:WSARecv 是否读取长度为 0 的数据? 例如。WSABUF.len = 0
我的问题:我的 Completionport 服务器将从不同的客户端接收未知大小的数据,问题是,我不知道如何避免缓冲区溢出/如何避免我的(接收)缓冲区被数据“填满”。 现在进入问题:1) 如果我通过
希望你能帮帮我。 我正在尝试通过 TCP/IP 通过网络发送 1000 位的数据包,我希望也能够在 Cygwin 和 Windows 中使用重叠 I/O 技术。 在 Cygwin 中,我尝试使用“re
如何提高 WSARecv 的性能以尽快完成。 IT 使用重叠套接字和阻塞套接字。代码如下。 WSARecv(*socket, &Buffer, 1, &RecvCount, &Flag, NULL,
我在 Windows 上使用 IOCP。以前我使用方法 GetQueuedCompletionStatus 来轮询队列,一切都很好。但是当我决定重构逻辑以利用 WSARecv 调用完成例程时,它总是失
我需要弄清楚当 lpCompletionRoutine 为空时 WSARecv 如何使用 lpOverlapped 参数。它表示位于 lpOverlapped 的事件,对吧?但肯定不止于此。 我正在拦
我在 C++ 中挂接 WSASend 和 WSARecv,使用的方法与我用来挂接客户端的 WSASend 和 WSARecv 函数的方法相同。在客户端中,我能够从 WSASend/WSARecv 传递
documentation WSARecv() 说明了关于 lpNumberOfBytesRecvd 参数的以下内容: A pointer to the number, in bytes, of da
我在 Windows 中处理多线程 IOCP 服务器。为了避免处理许多挂起的读取,我总是在每个连接的套接字上只有一个 wsarecv 操作。简而言之,我的设计如下: 客户端连接后,wsarecv 被发
我想使用工作线程池和 IO 完成端口编写一个服务器。服务器应该在多个客户端之间处理和转发消息。 “每个客户”数据位于 ClientContext 类中。此类实例之间的数据使用工作线程进行交换。我认为这
我是一名优秀的程序员,十分优秀!