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

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

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

NET_INVALID_HANDLE (5) IP-Телефония и СКУД

Dahua NetSDK Error 5: NET_INVALID_HANDLE — недействительный дескриптор или хэндл

Обновлено: 24.08.2026 · Официальная документация ↗
  • Функции SDK (например, CLIENT_RealPlay, CLIENT_StopRealPlay, CLIENT_Logout) возвращают 5 (NET_INVALID_HANDLE).
  • Операция управления камерой выполняется после того, как соединение было разорвано или закрыто другим потоком.
  • Падение приложения из-за передачи нулевого (0) или мусорного значения дескриптора.

1. Валидация дескриптора перед вызовом API

Всегда проверяйте значение дескриптора на неравенство нулю перед вызовом зависимых функций SDK:

if (g_lLoginID != 0) {
    BOOL bSuccess = CLIENT_Logout(g_lLoginID);
    if (bSuccess) {
        g_lLoginID = 0; // Обязательное обнуление после закрытия
    }
} else {
    printf("Warning: Attempted to logout with NULL handle!\n");
}

2. Синхронизация потоков при закрытии сессий

Используйте мьютексы для предотвращения состояния гонки (Race Condition), когда один поток завершает сессию, а второй пытается отправить в нее команду:

std::mutex g_sdkMutex;

void StopStream(LLONG &hPlayHandle) {
    std::lock_guard<std::mutex> lock(g_sdkMutex);
    if (hPlayHandle != 0) {
        CLIENT_StopRealPlayEx(hPlayHandle);
        hPlayHandle = 0;
    }
}

3. Проверка возврата дескриптора при логине

Убедитесь, что CLIENT_LoginEx2 завершился успешно и вернул ненулевой хэндл перед запуском дальнейших операций.

💡 Практика специалистов: В C# (.NET wrapper) всегда используйте IntPtr или long (Int64) для хранения дескрипторов Dahua SDK. Использование 32-битного int неизбежно приведет к NET_INVALID_HANDLE при запуске на x64 платформе.

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

Что такое дескриптор (Handle) в Dahua NetSDK?

Это 64-битный целочисленный идентификатор (LLONG), указывающий на внутренний контекст сессии, сокета или медиапотока в оперативной памяти SDK.

Почему после автореконнекта старый Login ID становится невалидным?

При переподключении через встроенный механизм SDK старый дескриптор обычно сохраняется, но если приложение вызвало Logout вручную, дескриптор аннулируется навсегда.

Можно ли переиспользовать дескриптор после CLIENT_StopRealPlay?

Нет. Хэндл воспроизведения потока уничтожается при остановке. Для повторного запуска нужно получить новый хэндл через CLIENT_RealPlayEx.

Что возвращает CLIENT_GetLastError() при передаче нулевого хэндла?

Функция немедленно возвращает код ошибки 5 (NET_INVALID_HANDLE) без обращения к сети.

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