我知道我应该为每个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);
....
感谢您的帮助。
答案 0 :(得分:2)
如果以重叠的方式完成此功能,则Winsock服务提供商有责任在从此调用返回之前捕获WSABUF结构。这使应用程序能够构建lpBuffers参数指向的基于堆栈的WSABUF数组。
答案 1 :(得分:1)
来自WSASend()的MSDN文档,here。
lpBuffers [in]
指向WSABUF结构数组的指针。每个WSABUF 结构包含一个指向缓冲区的指针和长度(以字节为单位) 缓冲区。对于Winsock应用程序,一旦WSASend函数是 在调用时,系统拥有这些缓冲区,而应用程序可能没有 访问他们。 此数组必须在发送期间保持有效 操作强>
我将它作为缓冲区本身的一部分,以及OVERLAPPED
结构......
然而,稍后在文档中它也说:
如果此功能以重叠方式完成,则为 Winsock服务提供商有责任捕获WSABUF 从此调用返回之前的结构。这使应用程序 构建lpBuffers指向的基于堆栈的WSABUF数组 参数。
因此,WSABUF结构本身可能会在调用后立即销毁/重用,第一段只能引用WSABUF结构的内容;即缓冲区本身。