c++ - 当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是什么?

标签 c++ sockets iocp

有两个原因可能导致GetQueuedCompletionStatus()失败(返回FALSE),第一个是因为在调用时与其关联的完成端口句柄被关闭是突出的,如果 lpOverlappedNULL,就会出现这种情况。

第二个原因(也是我关心的)是 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.

我认为这对于 lpNumberOfByteslpCompletionKeylpOverlapped 的值不是很清楚。这些参数是否包含与我调用 WSARecv() 时提供的相同值?我认为这更有可能,因为我还怎么知道是什么 IO 操作导致了失败!

最佳答案

如果 I/O 操作失败,则 lpCompletionKeylpOverlapped将是您使用所使用的 API 启动 I/O 操作时提供的值( WSASend()WSARecv() 等)。这是您识别相关 I/O 操作的“每设备”数据和“每操作”数据的方法。

lpNumberOfBytes在错误情况下可能为零,尽管我倾向于以与非错误情况相同的方式处理它,因为我在错误处理期间从不使用结果值(或缓冲区内容)。

关于c++ - 当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28768969/

相关文章:

c++使用嵌套模板类来携带类型信息

c++ - 处理 SSL 客户端不读取所有数据

c++ - Linux Networking IO Noob : Select() and Recvfrom, 阻塞还是非阻塞?

c++ - WSARecv() 和 lpNumberOfBytesRecvd 参数

tcp - Win IOCP下如何识别推回?

C++ 模板导致以下函数出现错误

c++ - 可变函数包装器

c++ - 为什么 std::basic_ostream 的 'operator<<' 部分特化存在 'char' 重载?

linux - 不能同时监听 IPv4 和 IPv6(地址已被使用)

multithreading - libuv 与原始 epoll 或 IOCP