Socket.Bind失败故障排除:以某种方式禁止套接字的访问权限

时间:2019-05-22 15:01:56

标签: c# sockets asp.net-core .net-core

上周末,我发现在大多数情况下我无法再绑定到套接字端口。在.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. 我还对ASP.NET Core应用程序运行了perfview,发现IPv4和IPv6地址发生了完全相同的错误。我发现感兴趣的输出是:

      

    thisOrContextObject =“ Socket#15842089” memberName =“ DoBind” message =“ System.Net.Sockets.SocketException(10013):尝试以其访问权限禁止的方式访问套接字”

    所引用的套接字是IPv4套接字,但是IPv6也发生了相同的错误。

  3. 对于debugging CoreFX on Windows docs,我也尝试使用logman捕获跟踪,但是仍然没有发现错误的原因。

  4. 我通过防火墙中的端口和物理路径将我的应用程序列入了白名单,但均未导致任何更改。

  5. 对于每个Get-NetTCPConnection |? { $_.LocalPort -eq 5000},相关端口上没有任何运行。

  6. 确认事件日志中未显示任何错误或警告。

即使我可能无权控制计算机(例如,AV /安全软件)的所有方面,我该怎么做才能确定拒绝访问错误的原因

0 个答案:

没有答案