Не удается открыть порт 2000 на адаптере 127.0.0.1 - как найти причину? - PullRequest
1 голос
/ 23 марта 2019

В течение нескольких месяцев я не запускал разрабатываемое нами приложение .NET, которое в прошлый раз работало нормально.Тем временем я обновил свой компьютер до Windows 10 Pro 1809 (как и дома).

Сегодня я попытался запустить его, и он не работал должным образом.Я отладил его и сузил до исключения после попытки кода запустить сервер TCP на настраиваемом порту, который по умолчанию 2000.

Исключением является следующее:

System.Net.Sockets.SocketException (0x80004005): An attempt was made to access a socket in a way forbidden by its access permissions

Выдается при выполнении этого кода:

        listener = new TcpListener("127.0.0.1", 2000);
        listener.Start();

Я сделал обычные диагностические шаги, но безрезультатно:

  • Что-нибудь ужепрослушивание этого порта
  • Отключение брандмауэра
  • Повторное включение брандмауэра, затем удаление правил, окружающих приложение и рассматриваемый порт
  • Включение ведения журнала брандмауэра, чтобы увидеть, есть ли какие-либо доказательстваон отвергает

Поэтому я быстро тестирую то же самое в сценарии PowerShell:

$port = 2000
$listener = new-object System.Net.Sockets.TcpListener ("127.0.0.1", $port)
try 
{
    $listener.start()    
    Write-Output "Successfully opened port $port"
}
catch 
{
    Write-Error $_          
}
finally
{
    $listener.Stop()
}

И получаю почти то же исключение: Exception calling "Start" with "0" argument(s): "An attempt was made to access a socket in a way forbidden by its access permissions"

ДалееЯ решил изменить порт на 3000, и он работает нормально.

Затем я адаптирую скрипт для циклического переключения между портами с 1 до 2500 и получаю кучу сбоев, включая диапазоны от 1657 до 2156 и 2179 до 2279.

Куда пойти дальше, чтобы найти основную причину?Какой механизм может использовать Windows, чтобы отклонить попытку привязки (?)?

UPDATE

Попробовал это приложение C #, и я получил тот же результат:

namespace TcpBindTest
{
    using System.Net;
    using System.Net.Sockets;

    class Program
    {
        static void Main(string[] args)
        {
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint endpoint = new IPEndPoint(new IPAddress(new byte[]{127, 0, 0, 1}), 2000);
            listener.Bind(endpoint);
            listener.Listen(1);
        }
    }
}
...