在谈论重叠 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 《信息安全系统设计基础》第八周学习总结

上下文在Android中意味着啥[重复]

,计算机系统漫游

在 Apache Spark 的上下文中,内存数据存储意味着啥?

I/O 完成端口,如何释放每个套接字上下文和每个 I/O 上下文?

上下文嵌入和词嵌入有啥区别