MSDN声明“对于Winsock应用程序,一旦调用了WSASend函数,系统就拥有这些缓冲区,应用程序可能无法访问它们。”
在服务器应用程序中,这是否意味着如果我想向多个客户端广播消息,我不能使用保存数据的单个缓冲区并使用该缓冲区在每个套接字上调用WSASend?
答案 0 :(得分:5)
我没有文件参考证实这是可能的,但我已经做了多年而且还没有失败,YMMV。
只要每次发送都有一个唯一的OVERLAPPED
结构,就可以使用单个数据缓冲区。由于WSABUF
数组被WSASend()
调用复制并且可以基于堆栈,我希望你可以有一个WSABUF
数组,但我从来没有这样做过。
在完成所有数据写入之前,您需要确保将单个数据缓冲区保持“活动”状态。
如果您倾向于构建扩展的OVERLAPPED
以便它包含数据缓冲区,那么像这样的广播会使设计复杂化,但它确实避免了内存分配和内存复制。
注意:我有一个系统,我的扩展OVERLAPPED
结构包括数据缓冲区和operation code
,这些是引用计数和池,用于发送和recvs。在广播缓冲区时,每次发送使用一个单独的“缓冲区句柄”,这个句柄只是以不同方式扩展的OVERLAPPED
结构,它保存对原始数据缓冲区的引用并具有自己的引用计数。当所有广播发送完成后,所有缓冲区句柄都将被释放,反过来,这些句柄将释放基础数据缓冲区以供重用。