【问题标题】:WSABUF structure used in several wsasend几个wsasend中用到的WSABUF结构
【发布时间】:2014-03-28 21:38:11
【问题描述】:

我知道我应该为每个 Wsasend/recv 操作提供唯一的 OVERLAPPED 结构或缓冲区,并在 GQCS 通知之前保持它们有效。但是我需要对 WSABUF 结构进行一点说明,它是否也应该是唯一的,或者我可以像这样重用它:

....
WSABUF bufftoSend;

bufftoSend.buf=buffer1;
bufftoSend.len=40;
WSASend(Socket, &bufftoSend, 1,..., NULL);

bufftoSend.buf=buffer2;
bufftoSend.len=20;
WSASend(Socket, &bufftoSend, 1,..., NULL);

bufftoSend.buf=buffer3;
bufftoSend.len=30;
WSASend(Socket, &bufftoSend, 1,..., NULL);
....

?

感谢您的帮助。

【问题讨论】:

    标签: c++ iocp


    【解决方案1】:

    如果此函数以重叠方式完成,则 Winsock 服务提供者有责任在此调用返回之前捕获 WSABUF 结构。这使应用程序能够构建由 lpBuffers 参数指向的基于堆栈的 WSABUF 数组。

    【讨论】:

      【解决方案2】:

      来自 WSASend() 的 MSDN 文档,here

      lpBuffers [in]

      指向 WSABUF 结构数组的指针。每个 WSABUF 结构包含一个指向缓冲区的指针和长度(以字节为单位) 缓冲区。对于 Winsock 应用程序,一旦 WSASend 函数 调用,系统拥有这些缓冲区,应用程序可能不 访问它们。 此数组必须在发送期间保持有效 操作

      我将它与OVERLAPPED 结构一起作为缓冲区本身的一部分...

      但是,稍后在文档中还说:

      如果这个功能是以重叠的方式完成的,那就是 Winsock 服务提供商捕获 WSABUF 的责任 从此调用返回之前的结构。这使应用程序 构建 lpBuffers 指向的基于堆栈的 WSABUF 数组 参数。

      因此很可能 WSABUF 结构本身可以在调用后立即被销毁/重用,并且第一段仅涉及 WSABUF 结构的内容;即缓冲区本身。

      【讨论】:

      • 我应该停止在半夜提问,因为第二天早上我的问题似乎很愚蠢:)。在我的问题中重用 WSABUF 结构会导致服务器崩溃。我也应该更了解地阅读msdn...
      • MSDN 说“如果此功能以重叠方式完成,则 Winsock 服务提供商有责任在此调用返回之前捕获 WSABUF 结构。”所以在我看来,上述情况应该是有效的。
      • 我同意,你是对的,我错了。上面的引用显然是关于数组的内容而不是数组本身......取消删除你的答案!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2016-04-12
      • 2018-06-02
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多