我可以重复调用 WSASend() 吗?

Can I call WSASend() repeatedly?

使用 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 时,它们都可以由内核和通信 stack/s 排队并执行资源可用。

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

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

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

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