WSABUF结构在几个wsasend中使用

时间:2014-03-28 21:38:11

标签: c++ iocp

我知道我应该为每个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);
....

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

  

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

答案 1 :(得分:1)

来自WSASend()的MSDN文档,here

  

lpBuffers [in]

     
    

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

  

我将它作为缓冲区本身的一部分,以及OVERLAPPED结构......

然而,稍后在文档中它也说:

  

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

因此,WSABUF结构本身可能会在调用后立即销毁/重用,第一段只能引用WSABUF结构的内容;即缓冲区本身。