gpt4 book ai didi

winsock - 一道IOCP文档解释题——buffer ownership ambiguity

转载 作者:行者123 更新时间:2023-12-04 03:16:01 25 4
gpt4 key购买 nike

由于我的母语不是英语,所以我可能会遗漏一些东西,所以也许这里有人比我更了解。

取自WSASend MSDN 上的说明:

lpBuffers [in]

A pointer to an array of WSABUF structures. Each WSABUF structure contains a pointer to a buffer and the length, in bytes, of the buffer. For a Winsock application, once the WSASend function is called, the system owns these buffers and the application may not access them. This array must remain valid for the duration of the send operation.

好的,你能看到粗体字吗?那是不清楚的地方!

我能想到这行的两种翻译(可能是别的,随便你怎么说):
翻译 1 - “缓冲区”指的是 OVERLAPPED 结构,我在调用它时传递了这个函数。只有在收到关于它的完成通知时,我才可以再次使用该对象。
翻译 2 - “缓冲区”指的是实际缓冲区,那些包含我正在发送的数据的缓冲区。如果 WSABUF 对象指向一个缓冲区,那么在操作完成之前我不能触及这个缓冲区。

谁能告诉我对那句话的正确解释是什么?

还有.....如果答案是第二个——你会怎么解决?
因为对我来说,这意味着对于我发送的每个数据/缓冲区,我必须在发送方保留它的副本 - 因此在高流量应用程序上有许多“待定”缓冲区(不同大小),这真的伤害“可扩展性”。

陈述1:
除了上面的段落(“和......”)之外,我认为 IOCP 将要发送的数据复制到它自己的缓冲区并从那里发送,除非你设置 SO_SNDBUF归零。

声明2:
我在函数体中使用堆栈分配的缓冲区(你知道,类似于 char cBuff[1024]; - 如果对主要问题的翻译是第二个选项(即缓冲区必须保持原样,直到发送完成),然后...这真的把事情搞砸了!你能想办法解决它吗?(我知道,我在上面换句话说问过)。

最佳答案

答案是重叠结构和数据缓冲区本身在操作完成之前不能被重用或释放。

这是因为该操作是异步完成的,因此即使数据最终被复制到 TCP/IP 堆栈中操作系统拥有的缓冲区中,这种情况也可能要等到将来某个时间才会发生,并且您会收到写入通知完成发生。请注意,如果您在没有明确流量控制的情况下发送并依赖 TCP 堆栈为您进行流量控制(请参见此处:some OVERLAPS using WSASend not returning in a timely manner using GetQueuedCompletionStatus?)...

您不能使用堆栈分配的缓冲区,除非您在重叠结构中放置一个事件并阻塞它直到异步操作完成;这样做没有多大意义,因为您会增加普通阻塞调用的复杂性,并且通过发出异步调用然后等待它不会获得很多好处。

在我的 IOCP 服务器框架(您可以从 here 免费获得)中,我使用动态分配的缓冲区,其中包括 OVERLAPPED 结构并且是引用计数的。这意味着清理(在我的例子中它们被返回到池中以供重用)发生在完成发生并且引用被释放时。这也意味着您可以选择在操作后继续使用缓冲区,并且清理仍然很简单。

另见此处:I/O Completion Port, How to free Per Socket Context and Per I/O Context?

关于winsock - 一道IOCP文档解释题——buffer ownership ambiguity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028376/

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