Indy получает всю информацию о локальном интерфейсе (кросс-платформенный)

Я преобразовываю устройство, содержащее список сетевых интерфейсов, в кроссплатформенное. Текущая версия использует необработанный winsock для получения адреса, маски и широковещательного адреса для каждого сетевого интерфейса в системе.

Я полагаю, что самый простой способ сделать эту кросс-платформу — использовать Indy. Я обнаружил, что AddLocalAddressesToList — это хороший простой способ получить IP-адреса всех интерфейсов, но я не могу найти другую необходимую мне информацию (маску и широковещательный адрес). Я думаю, что могу рассчитать широковещательный адрес, так что на самом деле это просто маска, которую я не могу понять.

к вашему сведению. Это код, который я нашел для получения IP-адресов всех интерфейсов.

TIdStack.IncUsage;
try
  GStack.AddLocalAddressesToList(Memo1.Lines);
finally
  TIdStack.DecUsage;
end;

person Martin    schedule 08.03.2013    source источник


Ответы (1)


WinSock не поддерживает передачу такой информации. Вместо этого вы должны использовать API-интерфейсы для конкретной ОС. В Windows это означает использование функций Win32 API GetAdaptersInfo() и GetAdaptersAddresses(). На других платформах вы можете использовать функцию getifaddrs() там, где она доступна.

Indy в настоящее время не поддерживает то, что вы просите. Также обратите внимание, что в настоящее время AddLocalAddressesToList() поддерживает только адреса IPv4 на большинстве платформ, включая Windows.

Поддержка получения локальных адресов IPv6, а также другой информации, такой как маски подсети, в настоящее время находится в разработке, но ETA о ее доступности пока нет.

person Remy Lebeau    schedule 08.03.2013
comment
Вы правы, это не функции winsock, но это те, которые я использую в текущем устройстве. Я предполагаю, что должны быть аналогичные функции под OSX? - person Martin; 08.03.2013
comment
Как я уже сказал, вы можете использовать функцию getifaddrs() на платформах, которые ее поддерживают, включая OSX. - person Remy Lebeau; 08.03.2013