Используя следующий код, более или менее скопированный из MSDN пример
GetAdaptersAddresses, Я получаю возвращаемое значение 122, что означает ERROR_INSUFFICIENT_BUFFER (в соответствии с этот список кодов ошибок системы).
ULONG outBufLen = 150000; // Tried for different (large) values here...
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES *) malloc(outBufLen);
DWORD dwRetVal = GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen);
// ....
free(pAddresses);
Документация GetAdaptersAddresses не перечисляет ERROR_INSUFFICIENT_BUFFER как одно из ожидаемых возвращаемых значений. (В нем перечисляется ERROR_BUFFER_OVERFLOW, который должен настроить outBufLen на необходимое значение, но это остается неизменным).
Использование GetAdaptersInfo вместо этого приводит к тем же симптомам.
Эта ошибка не возникает на моей машине разработки, но на одной виртуальной и одной очень чистой установке Windows 7 x86 SP1 (добавлены распространяемые файлы VC ++).
Как новичок в C ++, я делаю что-то не так? Что может вызвать эту ошибку и как ее исправить? знак равно
Во-первых, вы можете — как другие предложили — сделать два вызова, чтобы выяснить необходимый размер буфера, а затем выполнить сам запрос. Особенно, если вы видите ошибку, вашей первой попыткой было бы спросить API, какого размера он ожидал.
Во-вторых, вам нужно знать, что этот API не совсем безопасен в 32-битных процессах, потребляющих большие объемы памяти, поэтому буферы занимают более 2 ГБ адресного пространства. API может начать действовать странным образом, либо из-за собственной ошибки, либо из-за ошибки в нижележащем слое. Смотрите подробности об этом на MS Connect здесь: GetAdaptersAddresses
API неправильно возвращает адаптеры для процесса с высоким потреблением памяти.
Тот факт, что код ошибки не является «одним из ожидаемых возвращаемых значений», говорит для версий, что ошибка происходит из нижележащего уровня, и этот API просто передает ее при внутреннем сбое. Как подсказка, отключив какой-либо сетевой адаптер в системе, вы можете избавиться от ошибки.
Visual Studio развернула библиотеку с именем «IPHLPAPI.dll» вместе с моим проектом, который вызвал проблему. Удаление этого файла решило это.
Почему это так, подлежит дальнейшему исследованию =)
Во-первых, буфер — это блок памяти.
Такое недостаточное значение может означать, что вы как-то не дали ему достаточно памяти. Наш может быть блоком памяти, к которому у вас нет доступа. Может быть, адрес даже не существует.
Посмотри на это:
ERROR_INSUFFICIENT_BUFFER
122 (0x7A)
The data area passed to a system call is too small.
Это действительно похоже на то, что в буфере недостаточно выделенной памяти. Или похожие.
Может быть
outBufLen
должна быть определенной длины, может быть, размер блока памяти. Потому что иногда он не проверяет «имя», но пытается сравнить размер каждой переменной. Эта идея пришла из языка шейдеров высокого уровня.
Так что я бы попробовал взглянуть немного больше на:
ULONG outBufLen = 150000; // Tried for different (large) values here...
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES *) malloc(outBufLen);
Удачи!
Чтобы узнать точный требуемый размер буфера, вы можете просто передать NULL в pAddresses, и размер будет установлен на нужный размер. Вы можете немного переписать свой код, чтобы это работало;
DWORD rv, size = 0;
PIP_ADAPTER_ADDRESSES adapter_addresses;
rv = GetAdaptersAddresses(AF_INET, 0, NULL, NULL, &size);
if (rv != ERROR_BUFFER_OVERFLOW)
return false; // ERROR
adapter_addresses = (PIP_ADAPTER_ADDRESSES)malloc(size);
rv = GetAdaptersAddresses(AF_INET, 0, NULL, adapter_addresses, &size);
if (rv != ERROR_SUCCESS) {
free(adapter_addresses);
return false; // ERROR
}