diff --git a/src/protobuf-net.GrpcLite/ConnectionFactory.cs b/src/protobuf-net.GrpcLite/ConnectionFactory.cs index 3c9f85a..8f1dd81 100644 --- a/src/protobuf-net.GrpcLite/ConnectionFactory.cs +++ b/src/protobuf-net.GrpcLite/ConnectionFactory.cs @@ -10,6 +10,9 @@ using System.Net; using System.Net.Security; using System.Net.Sockets; +#if NET6_0_OR_GREATER +using System.Runtime.Versioning; +#endif using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; @@ -48,8 +51,45 @@ public static Func>> Connec /// public static Func>> ListenNamedPipe(string pipeName, ILogger? logger = null) => async cancellationToken => { - var pipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, + var pipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, + NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous | PipeOptions.WriteThrough); + + return await WaitForClientConnection(pipeName, pipe, logger, cancellationToken); + }; + +#if !NET5_0 && !NETCOREAPP3_1 + /// + /// Listen (as a server) to a named-pipe. + /// +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif + public static Func>> ListenNamedPipe(string pipeName, PipeSecurity pipeSecurity, ILogger? logger = null) => async cancellationToken => + { +#if NETFRAMEWORK + var pipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, + PipeOptions.Asynchronous | PipeOptions.WriteThrough, 0, 0, pipeSecurity); + +#elif NETSTANDARD2_1 + + var pipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, + PipeTransmissionMode.Byte, PipeOptions.Asynchronous | PipeOptions.WriteThrough, 0, 0); + + pipe.SetAccessControl(pipeSecurity); +#else + + var pipe = NamedPipeServerStreamAcl.Create(pipeName, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, + PipeTransmissionMode.Byte, PipeOptions.Asynchronous | PipeOptions.WriteThrough, 0, 0, pipeSecurity); + +#endif + + return await WaitForClientConnection(pipeName, pipe, logger, cancellationToken); + }; +#endif + + private static async Task> WaitForClientConnection(string pipeName, NamedPipeServerStream pipe, ILogger? logger, CancellationToken cancellationToken) + { try { logger.Debug(pipeName, static (state, _) => $"waiting for connection... {state}"); @@ -65,7 +105,8 @@ public static Func>> Listen pipe.SafeDispose(); throw; } - }; + } + /// /// Connect (as a client) to a socket server. diff --git a/src/protobuf-net.GrpcLite/protobuf-net.GrpcLite.csproj b/src/protobuf-net.GrpcLite/protobuf-net.GrpcLite.csproj index e8e13c9..33aa0ee 100644 --- a/src/protobuf-net.GrpcLite/protobuf-net.GrpcLite.csproj +++ b/src/protobuf-net.GrpcLite/protobuf-net.GrpcLite.csproj @@ -17,6 +17,7 @@ +