Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

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

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 вручную.

Полезные материалы
Рекомендуем