/
PipesHost.cs
71 lines (62 loc) · 2.09 KB
/
PipesHost.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.IO.Pipes;
using System.Threading.Tasks;
using VoltRpc.Logging;
namespace VoltRpc.Communication.Pipes;
/// <summary>
/// <see cref="Host" /> using named pipes
/// </summary>
public sealed class PipesHost : Host
{
private readonly string pipeName;
/// <summary>
/// Creates a new <see cref="PipesHost" /> instance
/// </summary>
/// <param name="pipeName">The name of the pipe</param>
/// <param name="bufferSize">The size of the buffers</param>
public PipesHost(string pipeName, int bufferSize)
: this(pipeName, null, bufferSize)
{
}
/// <summary>
/// Creates a new <see cref="PipesHost" /> instance
/// </summary>
/// <param name="pipeName">The name of the pipe</param>
/// <param name="logger">The <see cref="ILogger" /> to use</param>
/// <param name="bufferSize">The size of the buffers</param>
public PipesHost(string pipeName, ILogger logger = null, int bufferSize = DefaultBufferSize)
: base(logger, bufferSize)
{
this.pipeName = pipeName;
}
/// <inheritdoc />
public override void StartListening()
{
CheckDispose();
Logger.Debug("Named Pipes host now listening...");
IsRunning = true;
while (IsRunning)
try
{
if (ConnectionCount >= MaxConnectionsCount)
continue;
NamedPipeServerStream serverStream = new(pipeName, PipeDirection.InOut);
serverStream.WaitForConnection();
ConnectionCount++;
_ = Task.Run(() => HandleClient(serverStream));
}
catch (Exception ex)
{
Logger.Error($"An error occured while handling incoming pipes connections! {ex}");
}
}
private Task HandleClient(NamedPipeServerStream stream)
{
Logger.Debug("Accepted client...");
ProcessRequest(stream, stream);
stream.Dispose();
Logger.Debug("Client disconnected.");
ConnectionCount--;
return Task.CompletedTask;
}
}