【发布时间】:2021-09-26 00:31:27
【问题描述】:
您能否告诉我,当完成端口队列中出现就绪任务,然后使用 GetQueuedCompletionStatus 函数检索它时,您如何知道该就绪任务是用于读取还是写入?
【问题讨论】:
-
您可以使用每个操作的
OVERLAPPED结构来区分它们。 -
你会从数据包中得到你传递给 I/O 的指针(如果是 win32 api,这是
POVERLAPPED)。基于此,您可以知道您在这个地方保存的所有内容 -
@RbMm,我不知道如何初始化结构 (WSA)OVERLAPPED 的成员,如果每个成员都写了 - 保留供内部使用。
-
@Optimus1 - 但
OVERLAPPED可以是更大结构的一部分,这已经是 - 您自己的结构,您可以在其中存储 I/O 操作类型(读取、写入等)、指向包含您执行 I/O 的文件句柄的对象,指向内存缓冲区的指针等。如果使用本机 api - 这里更容易和清晰 - 您只需将指针(您自己的)传递给 I/O 请求,它保存在内核中(在 IRP 内)并在 I/O 完成时返回给您。 win32层将this指针与指向iosb的指针联合(称为重叠) -
@Optimus1 - 那又怎样?您在较大的结构中传递指向
OVERLAPPED的指针并将其取回。你可以通过static_cast(如果你继承重叠的形式)或CONTAINING_RECORD(如果你的结构有这个作为成员)来获得你的结构的指针。事实上我所说的 - 和雷米的回答一样
标签: c++ c winapi winsock winsock2