我可以重复调用WSASend()吗

Can I call WSASend() repeatedly?

本文关键字:WSASend 调用 我可以      更新时间:2023-10-16

使用IOCP时,如果我调用WSASend(),我是否必须等待通知到达,然后再对其进行另一次调用,或者我是否可以在收到任何通知之前多次调用它,例如,是否允许这样的操作:

WSASend();
// Call it again without waiting for notification of previous call
WSASend();
// Call it again without waiting for notification of previous call
WSASend();

是的,您可以在不等待完成通知的情况下发出多个I/O请求。或者,您可以通过一个调用WSASend()多个缓冲区。

无论哪种方式,或者两者都可以。每个调用的OVERLAPPED块本质上是I/O请求链表的指针,因此当I/O资源可用时,它们都可以排队并由内核和命令堆栈执行。

这也适用于WSARecv等重叠I/O。这允许内核/堆栈在用户线程代码处理先前通知的缓冲区时加载缓冲区。

注意:OVERLAPPED块和缓冲区在每次调用时必须是唯一的,并且它们的生存期必须延长到完成通知。在用户线程处理完完成通知之前,您不能让它们被RAII'd或删除掉。缓冲区和OVERLAPPED通常是一个"IOrequest"类的成员(使用"SocketContext*"类指针成员将每个IOrequest与其绑定的套接字连接起来)。

是的,您可以在一个套接字上发出多个重叠操作,而无需等待任何完成。

对于TCP套接字上的多个未完成的WSASend()调用,需要注意的一点是,您正在有效地将WSASend()调用中使用的缓冲区的资源管理移交给套接字另一端的对等方。原因是,如果你发送数据,而对等端读取数据的速度没有你发送的那么快,那么你最终会导致TCP的流控制生效。这并不能阻止你发出更多的WSASend()调用,你会注意到完成的时间越来越长。请参阅此处了解更多详细信息。