Windows上的多线程管道通信

一个管道实际上就是一块共享内存,它有两端,分别用于两个进程的读写。这里介绍下如何在Windows上实现线程之间的管道通信。

参考原文:Multithreaded Pipe Communication on Windows

C#多线程管道通信

创建一个管道实例:

?
1
2
3
4
5
IntPtr pipe = PipeCommunication.Pipe.CreateNamedPipe(
                 PIPE_NAME, 
                 ( uint )PipeCommunication.PipeOpenModeFlags.PIPE_ACCESS_DUPLEX, 
                 ( uint )(PipeCommunication.PipeModeFlags.PIPE_TYPE_BYTE | PipeCommunication.PipeModeFlags.PIPE_READMODE_BYTE),
                 1, 512, 512, 0, IntPtr.Zero);

等待客户端连接:

?
1
PipeCommunication.Pipe.ConnectNamedPipe(pipe,  ref  nativeOverlapped);

客户端连接管道服务端:

?
1
2
3
4
IntPtr pipe = PipeCommunication.Pipe.CreateFile(
                 PIPE_NAME,
                 ( uint )(PipeCommunication.DesireMode.GENERIC_READ | PipeCommunication.DesireMode.GENERIC_WRITE),
                 0, IntPtr.Zero, 3, 128, IntPtr.Zero);

线程之间读写数据:

服务端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PipeCommunication.Pipe.WriteFile(pipe, bytes, ( uint )( sizeof ( byte ) * bytes.Length), bytesWrittenOrRed,  ref  nativeOverlapped);
             try
             {
                 while  (value < 10)
                 {
                     //omit to Clear bytes
                     PipeCommunication.Pipe.ReadFile(pipe, bytes, ( uint )( sizeof ( byte ) * bytes.Length), bytesWrittenOrRed,  ref  nativeOverlapped);
                     value = BitConverter.ToInt32(bytes, 0);
                     value++;
                     bytes = BitConverter.GetBytes(value);
                     Thread.Sleep(300);
                     PipeCommunication.Pipe.WriteFile(pipe, bytes, ( uint )( sizeof ( byte ) * bytes.Length), bytesWrittenOrRed,  ref  nativeOverlapped);
                 }
             }

客户端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
try
             {
                 while  (value < 10)
                 {
                     //omit to Clear bytes
                     PipeCommunication.Pipe.ReadFile(pipe, bytes, ( uint )( sizeof ( byte ) * bytes.Length), bytesWrittenOrRed,  ref  nativeOverlapped);
                     value = BitConverter.ToInt32(bytes, 0);
                     value++;
                     bytes = BitConverter.GetBytes(value);
                     Thread.Sleep(300);
                     PipeCommunication.Pipe.WriteFile(pipe, bytes, ( uint )( sizeof ( byte ) * bytes.Length), bytesWrittenOrRed,  ref  nativeOverlapped);
                 }
             }

源码

https://github.com/DynamsoftRD/windows-pipe-communication

?
1
git clone https://github.com/DynamsoftRD/windows-pipe-communication.git

参考

Pipes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值