Dahua NetSDK Ошибка 29: NET_LOGIN_ERROR_RELOGGIN — Повторный вход в сессию
Сбои при параллельном или повторном подключении к устройству:
- Функция логина завершается с ошибкой
29(NET_LOGIN_ERROR_RELOGGIN). - В
stOut.nErrorвозвращается код4(User already logged in). - Устройство отклоняет авторизацию, считая текущий сеанс уже активным.
Код NET_LOGIN_ERROR_RELOGGIN (29) указывает на то, что данная учетная запись уже авторизована с этого же IP-адреса/сокета, либо на устройстве включена политика запрета мульти-сессий (Single Login Session Policy).
1. Реализация пула соединений (Connection Pool Singleton)
Не вызывайте CLIENT_Login перед каждой операцией (получение снапшота, чтение статуса реле). Храните единый дескриптор lLoginID на протяжении всего жизненного цикла сервиса:
class DahuaDeviceManager {
private:
std::unordered_map m_sessions;
std::mutex m_mutex;
public:
LLONG GetSession(const std::string& ip, const std::string& user, const std::string& pass) {
std::lock_guard lock(m_mutex);
if (m_sessions.find(ip) != m_sessions.end() && m_sessions[ip] != 0) {
return m_sessions[ip]; // Возврат уже существующей сессии
}
// Если сессии нет — выполняем логин
LLONG hLogin = PerformLogin(ip, user, pass);
m_sessions[ip] = hLogin;
return hLogin;
}
}; 2. Корректное завершение предыдущей сессии (Logout)
При перезапуске модуля всегда явно вызывайте CLIENT_Logout перед повторной попыткой входа:
if (lLoginID != 0) {
CLIENT_Logout(lLoginID);
lLoginID = 0;
}3. Ожидание таймаута сессии на стороне NVR
Если приложение упало аварийно (crash) без вызова CLIENT_Logout, сокет на стороне регистратора может удерживаться активным до 60-120 секунд (TCP Keep-Alive Timeout). В этом случае повторный коннект вернет ошибку 29 до истечения внутреннего таймаута ОС NVR.
Частые вопросы (FAQ)
Почему Dahua NVR запрещает повторный вход под тем же пользователем?
Это настраиваемая политика безопасности для исключения перехвата управления поворотными камерами и изменения настроек несколькими операторами одновременно.
Как сбросить зависшую сессию на стороне регистратора?
В Web-интерфейсе NVR перейдите в меню 'Online Users' (Пользователи онлайн) и принудительно отключите зависший IP-клиент.
Можно ли логиниться под одним пользователем с разных IP-адресов?
Да, если в настройках группы учетной записи включена опция 'Reusable' (Многократный вход).
Что делать, если ошибка 29 возникает при автоматическом переподключении?
Положитесь на встроенный механизм авто-реконнекта SDK (fHaveReConnect коллбэк), не вызывая повторный CLIENT_Login вручную.