Dahua NetSDK Error 5: NET_INVALID_HANDLE — недействительный дескриптор или хэндл
- Функции 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 завершился успешно и вернул ненулевой хэндл перед запуском дальнейших операций.
Частые вопросы (FAQ)
Что такое дескриптор (Handle) в Dahua NetSDK?
Это 64-битный целочисленный идентификатор (LLONG), указывающий на внутренний контекст сессии, сокета или медиапотока в оперативной памяти SDK.
Почему после автореконнекта старый Login ID становится невалидным?
При переподключении через встроенный механизм SDK старый дескриптор обычно сохраняется, но если приложение вызвало Logout вручную, дескриптор аннулируется навсегда.
Можно ли переиспользовать дескриптор после CLIENT_StopRealPlay?
Нет. Хэндл воспроизведения потока уничтожается при остановке. Для повторного запуска нужно получить новый хэндл через CLIENT_RealPlayEx.
Что возвращает CLIENT_GetLastError() при передаче нулевого хэндла?
Функция немедленно возвращает код ошибки 5 (NET_INVALID_HANDLE) без обращения к сети.