【问题标题】:ERROR_NO_MORE_ITEMS with named pipe and IO completion port带有命名管道和 IO 完成端口的 ERROR_NO_MORE_ITEMS
【发布时间】:2016-06-01 20:47:32
【问题描述】:

我有一个用 python+ctypes 实现的简单命名管道服务器:

pipe = windll.kernel32.CreateNamedPipeA('\\\\.\\pipe\\pipe_name', PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 1, 0, 0, 0, None)

overlapped_struct = OVERLAPPED()

windll.kernel32.ConnectNamedPipe(pipe, byref(overlapped_struct))

iocp = windll.kernel32.CreateIoCompletionPort(pipe, None, WPARAM(707070707), 0)

while True:
    bytes_transferred = DWORD()
    completion_key = WPARAM()
    overlapped_struct_ptr = POINTER(OVERLAPPED)()
    windll.kernel32.GetQueuedCompletionStatus(iocp, byref(bytes_transferred), byref(completion_key), byref(overlapped_struct_ptr), INFINITE)

    bytes_available = DWORD()
    windll.kernel32.PeekNamedPipe(pipe, None, 0, None, byref(bytes_available))

    buf = create_string_buffer(bytes_available.value)
    ret_code = windll.kernel32.ReadFile(pipe, byref(buf), bytes_available.value, None, overlapped_struct_ptr)

它从外部程序接收数据。我希望GetQueuedCompletionStatus 只会在有东西到达管道时返回,但情况并非总是如此。有时,在完成数据包出队后,我可以看到 bytes_available == 0ret_code == 0overlapped_struct.Internal == 256(我认为这意味着 ERROR_NO_MORE_ITEMS)。

关于为什么会发生的任何想法?

【问题讨论】:

  • 您使用的是 64 位 Python 吗?尝试为所有函数指定 .argtypes 以确保项目正确编组为 C。

标签: python ctypes named-pipes io-completion-ports


【解决方案1】:

我想通了。在管道上进行任何操作后,完成数据包将排队。表示GetQueuedCompletionStatus会在客户端连接、读写操作后返回。

我的情况发生了什么:

  1. 我从外部程序接收到数据。完成数据包已排队。
  2. 我读了一个管道。另一个完成数据包已排队。
  3. 在后续读取过程中,如果管道中没有新数据,ReadFile 返回 0,overlapped_struct.Internal 指示 ERROR_NO_MORE_ITEMS,完全正确:管道中没有新数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 2014-08-15
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2018-05-22
    相关资源
    最近更新 更多