【发布时间】:2011-04-29 10:07:38
【问题描述】:
我已经编写了复杂的库来管理基于 iocp 机制的网络通信。问题是当服务器通过调用 API 方法 closesocket() 关闭连接时,此信息有时会延迟数秒甚至数分钟传输到客户端。我用于检测连接关闭的代码如下所示(简化):
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 请求失败。