Я написал сложную библиотеку для управления сетевым взаимодействием на основе механизма 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
}
Почему это происходит?Мне нужно знать о закрытии соединения немедленно, чтобы иметь возможность подключиться к серверу резервного копирования (не так сильно загружен - из-за этого происходит отключение).