ERROR_NO_MORE_ITEMS 具有命名管道和 IO 完成端口
ERROR_NO_MORE_ITEMS with named pipe and IO completion port
我在 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
只有在某些东西到达管道时才会 return,但情况并非总是如此。有时,在完成数据包出队后,我可以看到 bytes_available == 0
、ret_code == 0
和 overlapped_struct.Internal == 256
(我假设这意味着 ERROR_NO_MORE_ITEMS)。
关于为什么会发生任何想法?
我明白了。完成数据包在管道上的 any 操作之后排队。意思是GetQueuedCompletionStatus
客户端连接后,会return进行读写操作。
我的情况是怎样的:
- 我从外部程序接收数据。完成数据包已排队。
- 我读了一个管道。另一个完成数据包已排队。
- 在随后的读取过程中,如果管道中没有新数据,
ReadFile
returned 0 和 overlapped_struct.Internal
指示 ERROR_NO_MORE_ITEMS,这是完全正确的:管道中没有新数据。
我在 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
只有在某些东西到达管道时才会 return,但情况并非总是如此。有时,在完成数据包出队后,我可以看到 bytes_available == 0
、ret_code == 0
和 overlapped_struct.Internal == 256
(我假设这意味着 ERROR_NO_MORE_ITEMS)。
关于为什么会发生任何想法?
我明白了。完成数据包在管道上的 any 操作之后排队。意思是GetQueuedCompletionStatus
客户端连接后,会return进行读写操作。
我的情况是怎样的:
- 我从外部程序接收数据。完成数据包已排队。
- 我读了一个管道。另一个完成数据包已排队。
- 在随后的读取过程中,如果管道中没有新数据,
ReadFile
returned 0 和overlapped_struct.Internal
指示 ERROR_NO_MORE_ITEMS,这是完全正确的:管道中没有新数据。