gpt4 book ai didi

asynchronous - Winsock 异步多个 WSASend 与一个缓冲区

转载 作者:行者123 更新时间:2023-12-04 05:11:07 24 4
gpt4 key购买 nike

MSDN 声明“对于 Winsock 应用程序,一旦调用 WSASend 函数,系统就拥有这些缓冲区,应用程序可能无法访问它们。”

在服务器应用程序中,这是否意味着如果我想向多个客户端广播一条消息,我不能使用保存数据的单个缓冲区并使用该缓冲区在每个套接字上调用 WSASend?

最佳答案

我没有文档引用来证实这是可能的,但我已经这样做了很多年而且还没有失败,YMMV。

只要每次发送都有唯一的 OVERLAPPED 结构,就可以使用单个数据缓冲区。由于 WSABUF 数组被 WSASend() 调用复制并且可以基于堆栈,我希望您可以有一个 WSABUF 数组,但我从来没有这样做过。

您需要做什么来确保在所有数据写入完成之前保持单个数据缓冲区“有效”。

如果您倾向于构造扩展的 OVERLAPPED 使其包含数据缓冲区,那么像这样的广播会使设计复杂化,但它确实避免了内存分配和内存复制。

注意:我有一个系统,其中我的扩展OVERLAPPED 结构包括数据缓冲区和操作代码,这些是引用计数和池,用于发送和接收。当广播一个缓冲区时,我每次发送都使用一个单独的“缓冲区句柄”,这个句柄只是一个以不同方式扩展的 OVERLAPPED 结构,它包含对原始数据缓冲区的引用并有自己的引用计数.当所有广播发送完成后,所有缓冲区句柄都将被释放,而这些句柄又将释放底层数据缓冲区以供重用。

关于asynchronous - Winsock 异步多个 WSASend 与一个缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29052493/

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