Winsock 异步多个 WSASend 与一个缓冲区
Winsock asynchronous multiple WSASend with one single buffer
MSDN 声明 "For a Winsock application, once the WSASend function is called, the system owns these buffers and the application may not access them."
在服务器应用程序中,这是否意味着如果我想向多个客户端广播一条消息,我不能使用保存数据的单个缓冲区并使用该缓冲区在每个套接字上调用 WSASend?
我没有文档参考来确认这是可能的,但我已经这样做了很多年而且还没有失败,YMMV。
只要每次发送具有唯一的 OVERLAPPED
结构,您就可以使用单个数据缓冲区。由于 WSABUF
数组被 WSASend()
调用复制并且可以基于堆栈,我希望您可以有一个 WSABUF
数组,但我从来没有这样做过。
您需要做什么来确保保留单个数据缓冲区 "alive" 直到所有数据写入完成。
如果您倾向于构建扩展 OVERLAPPED
使其包含数据缓冲区,那么像这样的广播会使设计复杂化,但它确实避免了内存分配和内存复制。
注意:我有一个系统,其中我的扩展 OVERLAPPED
结构包括数据缓冲区和 operation code
,这些是引用计数和池,用于发送和接收。当广播一个缓冲区时,我每次发送都使用一个单独的 "buffer handle",这个句柄只是一个以不同方式扩展的 OVERLAPPED
结构,它包含对原始数据缓冲区的引用并有自己的引用计数。当所有广播发送完成后,所有缓冲区句柄都将被释放,而这些句柄又将释放底层数据缓冲区以供重用。
MSDN 声明 "For a Winsock application, once the WSASend function is called, the system owns these buffers and the application may not access them."
在服务器应用程序中,这是否意味着如果我想向多个客户端广播一条消息,我不能使用保存数据的单个缓冲区并使用该缓冲区在每个套接字上调用 WSASend?
我没有文档参考来确认这是可能的,但我已经这样做了很多年而且还没有失败,YMMV。
只要每次发送具有唯一的 OVERLAPPED
结构,您就可以使用单个数据缓冲区。由于 WSABUF
数组被 WSASend()
调用复制并且可以基于堆栈,我希望您可以有一个 WSABUF
数组,但我从来没有这样做过。
您需要做什么来确保保留单个数据缓冲区 "alive" 直到所有数据写入完成。
如果您倾向于构建扩展 OVERLAPPED
使其包含数据缓冲区,那么像这样的广播会使设计复杂化,但它确实避免了内存分配和内存复制。
注意:我有一个系统,其中我的扩展 OVERLAPPED
结构包括数据缓冲区和 operation code
,这些是引用计数和池,用于发送和接收。当广播一个缓冲区时,我每次发送都使用一个单独的 "buffer handle",这个句柄只是一个以不同方式扩展的 OVERLAPPED
结构,它包含对原始数据缓冲区的引用并有自己的引用计数。当所有广播发送完成后,所有缓冲区句柄都将被释放,而这些句柄又将释放底层数据缓冲区以供重用。