在谈论重叠 I/O 时,上下文信息意味着啥?
Posted
技术标签:
【中文标题】在谈论重叠 I/O 时,上下文信息意味着啥?【英文标题】:What does context information means when talking about Overlapped I/O?在谈论重叠 I/O 时,上下文信息意味着什么? 【发布时间】:2015-03-08 14:56:23 【问题描述】:在WSARecv()
的文档中,它说:
如果 lpCompletionRoutine 不为 NULL,则忽略 hEvent 参数 并且可以被应用程序用来将上下文信息传递给 完成例程。
“上下文信息”是什么意思?我认为这意味着我通常会为每个套接字关联一个数据结构,该数据结构可以包含套接字句柄和接收缓冲区等成员。因此,当我调用WSARecv()
时,我将向它传递一个指向此数据结构实例的指针,当我收到接收操作已完成的通知时,我将获得我之前传递的指针,因此我会知道哪个socket已经发起接收操作,接收缓冲区是什么等
我的理解正确吗?
【问题讨论】:
基本正确。上下文是应用程序定义的一条信息(通常是指向自定义结构的指针),回调可以使用它来执行其操作。您会在整个 Windows API 中找到此方案,例如对CreateWindow 的调用中的lpParam
参数。这也可以被应用程序用来向接收者传输附加信息。
【参考方案1】:
“上下文信息”是什么意思?
用户定义的数据。当 IOCP 忽略该字段时,您可以使用它将您想要的任何自定义(上下文相关)数据传递给完成例程。
【讨论】:
但它不是类型安全的。更好的选择是在OVERLAPPED
结构之后添加字段,因为您会返回相同的 OVERLAPPED*
。
而且你不认为这更不安全吗? IOCP 操作仅将OVERLAPPED*
作为输入,并返回OVERLAPPED*
作为输出。您仍然需要进行类型转换才能访问您添加的额外字段。无论您是通过hEvent
传递一个指针,还是通过OVERLAPED*
传递一个指针,这两种方式都是一样的——指针按原样传递给完成例程,您可以根据需要使用它。扩展OVERLAPPED
是常用的方法,但不是唯一的方法。
或者使用OVERLAPPED*
作为键(例如std::map
)
@Ben:这两个选项都没有增加类型安全性。无论您选择哪一个,发送者和消费者都必须同意相同的类型。编译器无法帮助您。即使您使用 OVERLAPPED*
作为关联容器的键,双方也必须就此达成一致。
@IInspectable:发件人(远程对等方)对此没有任何影响。是的,WSARecv
调用者和回调必须一致,但是回调在调用者的控制之下,所以这不是问题。以上是关于在谈论重叠 I/O 时,上下文信息意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章
2018-2019-1 20165228 《信息安全系统设计基础》第八周学习总结
在 Apache Spark 的上下文中,内存数据存储意味着啥?