我已经编写了基于iocp机制的用于管理网络通信的复杂库。问题在于,当服务器通过调用API方法closesocket()关闭连接时,这些信息有时会以秒或甚至分钟的形式传输给客户端。我检测关闭连接的代码看起来像这样(简化):GetQueuedCompletionStatus延迟
ok = GetQueuedCompletionStatus(completion_port, &io_size, (PULONG_PTR)&context, &overlapped, 40);
if (!ok) {
// something went broken
DWORD err = GetLastError();
if (err == ERROR_CONNECTION_REFUSED) {
// connection failed
} else if (err == ERROR_SEM_TIMEOUT) {
// connection timeout
} else if (err == ERROR_NETNAME_DELETED) {
// connection closure - point of interest
} else if (err != WAIT_TIMEOUT) {
// unknown error
}
} else {
// process incomming or outgoing data
}
这究竟是为什么?我需要立即知道连接关闭,以便能够连接到备份服务器(不是那么重的负载 - 因此发生断开连接)。
不直接关系到你的问题,但你应该检查的重叠处理函数中的值以及返回代码。当重叠== NULL就意味着失败GetQueuedCompletionStatus时,重叠的时候!= NULL这意味着I/O请求失败。 – 2011-04-29 21:27:44