当使用 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 block 本质上是 I/O 请求链表的指针,因此当 I/O 资源可用时,它们都可以排队并由内核和通信堆栈执行。
这也适用于 WSARecv 等重叠 I/O。这允许内核/堆栈在用户线程代码处理之前通知的缓冲区时加载缓冲区。
注意:OVERLAPPED block 和缓冲区在每次调用时必须是唯一的,并且它们的生命周期必须延长到完成通知。在用户线程处理完成通知之前,您不能让它们被 RAII'd 或 delete'd 掉。缓冲区和 OVERLAPPED 通常是一个“IOrequest”类的成员(使用“SocketContext*”类指针成员将每个 IOrequest 与其绑定(bind)的套接字连接起来)。
关于c++ - 我可以重复调用 WSASend() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28673897/