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

标签 c++ sockets winapi network-programming iocp

当使用 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/

相关文章:

python - 同时使用多个双绞线套接字服务器

c++ - 阻止 `const` 成员在另一个别名下被编辑

JAVA : Handling socket disconnection

c - UDP客户端没有bind()接收不到数据

c++ - 模拟全屏

c++ - Visual C++,Windows 更新接口(interface) (IUpdate) <wuapi.h>,get_MsrcSeverity

c - 在 Wininet 中使用 SSL

c++ - 二进制搜索程序无法识别边界?

c++ - 具有 move 构造函数和赋值的类的默认复制构造函数和赋值

C++ 继承模板类和初始化列表