美文网首页
命名管道(C#)

命名管道(C#)

作者: 本味Vi | 来源:发表于2016-08-23 11:26 被阅读550次

基于消息传输的命名管道:

基于消息的命名管道可以传递不定长的内容,而无需传递内容长度或者结束符,上面非基于消息的传输我们都是在向管道中输入一段文本,使用WriteLine方法以回车换行作为结束符传输信息,而管道的另一端再使用ReadLine方法以读取到回车换行符作为一个消息传递结束的标志;而在使用基于消息传输时就不必这么做了

server端

class Program{

static void Main(string[] args)

{

var running = true;

while (running) // loop only for 1 client

{

PipeSecurity ps = new PipeSecurity();

//获取权限

ps.AddAccessRule(new PipeAccessRule("NETWORK SERVICE", PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));

ps.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));

ps.AddAccessRule(new PipeAccessRule("CREATOR OWNER", PipeAccessRights.FullControl, AccessControlType.Allow));

ps.AddAccessRule(new PipeAccessRule("SYSTEM", PipeAccessRights.FullControl, AccessControlType.Allow));

//using (var server = new NamedPipeServerStream("PIPE_NAME", PipeDirection.InOut))

using (var server = new NamedPipeServerStream("PIPE_NAME", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.None, 2048, 2048, ps))

{

server.WaitForConnection();

Console.WriteLine("Client connected");

using (var pipe = new PipeStream(server))

{

pipe.Send("handshake");

Console.WriteLine(pipe.Receive());

server.WaitForPipeDrain();

server.Flush();

}

}

}

Console.WriteLine("server closed");

Console.Read();

}

}

public class PipeStream : IDisposable

{

private readonly Stream _stream;

private readonly Reader _reader;

private readonly Writer _writer;

public PipeStream(Stream stream)

{

_stream = stream;

_reader = new Reader(_stream);

_writer = new Writer(_stream);

}

public string Receive()

{

return _reader.ReadLine();

}

public void Send(string message)

{

_writer.WriteLine(message);

_writer.Flush();

}

public void Dispose()

{

_reader.Dispose();

_writer.Dispose();

_stream.Dispose();

}

private class Reader : StreamReader

{

public Reader(Stream stream)

: base(stream)

{

}

protected override void Dispose(bool disposing)

{

base.Dispose(false);

}

}

private class Writer : StreamWriter

{

public Writer(Stream stream)

: base(stream)

{

}

protected override void Dispose(bool disposing)

{

base.Dispose(false);

}

}

}

client端

public class NamedPipeClient

{

public NamedPipeClient() { }

public bool Start(object value)

{

try

{

using (var client = new NamedPipeClientStream(".", "PIPE_NAME", PipeDirection.InOut))

{

client.Connect(2000);

var content = JsonConvert.SerializeObject(value);

using (var pipe = new PipeStream(client))

{

pipe.Receive();

client.WaitForPipeDrain();

pipe.Send(content);

}
}
return true;

}
catch (Exception ex)

{

LogHelper.Error(typeof(NamedPipeClient), "start failed"+ex.Message+ex.StackTrace);

}

return false;

}

}

public class PipeStream : IDisposable

{

private readonly Stream _stream;

private readonly Reader _reader;

private readonly Writer _writer;

public PipeStream(Stream stream)

{

_stream = stream;

_reader = new Reader(_stream);

_writer = new Writer(_stream);

}

public string Receive()

{

return _reader.ReadLine();

}

public void Send(string message)

{

_writer.WriteLine(message);

_writer.Flush();

}

public void Dispose()

{

_reader.Dispose();

_writer.Dispose();

_stream.Dispose();

}

private class Reader : StreamReader

{

public Reader(Stream stream)

: base(stream)

{

}

protected override void Dispose(bool disposing)

{

base.Dispose(false);

}

}

private class Writer : StreamWriter

{

public Writer(Stream stream)

: base(stream)

{

}

protected override void Dispose(bool disposing)

{

base.Dispose(false);

}

}

}

IIS的配置

http://dotnetmentors.com/hosting-wcf-service-with-nettcpbinding-or-netnamedpipebinding-in-iis.aspx

相关文章

  • 命名管道(C#)

    基于消息传输的命名管道: 基于消息的命名管道可以传递不定长的内容,而无需传递内容长度或者结束符,上面非基于消息的传...

  • C#命名管道通信

    C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI、发消息等。但在Windows下面发消息需...

  • 操作系统知识梳理

    (一)进程间的通信方式 管道中还有命名管道和非命名管道之分,非命名管道只能用于父子进程通讯,命名管道可用于非父子进...

  • Linux进程间的通信

    管道,命名管道,信号

  • Linux-C-day-3-进程间通信--FIFO/套接字

    FIFIO管道 通过命名管道通信,命名管道之间的通信读和写必须同时执行,否则就会阻塞,但是命名管道可以用于非亲缘进...

  • 第二十三天--[消息队列-共享内存]

    学习内容: 管道-命名管道(2/2)、消息队列、共享内存 收获: 管道-命名管道(2/2) 了解了打开FIFO时,...

  • windows安全初探之命名管道

    前言: 最近学校开了操作系统这门课,记录自己学习命名管道中与网络安全有关的内容。 关于命名管道: “命名管道”又名...

  • 系统编程-文件操作5

    作业 通过无名管道,让两个子进程间完成相互通信工作 命名管道 创建一个命名管道 在命名管道里插入数据 首先在一个终...

  • day05

    通过无名管道,让两个子进程间完成相互通信工作 运行结果: 命名管道和一般的管道基本相同,区别:1,命名管道在文件系...

  • System V IPC:共享内存

    共享内存原理 特点 相比管道通信,在读写数据的时候不用切内核态,使通信效率提升 相比命名管道,命名管道是内核管理的...

网友评论

      本文标题:命名管道(C#)

      本文链接:https://www.haomeiwen.com/subject/fnagsttx.html