我想使用命名管道(用于 IPC)实现服务器/客户端。我正在使用异步(重叠)连接和 I/O 完成端口(我搜索了很多,似乎这是最有效的方法) .
首先是代码:
服务器: http: //pastebin.com/XxeXdunC
和客户: http: //pastebin.com/fbCH2By8
问题出在服务器上(我可以改进客户端,但当服务器工作时我会这样做)。
我使用这样的 I/O 完成端口:基本上,我运行一个调用 ReadFile() 的线程。如果它返回 TRUE,我得到所有数据,如果它返回 FALSE,并且错误是 ERROR_IO_PENDING,我等待 GetQueuedCompletionStatus()。
奇怪的是,即使我读取了所有数据,最后一次 ReadFile() 调用失败并且错误是 ERROR_IO_PENDING
我调用 ReadFile() 的线程是服务器代码的第 64 行的开始。
客户端发送 24 个字节(字符串“salut, c'est le client !”)并且 ReadFile() 缓冲区的长度为 5 个字节(检查我的服务器如何处理大于 Readfile() 缓冲区的数据)
输出是:
waiting for client...
WaitForMultipleObjects : 0
client connected (1)
ReadFile 1 msg (5 -> 05) : salut
ReadFile 2 msg (5 -> 10) : salut, c'e
ReadFile 2 msg (5 -> 15) : salut, c'est le
ReadFile 2 msg (5 -> 20) : salut, c'est le clie
ReadFile 2 msg (4 -> 24) : salut, c'est le client !
ReadFile2: ERROR_IO_PENDING
GQCIOS 0 255 003D3A18
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 4 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
我不明白的是,即使我读取了所有数据,ReadFile() 仍然返回一个挂起的操作(它是最后一个“msg”输出之后的“ReadFile2:ERROR_IO_PENDING”错误消息)
我的循环错了吗?我是否滥用 ReadFile() / GetQueuedCompletionStatus() ?
谢谢你