【发布时间】:2015-05-17 03:08:42
【问题描述】:
MSDN 声明“对于 Winsock 应用程序,一旦调用 WSASend 函数,系统就拥有这些缓冲区,应用程序可能无法访问它们。”
在服务器应用程序中,这是否意味着如果我想向多个客户端广播一条消息,我不能使用单个缓冲区来保存数据并使用该缓冲区在每个套接字上调用 WSASend?
【问题讨论】:
-
@Remy:我认为不是重复的;这个问题专门关于使用单个只读缓冲区进行多个相同的写入操作,而另一个问题中的 OP 想要解除分配或重用(即写入)缓冲区。假设对多个相同的写入使用只读缓冲区可能是一种特殊情况并非没有道理(尽管我怀疑答案不是)。
-
@HarryJohnston:这个 OP 的问题中没有任何内容表明正在发送的缓冲区是只读的。但应该非常清楚和明显的是,如果多个
WSASend()操作同时从同一个缓冲区读取,那么在 all之前不得以任何原因(释放、覆盖等)触及该缓冲区> 待处理的WSASend()操作已完成,就像文档(和其他答案)所建议的那样。重叠的 I/O,无论是用于套接字还是文件或其他什么,都不会将传出数据复制到内部缓冲区,而是从原始缓冲区读取,直到 I/O 完成。 -
@RemyLebeau:我相信问题是多个 WSASend() 操作是否可以同时从同一个缓冲区读取。在同一个缓冲区上再次调用 WSASend() 是否算作“访问”该缓冲区?
-
@HarryJohnston:这就是我的意思。对我来说,“访问”的东西听起来有点模棱两可。
标签: asynchronous buffer winsock send iocp