Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unix Domain Socket doesn't support on Windows #55979

Open
reitowo opened this issue Nov 24, 2024 · 2 comments
Open

Unix Domain Socket doesn't support on Windows #55979

reitowo opened this issue Nov 24, 2024 · 2 comments
Labels
libuv Issues and PRs related to the libuv dependency or the uv binding. windows Issues and PRs related to the Windows platform.

Comments

@reitowo
Copy link

reitowo commented Nov 24, 2024

Version

20.18.0

Platform

Microsoft Windows NT 10.0.26100.0 x64

Subsystem

No response

What steps will reproduce the bug?

Currently, Windows (at least .NET) supports connect to UnixDomainSocket, or listen to UnixDomainSocket in ASP.NET Core. But node's net module seems not support connect to a Windows local file.

public class UnixDomainSocketsConnectionFactory(EndPoint endPoint) {
   public async ValueTask<Stream> ConnectAsync(SocketsHttpConnectionContext _,
      CancellationToken cancellationToken = default) {
      var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);

      try {
         await socket.ConnectAsync(endPoint, cancellationToken).ConfigureAwait(false);
         return new NetworkStream(socket, true);
      } catch {
         socket.Dispose();
         throw;
      }
   }

   public static GrpcChannel CreateChannel(string socketPath) {
      var udsEndPoint = new UnixDomainSocketEndPoint(socketPath);
      var connectionFactory = new UnixDomainSocketsConnectionFactory(udsEndPoint);
      var socketsHttpHandler = new SocketsHttpHandler {
         ConnectCallback = connectionFactory.ConnectAsync
      };

      return GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions {
         HttpHandler = socketsHttpHandler
      });
   }
}
   protected void Initialize(string token) {
      var builder = WebApplication.CreateBuilder();
      builder.WebHost.ConfigureKestrel(serverOptions => {
         if (!Directory.Exists(MetaBoxStatic.UnixSocketPath)) {
            Directory.CreateDirectory(MetaBoxStatic.UnixSocketPath);
         }

         var socketPath = Path.Combine(MetaBoxStatic.UnixSocketPath, $"MetaBox-{token}.tmp");
         serverOptions.ListenUnixSocket(socketPath);
         serverOptions.ConfigureEndpointDefaults(listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; });
      });

      ConfigureBuilder(builder);
      builder.Services.PostConfigureAll<HostOptions>(opts => opts.ShutdownTimeout = TimeSpan.FromSeconds(1));

      WebApp = builder.Build();
      ConfigureApp(WebApp);
   }

How often does it reproduce? Is there a required condition?

Always

What is the expected behavior? Why is that the expected behavior?

The net connects to the "Windows" UnixDomainSocket as it could.

What do you see instead?

EACCESS / ENOENT

Additional information

No response

@bnoordhuis
Copy link
Member

OP is aware this needs to happen in libuv first, see libuv/libuv#2537 (comment) and note the unsubstantiated performance claim.

@bnoordhuis bnoordhuis added windows Issues and PRs related to the Windows platform. libuv Issues and PRs related to the libuv dependency or the uv binding. labels Nov 24, 2024
@reitowo
Copy link
Author

reitowo commented Nov 25, 2024

About performance I'll leave some extra into there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
libuv Issues and PRs related to the libuv dependency or the uv binding. windows Issues and PRs related to the Windows platform.
Projects
None yet
Development

No branches or pull requests

2 participants