Dahua NetSDK Ошибка 23: NET_INSUFFICIENT_BUFFER — Недостаточный размер буфера
Сбои при экспорте журналов, картинок или больших конфигураций:
- Функции
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); Частые вопросы (FAQ)
Как узнать, какой именно размер буфера требуется для запроса?
Большинство функций NetSDK при передаче NULL в качестве указателя буфера возвращают требуемый размер в выходном параметре lpdwBytesReturned/nBufferLen.
Может ли ошибка 23 возникать при поиске записей в архиве NVR?
Да, если за запрашиваемый интервал найдено 5000 записей, а массив NET_RECORDFILE_INFO был выделен только на 100 элементов.
Почему ошибка 23 не возникает на низких разрешениях камер?
Снапшоты 1080p обычно помещаются в буфер 300-600 КБ, а 4K/H.265 кадры с высокой детализацией могут превышать 2-4 МБ.
Нужно ли обнулять буфер перед передачей в SDK?
Рекомендуется выполнять memset в ноль для исключения чтения старых данных при частичном заполнении.