Writing simple named pipes server in C#
I solved a little problem last night when playing with named pipes. I created named pipe that writes all output to file. Named pipe is opened for all users in machine. In this posting I will show you simple class that works as pipe server.
In .NET Framework languages we can use System.IO.Pipes namespace classes to work with named pipes. Here is my simple pipe server that writes all client output to file.
public class MyPipeServer
{
public void Run()
{
var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
var rule = new PipeAccessRule(sid, PipeAccessRights.ReadWrite,
AccessControlType.Allow);
var sec = new PipeSecurity();
sec.AddAccessRule(rule);
using (NamedPipeServerStream pipeServer = new NamedPipeServerStream
("testpipe", PipeDirection.InOut, 100,
PipeTransmissionMode.Byte, PipeOptions.None, 0, 0, sec))
{
pipeServer.WaitForConnection();
var read = 0;
var bytes = new byte[4096];
using (var file = File.Open(@"c:\tmp\myfile.dat", FileMode.Create))
while ((read = pipeServer.Read(bytes, 0, bytes.Length)) > 0)
{
file.Write(bytes, 0, read);
file.Flush();
}
}
}
}
Real-life pipe scenarios are usually more complex but this simple class is good to get things running like they should be.
Why not use WCF with NetNamedPipeBinding?