Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
NET_LOGIN_ERROR_RELOGGIN (29) IP-Телефония и СКУД

Dahua NetSDK Ошибка 29: NET_LOGIN_ERROR_RELOGGIN — Повторный вход в сессию

Обновлено: 24.08.2026  ·  Официальная база знаний

Сбои при параллельном или повторном подключении к устройству:

  • Функция логина завершается с ошибкой 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.

Практический опыт инженера: Никогда не выполняйте логин по схеме 'Login -> Do Work -> Logout' на каждую операцию. Это создает шторм TCP-соединений, засоряет таблицу сокетов TIME_WAIT и провоцирует ошибки 28 и 29.

Частые вопросы (FAQ)

Почему Dahua NVR запрещает повторный вход под тем же пользователем?

Это настраиваемая политика безопасности для исключения перехвата управления поворотными камерами и изменения настроек несколькими операторами одновременно.

Как сбросить зависшую сессию на стороне регистратора?

В Web-интерфейсе NVR перейдите в меню 'Online Users' (Пользователи онлайн) и принудительно отключите зависший IP-клиент.

Можно ли логиниться под одним пользователем с разных IP-адресов?

Да, если в настройках группы учетной записи включена опция 'Reusable' (Многократный вход).

Что делать, если ошибка 29 возникает при автоматическом переподключении?

Положитесь на встроенный механизм авто-реконнекта SDK (fHaveReConnect коллбэк), не вызывая повторный CLIENT_Login вручную.