У меня есть код, который отлично работал под Windows 2003 для получения списка IP-адресов, привязанных к серверу:
foreach (IPAddress addr in (Dns.GetHostEntry(Dns.GetHostName())).AddressList)
{
// Code here to act on each address
}
Когда я запускаю этот код на нашем сервере Windows 2008, он возвращает только один IP-адрес. При дальнейшем расследовании оказалось, что все остальные IP-адреса, которые прослушивает машина, были добавлены с помощью команды netsh int ipv4 add address
и с указанием флага skipassource=true
.
Есть ли способ включить эти адреса в мой запрос, т.е. вернуть ВСЕ адреса на сервере?
(Если вам интересно, флаг skipassource=true
был установлен, потому что Windows 2008 ввела новое поведение в сети, которое позволяет ей решать, какой из ваших IP-адресов она считает «первичным», а остальные наши приложения полагаются на то, что мы можем выбирать Единственный способ сделать это в Windows 2008 — пометить все остальные адреса как skipassource=true
.)
Изменить Этот вопрос теперь просто для удовлетворения моего любопытства, так как я работал над решением этой проблемы. Мой исходный код, приведенный выше, использовался для просмотра всех IP-адресов на сервере и проверки того, нашел ли он совпадение с конкретным IP-адресом, который я искал. Теперь я проверяю, работает ли на сервере, на котором я нахожусь, служба, которая прослушивает этот конкретный IP-адрес/порт, поэтому мне больше не нужно перебирать ВСЕ IP-адреса. Тем не менее, мне было бы интересно услышать, есть ли ответ на исходный вопрос.
Изменить Спасибо @aKzenT за решение этой проблемы. Теперь я использую NetworkInteface.GetAllNetworkInterfaces()
для доступа ко всем IP-адресам, а не Dns.GetHostEntry()
. Мой окончательный код выглядит так:
foreach (NetworkInterface netface in NetworkInterface.GetAllNetworkInterfaces())
{
foreach (UnicastIPAddressInformation uni in netface.GetIPProperties().UnicastAddresses)
{
IPAddress addr = uni.Address;
// Code here to act on each address
}
}