Устранение неполадок Socket.Bind: сокет запрещен его правами доступа - PullRequest
2 голосов
/ 22 мая 2019

Ближе к концу прошлой недели я обнаружил, что в большинстве случаев я больше не могу связываться с портами сокетов.Это происходит в .NET Core 2.2, ASP.NET Core и для служб WCF.

Я создал ниже пример приложения .NET Core 2.2 для тестирования:

  public class Program
  {
    static int Main()
    {
      try
      {
        const int connectionQueueSize = 1;
        var endPoint = new IPEndPoint(new IPAddress(new byte[]{127,0,0,1}),5000);
        using (var socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
        {
          try
          {
            socket.Bind(endPoint);
          }
          catch (Exception ex)
          {
            Console.Error.WriteLine($"Failed to bind: {ex.Message}");
            Console.Error.WriteLine(ex.StackTrace);
            return 1;
          }

          try
          {
            socket.Listen(connectionQueueSize);
          }
          catch (Exception ex)
          {
            Console.Error.WriteLine($"Failed to listen: {ex.Message}");
            Console.Error.WriteLine(ex.StackTrace);
            return 2;
          }
          Console.WriteLine($"SUCCESS: bound and listened to: {endPoint.Address}:{endPoint.Port}");
          socket.Close();
          return 0;
        }
      }
      catch (SocketException ex)
      {
        Console.Error.WriteLine($"FAILED: {ex.Message}");
        Console.Error.WriteLine(ex.StackTrace);
        return 3;
      }
    }
  }

ВыводПриведенное выше приложение выглядит следующим образом (оба запускаются под моей учетной записью, учетной записью домена с правами локального администратора и при запуске от имени администратора):

Failed to bind: An attempt was made to access a socket in a way forbidden by its access permissions
   at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName)
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Bind(EndPoint localEP)
   at SocketBind.Program.Main() in c:\source\samples\SocketBind\SocketBind\SocketBind\Program.cs:line 19

Фон :

Моя машина работает в корпоративной среде с несколькими антивирусными программами, работающими в дополнение к некоторым антивирусным программам.До прошлой недели у меня не было проблем.

Попытки решения:

  1. Я пробовал perfmon при попытке связать, но не увидел ничего интересного.

  2. Я также запустил perfview для приложения ASP.NET Core и обнаружил, что точно такая же ошибка произошла как для адресов IPv4, так и для адресов IPv6.Интересный вывод был:

    thisOrContextObject = "Socket # 15842089" memberName = "DoBind" message = "System.Net.Sockets.SocketException (10013): была сделана попытка получить доступ ксокет в пути, запрещенном его правами доступа "

    Указанный сокет был сокетом IPv4, но такая же ошибка произошла и для IPv6.

  3. Per отладка CoreFX на Windows docs , я также пытался получить трассировку с помощью logman, но я все еще не видел причину ошибки.

  4. Я внес свой белый списокприложение как по порту, так и по физическому пути в межсетевом экране, но ни одно из них не привело к каким-либо изменениям.

  5. Per Get-NetTCPConnection |? { $_.LocalPort -eq 5000}, на рассматриваемом порту ничего не работает.

  6. Подтверждено, что в журналах событий нет ошибок или предупреждений.

Что можно сделать, чтобы определить причину отказа в доступеошибка, хотя у меня может не быть доступа к контролю каждого аспекта того, чтонаходится на компьютере (например, AV / Security Software)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...