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

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

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

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

Dahua NetSDK Ошибка 23: NET_INSUFFICIENT_BUFFER — Недостаточный размер буфера

Обновлено: 24.08.2026 · Официальная документация ↗

Сбои при экспорте журналов, картинок или больших конфигураций:

  • Функции CLIENT_QueryLog, CLIENT_GetDevConfig, CLIENT_QueryRecordFile завершаются с ошибкой 23.
  • В выходной переменной nBufferLen возвращается требуемый размер, превышающий выделенный массив.
  • Аварийное повреждение кучи (Heap corruption) из-за переполнения при некорректно выделенной памяти.

Код ошибки NET_INSUFFICIENT_BUFFER (23) генерируется, если переданный пользователем буфер оперативной памяти меньше, чем реальный объем данных, возвращаемый устройством.

1. Двухэтапный паттерн динамического выделения памяти

Для всех функций, возвращающих переменный объем данных (логи, файлы, конфигурации лиц СКУД), используйте двухэтапный вызов:

// 1. Первый вызов с нулевым буфером для получения требуемого размера
DWORD dwNeededSize = 0;
CLIENT_GetNewDevConfig(lLoginID, CFG_CMD_RECORD, nChannel, NULL, 0, &dwNeededSize, 3000);

if (dwNeededSize > 0) {
    // 2. Выделение памяти под точный размер ответа
    std::vector buffer(dwNeededSize);
    int nError = 0;
    
    if (CLIENT_GetNewDevConfig(lLoginID, CFG_CMD_RECORD, nChannel, buffer.data(), buffer.size(), &nError, 5000)) {
        // Успешный парсинг полученных данных
    } else {
        DWORD dwErr = CLIENT_GetLastError();
    }
}

2. Увеличение размера буфера для скриншотов высокого разрешения (4K)

При захвате кадров 4K/8MP в JPEG буфер фиксированного размера (например, 1 МБ) недостаточен:

// Выделяйте не менее 4-8 МБ под сырой JPEG-снапшот высокого качества
const DWORD MAX_SNAP_SIZE = 8 * 1024 * 1024;
std::unique_ptr pSnapBuf(new BYTE[MAX_SNAP_SIZE]);
DWORD dwRetSize = 0;

CLIENT_CapturePictureData(lRealHandle, pSnapBuf.get(), MAX_SNAP_SIZE, &dwRetSize);
💡 Практика специалистов: При работе с базой лиц СКУД (Face Recognition) размер пакета с фотографиями может достигать десятков мегабайт. Всегда используйте динамические контейнеры std::vector с запасом по памяти.

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

Как узнать, какой именно размер буфера требуется для запроса?

Большинство функций NetSDK при передаче NULL в качестве указателя буфера возвращают требуемый размер в выходном параметре lpdwBytesReturned/nBufferLen.

Может ли ошибка 23 возникать при поиске записей в архиве NVR?

Да, если за запрашиваемый интервал найдено 5000 записей, а массив NET_RECORDFILE_INFO был выделен только на 100 элементов.

Почему ошибка 23 не возникает на низких разрешениях камер?

Снапшоты 1080p обычно помещаются в буфер 300-600 КБ, а 4K/H.265 кадры с высокой детализацией могут превышать 2-4 МБ.

Нужно ли обнулять буфер перед передачей в SDK?

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

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