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
}
なぜこうなった?バックアップサーバーに接続できるようにするには、接続の閉鎖についてすぐに知る必要があります(負荷がそれほど高くないため、切断が発生しています)。