有两个原因可能导致GetQueuedCompletionStatus()
失败(返回FALSE
),第一个是因为在调用时与其关联的完成端口句柄被关闭是突出的,如果 lpOverlapped
为 NULL
,就会出现这种情况。
第二个原因(也是我关心的)是 IO 操作(例如:WSARecv()
)失败。文档对此情况是这样描述的:
If *lpOverlapped is not NULL and the function dequeues a completion packet for a failed I/O operation from the completion port, the function stores information about the failed operation in the variables pointed to by lpNumberOfBytes, lpCompletionKey, and lpOverlapped. To get extended error information, call GetLastError.
我认为这对于 lpNumberOfBytes
、lpCompletionKey
和 lpOverlapped
的值不是很清楚。这些参数是否包含与我调用 WSARecv()
时提供的相同值?我认为这更有可能,因为我还怎么知道是什么 IO 操作导致了失败!
最佳答案
如果 I/O 操作失败,则 lpCompletionKey
和lpOverlapped
将是您使用所使用的 API 启动 I/O 操作时提供的值( WSASend()
、 WSARecv()
等)。这是您识别相关 I/O 操作的“每设备”数据和“每操作”数据的方法。
lpNumberOfBytes
在错误情况下可能为零,尽管我倾向于以与非错误情况相同的方式处理它,因为我在错误处理期间从不使用结果值(或缓冲区内容)。
关于c++ - 当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28768969/