错误有命名管道和IO完成p的多个项目

2024-05-19 18:41:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用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 == 0和{}(我假设这意味着错误没有更多的项目)。在

你知道为什么会这样吗?在


Tags: nonebytes管道structavailablepipeptriocp
1条回答
网友
1楼 · 发布于 2024-05-19 18:41:56

我想出来了。完成数据包在管道上的任何操作之后排队。这意味着GetQueuedCompletionStatus将在客户端连接、写入和读取操作之后返回。在

在我的情况下发生了什么:

  1. 我收到了外部程序的数据。完成数据包已排队。在
  2. 我看烟斗。另一个完成数据包已排队。在
  3. 在随后的读取过程中,如果管道中没有新的数据,ReadFile返回0,overlapped_struct.Internal表示错误,没有更多的项目,这是完全正确的:管道中没有新数据。在

相关问题 更多 >