Winsock使用一个缓冲区异步多个WSASend

Meg*_*ron 3 buffer asynchronous winsock send iocp

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

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

Len*_*ate 5

我没有文件参考证实这是可能的,但我已经做了多年,它还没有失败,YMMV.

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

您需要确保在所有数据写入完成之前保持单个数据缓冲区"活动".

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

注意:我有一个系统,我的扩展OVERLAPPED结构包括数据缓冲区operation code,这些是引用计数和池,用于发送和recvs.在广播缓冲区时,每个发送使用一个单独的"缓冲区句柄",这个句柄只是一个OVERLAPPED以不同方式扩展的结构,它保存对原始数据缓冲区的引用并具有自己的引用计数.当所有广播发送都已完成时,所有缓冲区句柄都将被释放,反过来,这些句柄将释放底层数据缓冲区以供重用.