由于我不是以英语为母语的人,我可能会遗漏一些东西,所以也许这里有人比我更了解。
取自WSASend在 MSDN 的文档:
lpBuffers [输入]
指向 WSABUF 结构数组的指针。每个 WSABUF 结构都包含一个指向缓冲区的指针和缓冲区的长度(以字节为单位)。对于 Winsock 应用程序,一旦调用 WSASend 函数,系统就拥有这些缓冲区,应用程序可能无法访问它们。该数组必须在发送操作期间保持有效。
好的,你能看到粗体字吗?那是不清楚的地方!
我可以想到这行的两种翻译(可能是别的东西,你可以命名它):
翻译 1 - “缓冲区”指的是我在调用此函数时传递的 OVERLAPPED 结构。只有在收到有关它的完成通知时,我才能再次重用该对象。
翻译 2 - “缓冲区”指的是实际的缓冲区,即那些包含我正在发送的数据的缓冲区。如果 WSABUF 对象指向一个缓冲区,那么在操作完成之前我不能触摸这个缓冲区。
谁能告诉那条线的正确解释是什么?
而且.....如果答案是第二个-您将如何解决?
因为对我来说,这意味着对于我发送的每个数据/缓冲区,我必须在发送方保留一份副本 - 因此在高流量应用程序上有许多“待处理”缓冲区(不同大小),这真的会伤害“可扩展性”。
声明 1:
除了上述段落(“And....”)之外,我认为 IOCP 会将要发送的数据复制到它自己的缓冲区并从那里发送,除非您将SO_SNDBUF设置为零。
声明 2:
我使用堆栈分配的缓冲区(你知道,类似于char cBuff[1024];
函数体的内容 - 如果主要问题的转换是第二个选项(即缓冲区必须保持原样,直到发送完成),那么......这真的把事情搞砸了!你能想出办法解决它吗?(我知道,我在上面换句话说)。