Проблема с сокетом Visual Studio 2008 Vista
-
06-07-2019 - |
Вопрос
Привет, я пытаюсь использовать программу проверки портов, написанную в Visual Studio 2008 с использованием платформы .Net Framework 3.5 SP 1, и, похоже, у меня проблема с использованием моей программы в ОС на базе Vista (в данном случае фактической операционной системой является Windows 2008 Server (как 32, так и 64-разрядные машины)), хотя, тем не менее, она отлично работает на машинах XP.Я не совсем уверен, в чем проблема, но я получаю System.NotSupportedException.Есть идеи о том, как я могу изменить следующий код (или, предпочтительно, конфигурацию компьютера), чтобы обеспечить этот тип проверки портов?
static bool IsPortOpen(int portNumber)
{
bool isOpen = false;
IPAddress ip = (IPAddress)Dns.GetHostAddresses("localhost")[0];
Socket s = null;
try
{
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp))
s.Connect(ip, portNumber);
// Port is in use and connection is successful
if (s.Connected == true)
{
isOpen = false;
}
}
catch (SocketException exception)
{
// http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx
if (exception.ErrorCode == 10061)
{
isOpen = true;
}
}
finally
{
if (s != null)
{
s.Close();
}
}
return isOpen;
}
Решение
Оказывается, проблема была в том, что:
Dns.GetHostAddresses("локальный хост");
Возвращает 2 IP-адреса на сервере Windows 2008.Первый - "::1", а второй - фактический IP-адрес.Если кто-нибудь знает, почему это так (поскольку я не могу понять смысл возврата ":: 1") Я был бы признателен, в противном случае, похоже, работает простой захват последнего IP-адреса из списка.
Другие советы
:: 1 - это адрес обратной связи IPv6. Ваш код не выполняется, потому что вы используете AddressFamily.InterNetwork вместо AddressFamily.InternetWorkV6.
В Vista + IPv6 работает по умолчанию. Это отдельная опция конфигурации для XP / 2003.
Я считаю, что на Windows 2008 Server возвращены два IP-адреса, потому что один - IPv4, а другой - IPv6-адрес.
" Когда в качестве имени хоста передается пустая строка, этот метод возвращает IPv4-адреса локального хоста для всех операционных систем, кроме Windows Server 2003; для Windows Server 2003 возвращаются адреса IPv4 и IPv6 для локального хоста. " Источник: http://msdn.microsoft.com/ ан-нас / библиотека / system.net.dns.gethostaddresses.aspx