我已經編寫了基於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