Winsock IOCP文档解释问题-缓冲区所有权模糊

Winsock IOCP文档解释问题-缓冲区所有权模糊,winsock,iocp,Winsock,Iocp,因为我不是以英语为母语的人,我可能会错过一些东西,所以这里可能有人比我更了解 摘自MSDN上的客户声明: lpBuffers[in] 指向WSABUF数组的指针 结构。每个WSABUF结构 包含指向缓冲区的指针和 缓冲区的长度(以字节为单位)。暂时 Winsock应用程序,一旦WSASend 函数被调用,系统拥有 这些缓冲区和应用程序可能 无法访问它们。此数组必须 在测试期间保持有效 发送操作 好的,你能看到粗体字吗?那是不清楚的地方 我可以为这一行想出两种翻译(可能是别的,你可以说): Tra

因为我不是以英语为母语的人,我可能会错过一些东西,所以这里可能有人比我更了解

摘自MSDN上的客户声明:

lpBuffers[in]

指向WSABUF数组的指针 结构。每个WSABUF结构 包含指向缓冲区的指针和 缓冲区的长度(以字节为单位)。暂时 Winsock应用程序,一旦WSASend 函数被调用,系统拥有 这些缓冲区和应用程序可能 无法访问它们。此数组必须 在测试期间保持有效 发送操作

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

我可以为这一行想出两种翻译(可能是别的,你可以说):
Translation 1-“buffers”是指在调用该函数时传递给它的重叠结构。只有在收到有关该对象的完成通知时,我才能再次使用该对象。
翻译2-“缓冲区”指的是实际的缓冲区,即包含我正在发送的数据的缓冲区。如果WSABUF对象指向一个缓冲区,则在操作完成之前,我无法触摸该缓冲区

有人能说出这句话的正确解释吗

及。。。。。如果答案是第二个-您将如何解决它?
因为对我来说,这意味着对于我发送的每一个数据/缓冲区,我必须在发送方保留一份副本——因此在高流量应用程序上有许多“待定”缓冲区(大小不同),这确实会损害“可伸缩性”

声明1:
除了上面的段落(“和…”),我认为IOCP会将要发送的数据复制到它自己的缓冲区并从那里发送,除非设置为零

声明2:

我在函数体中使用堆栈分配的缓冲区(你知道,类似于
char cBuff[1024];
),如果对主要问题的转换是第二个选项(即缓冲区必须保持原样,直到发送完成),那么……这真的会把事情搞得一团糟!你能想出解决方法吗?(我知道,我是用上面的其他话问的)。

答案是,在操作完成之前,重叠的结构和数据缓冲区本身无法重用或释放

这是因为操作是异步完成的,所以即使数据最终被复制到TCP/IP堆栈中操作系统拥有的缓冲区中,这些缓冲区可能在将来某个时候才会发生,并且您会收到写入完成的通知。请注意,写入完成可能会延迟惊人的时间如果您在没有显式流控制的情况下发送,并且依赖TCP堆栈为您执行流控制(请参见此处:)

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

在我的IOCP服务器框架(您可以免费获得)中,我使用动态分配的缓冲区,其中包括重叠结构和引用计数在完成并释放引用时发生。这还意味着您可以选择在操作后继续使用缓冲区,并且清理仍然很简单


另请参见此处:

非常感谢您的回复,Len,从您那里获得回复对我来说意义重大!我了解整体思路,但无法深入到具体问题,如所述。标记为答案,因为您的答案是当天结束时的答案。再次感谢您!