我可以重复调用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资源可用时,它们都可以排队并由内核和命令堆栈执行。
这也适用于WSARecv等重叠I/O。这允许内核/堆栈在用户线程代码处理先前通知的缓冲区时加载缓冲区。
注意:OVERLAPPED块和缓冲区在每次调用时必须是唯一的,并且它们的生存期必须延长到完成通知。在用户线程处理完完成通知之前,您不能让它们被RAII'd或删除掉。缓冲区和OVERLAPPED通常是一个"IOrequest"类的成员(使用"SocketContext*"类指针成员将每个IOrequest与其绑定的套接字连接起来)。
是的,您可以在一个套接字上发出多个重叠操作,而无需等待任何完成。
对于TCP套接字上的多个未完成的WSASend()
调用,需要注意的一点是,您正在有效地将WSASend()
调用中使用的缓冲区的资源管理移交给套接字另一端的对等方。原因是,如果你发送数据,而对等端读取数据的速度没有你发送的那么快,那么你最终会导致TCP的流控制生效。这并不能阻止你发出更多的WSASend()
调用,你会注意到完成的时间越来越长。请参阅此处了解更多详细信息。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 在这种情况下,我应该为每个WSASend调用传递唯一的重叠结构吗?
- 在使用IOCP时,从两个线程安全地调用WSASend()和WSARecv()
- 我可以重复调用WSASend()吗
- 在完成端口调用WSASend()
- 为什么WSASend返回0,但仍然调用完成例程
- 从未调用过WSASend完成例程