孙鑫VC学习笔记:第十七讲 (三) 用命名管道实现进程间的通信

命名管道学习(简单例程)----Windows进程间通信 管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。通常我们把管道分为匿名管道和命名管道。但对于匿名管道的话,只能在本机上进程之间通信,而且只能实现本地的父子进程之间的通信,局限性太大了。而这里介绍的命名管道,就和匿名管道有些不同了,在功能上也就显得强大许多,至少其可以实现跨网络之间的进程的通信,同时其客户端既可以接收数据也可以发送数... 阅读详情
用命名管道实现进程间的通信:
 
命名管道概念:
命名管道是通过网络来完成进程间的通信,它屏蔽了地称的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。
命名管道充分利用了Windows NT和Windows2000内建的安全机制。
将命名管道作为一种网络编程方案时,它实际上建立了一个客户机/服务器通信体系,并在其中可靠的传输数据。
命名管道是围绕Windows文件系统设计的一种机制,采用“命名管道文件系统(Named Pipe File System,NPFS)”接口,因此,客户机和服务器可利用标准的Win32文件系统内核(例如ReadFile和WriteFile)来进行数据的收发。
命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它才能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。
命名管道服务器只能在Windows NT或Windows2000上创建,所以,我们无法在两台Windows95或Windows98计算机之间利用管道进行通信。不过,客户机可以是Windows95或Windows98计算机,与Windows NT或Windows2000计算机进行连接通信。
命名管道提供了两种基本通信模式:字节模式和消息模式。在字节模式中,数据以一个连续的字节流的形式,在客户机和服务器之间流动。而在消息模式中,客户机和服务器则通过一系列不连续的数据单位,进行数据的收发,每次在管道上发出一条消息后,它必须作为一条完整的消息读入。
 
---------------------------------------------------------------------------------
 
服务器进程使用 HANDLE CreateNamedPipe 创建指定命名管道的第一个实例,或现有命名管道的新的实例,并建立它的基本属性。多次调用本函数可以创建多个命名管道实例。
CreateNamedPipe
The  CreateNamedPipe function creates an instance of a named pipe and returns a handle for subsequent pipe operations. A named pipe server process uses this function either to create the first instance of a specific named pipe and establish its basic attributes or to create a new instance of an existing named pipe.
HANDLE CreateNamedPipe(
LPCTSTR
 lpName , // pointer to pipe name
DWORD  dwOpenMode ,   // pipe open mode
DWORD  dwPipeMode ,      // pipe-specific modes
DWORD  nMaxInstances ,  // maximum number of instances 对于所有实例要指定相同的值
DWORD  nOutBufferSize , // output buffer size, in bytes
DWORD  nInBufferSize ,    // input buffer size, in bytes
DWORD  nDefaultTimeOut ,  // time-out time, in milliseconds
LPSECURITY_ATTRIBUTES  lpSecurityAttributes  // pointer to security attributes
);
Windows Me/98/95: Named pipes cannot be created.
 
Parameters
lpName
Pointer to the null-terminated string that uniquely identifies the pipe. The string must have the following form  字符串必须是下面的格式:
//./pipe/pipename ( 中间的点表示本地机器, pipe 不可以改变, pipename 是管道名)
如果要与远程的机器连接,需要将中间的点设置为远程服务器的名字
The  pipename part of the name can include any character other than a backslash, including numbers and special characters. The entire pipe name string can be up to 256 characters long.  Pipe names are not case sensitive.
Pipe 不可以改变,但是大小写无所谓。
dwOpenMode
Specifies the pipe access mode (访问方式) , the overlapped mode,  the write-through mode, and the security access mode of the pipe handle.
管道的每个实例都必须要有同样的访问方式,其值可以是下面值:
Mode
PIPE_ACCESS_DUPLEX
表明管道是双向的,服务器和客户端进程都可以从管道读取或者向管道写入数据。服务器上指定该模式等价于
GENERIC_READ | GENERIC_WRITE
 
PIPE_ACCESS_INBOUND
在管道中的数据从客户端向服务器端流动,
相当于服务器端(只读)用GENERIC_READ 访问管道,
而客户端(只写)必须指定GENERIC_WRITE 访问
 
PIPE_ACCESS_OUTBOUND
与上面的值效果相反,服务器端只能写入数据,客户端只能读取数据
也可包含下面值的一个或者全部
FILE_FLAG_WRITE_THROUGH       
FILE_FLAG_OVERLAPPED
允许重叠模式。如果采用了重叠模式,那么那些读写和连接操作可能要花一段时间才能完成的函数会立即返回。
在重叠模式下,前台线程可以执行其他操作,而费时的操作可以放到后台执行。如果不是重叠模式,则读写以及连接操作直到完成之后函数才会返回。
ReadFileEx 和  WriteFileEx 函数只有在重叠模式下才会使用管道句柄;而 ReadFile, WriteFile,  ConnectNamedPipe, 以及 TransactNamedPipe 可以同步方式也可以重叠方式读写。
 
dwPipeMode  指定是创建一个字节模式还是消息模式的管道。
Specifies the type, read, and wait modes of the pipe handle.
One of the following type mode flags can be specified. The same type mode must be specified for each instance of the pipe.  管道的每一个实例都要指定同样的实例。If you specify zero, the parameter defaults to byte-type mode.
Mode
Description
PIPE_TYPE_BYTE
Data is written to the pipe as a stream
of bytes.
该模式下不能与 PIPE_READMODE_MESSAGE  一直使用。
因为对于字节模式的命名管道,数据是以字节流发送数据,没有定界符,这里如果采用PIPE_READMODE_MESSAGE 就会不知道要读多少字节。
 
PIPE_TYPE_MESSAGE
Data is written to the pipe as a stream
of messages .
这种模式可以与PIPE_READMODE_MESSAGE 或
PIPE_READMODE_BYTE  组合使用.
在消息模式下发送消息时,会有一个定界符,
如果以PIPE_READMODE_MESSAGE 模式去读的话,
通过一个定界符可以读到完整的消息。而采用PIPE_TYPE_BYTE 读方式将忽略定界符,直接读取数据。
 
 
Remarks
To create an instance of a named pipe by using  CreateNamedPipe, the user must have FILE_CREATE_PIPE_INSTANCE access to the named pipe object. If a new named pipe is being created, the access control list (ACL) from the security attributes parameter defines the discretionary access control for the named pipe.
All instances of a named pipe must specify the same pipe type (byte-type or message-type), pipe access (duplex, inbound, or outbound), instance count, and time-out value. If different values are used, this function fails and  GetLastError returns ERROR_ACCESS_DENIED.
The input and output buffer sizes are advisory. The actual buffer size reserved for each end of the named pipe is either the system default, the system minimum or maximum, or the specified size rounded up to the next allocation boundary.
The pipe server should not perform a blocking read operation until the pipe client has started. Otherwise, a race condition can occur. This typically occurs when initialization code, such as the C run-time, needs to lock and examine inherited handles.
An instance of a named pipe is always deleted when the last handle to the instance of the named pipe is closed.
Return Values
If the function succeeds, the return value is a handle to the server end of a named pipe instance.
---------------------------------------------------------------------------------
ConnectNamedPipe
允许一个命名管道服务器进程等待一个客户端进程连接到一个命名管道的实例上。
The  ConnectNamedPipe function enables a named pipe server process to wait for a client process to connect to an instance of a named pipe. A client process connects by calling either the  CreateFile or  CallNamedPipe function.
BOOL ConnectNamedPipe(
HANDLE
 hNamedPipe ,        // handle to named pipe to connect
LPOVERLAPPED  lpOverlapped  // pointer to overlapped structure
);
Parameters
hNamedPipe
[in] Handle to the server end of a named pipe instance. This handle is returned by the CreateNamedPipe function.
lpOverlapped
[in] Pointer to an  OVERLAPPED structure.
If  hNamedPipe  was opened with FILE_FLAG_OVERLAPPED, the  lpOverlapped  parameter must not be NULL.  It must point to a valid  OVERLAPPED  structure .  If  hNamedPipe  was opened with FILE_FLAG_OVERLAPPED and  lpOverlapped  is NULL, the function can incorrectly report that the connect operation is complete.
If  hNamedPipe  was created with FILE_FLAG_OVERLAPPED and  lpOverlapped  is not NULL, the OVERLAPPED structure should contain a handle to a manual-reset event object (which the server can create by using the  CreateEvent function).
If  hNamedPipe was not opened with FILE_FLAG_OVERLAPPED, the function does not return until a client is connected or an error occurs. Successful synchronous operations result in the function returning a nonzero value if a client connects after the function is called.

Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call  GetLastError.
 
如果ConnectNamedPipe返回一个零值
而ERROR_IO_PENDING= =GetLastError()表示这个操作没有失败,
可能在随后的时间内这个操作会完成
 
 
OVERLAPPED
The  OVERLAPPED structure contains information used in asynchronous input and output (I/O).
typedef struct _OVERLAPPED { // o
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED;
Members
hEvent
Handle to an event set to the signaled state when the transfer has been completed. The calling process sets this member before calling the  ReadFile,  WriteFile,  ConnectNamedPipe, or TransactNamedPipe function.
 
---------------------------------------------------------------------------------
用命名管道实现进程间通信的实例:
首先编写服务器端程序,步骤如下:
1.新建一个单文档程序NamedPipSrv
2.添加一个“命名管道”子菜单和“创建管道”、“读取数据”、“写入数据”菜单项
3.为CNamedPipeSrvView添加变量:HANDLE hPipe;
1)创建命名管道
2)创建一个事件对象
3)调用ConnectNamedPipe等待客户端连接请求到来
 
4)读取与写入操作,代码如下:
---------------------------------------------------------------------------------
接着编写客户端程序:
1.新建一个项目NamedPipeClt添加到当前工作区
2.增加“命名管道”子菜单以及“连接管道”、“读取数据”与“写入数据”两个菜单项。
3.为CNamedPipeCltView 添加变量:HANDLE hPipe;
VS2015可直接编译的孙鑫MFC教学源码包,含命名管道、邮槽、MDI等IPC实战案例 这套源码专为VS2015环境整理,涵盖孙鑫MFC课程中多个典型Windows进程间通信(IPC)实现:命名管道(NamedPipeclt)、邮槽(MailSlotclt)、多文档界面(Child)、网络客户端(NetClient)等。所有项目均基于标准MFC Doc/View/Frame架构,包含xxxDoc.cpp、xxxView.cpp、MainFrm.cpp等完整框架文件,并附带.vcxproj.filters工程过滤配置,开箱即用,无需手动调整平台或SDK版本。部分项目保留APS资源脚本,清晰展示U 阅读详情

相关推荐

命名管道用于进程间双向通信

采用windows API 匿名管道实现进程间双向通信,代码有注释

C winapi 进程间通信(Named Pipe)。

要求实现: 用命名管道的相关知识及函数,分别编写服务器进程和客户端进程程序。 要求服务器进程和客户端进程程序能够通过互相传送数据。 当服务器进程和客户端进程中的任何一端输入“end”时,结束会话。 写了半天,发现如果只用单个管道的话,非常的困难,进程总是卡住,感觉难点在于服务器进程怎么主动地像客户端进程发送信息,研究了一天还是未解决这个问题。。。 最后是写了个双管道的(每个进程都...

weixin_34208283的博客 638

命名管道通讯和API创建控件_问题代码

论坛提问贴附件代码,试下有没高手解决。帖子链接:http://bbs.youkuaiyun.com/topics/392134300

孙鑫VC学习笔记:第十七讲 用命名管道实现进程间的通信

 用命名管道实现进程间的通信: 命名管道概念:命名管道是通过网络来完成进程间的通信,它屏蔽了地称的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。命名管道充分利用了Windows NT和Windows2000内建的安全机制。将命名管道作为一种网络编程方案时,它实际上建立了一个客户机/服务器通信体系,并在其中可靠的传输数据。命名管道是围绕

遐迩思的专栏 4030

vc使用命名管道进行通信.namepipe

vc利用命名管道进行通信.zip

win10离线安装.NetFrameWork3.5出现0x800F081F解决办法。

由于公司开发环境是内网,并且安装arcgis10.2又需要.NetFrameWork3.5的环境,安装.NetFrameWork3.5的又总是报错“0x800F081F”找不到源文件。折腾了两天总算解决了。 首先我们能在网上搜索到的教程,你一定看到过这样的教程,就是使用下面的命令来进行安装。 dism /online /Enable-Feature /Featu...

AIGIS的博客 1万+

孙鑫VC学习笔记:第十七讲 (二) 用匿名管道实现进程间的通信

用匿名管道实现进程间的通信: 匿名管道只能在本地主机上,父子进程之间完成通信: 步骤:1.新建一个项目Parent 2.增加“匿名管道”子菜单以及“创建管道”、“读取数据”与“写入数据”三个菜单项。3.在CParentView 中添加两个成员句柄:HANDLE m_hWrite;HANDLE m_hRead;4.为“创建管道”菜单项实现创建管道的功能 

梦想---软件设计师 2225

EDA工具安装第一步:Synopsys Installer的配置与图形化界面使用详解

本文详细解析了EDA工具安装的关键第一步——Synopsys Installer的配置与使用。文章阐述了其作为统一部署管理器和依赖协调者的核心作用,并分步详解了如何通过图形化界面高效安装EDA工具,同时介绍了命令行批处理等进阶技巧,旨在帮助工程师快速搭建稳定的芯片设计环境。

zeta9的博客 339

孙鑫VC视频教程笔记之第十七课“进程间的通信”

  进程间通信的四种方式:Ø 剪贴板Ø 匿名管道Ø 命名管道Ø 邮槽 1.     剪贴板:剪贴板其实是系统管理的一个内存区域,当一个程序发生拷贝的时候,将是该内存区域得到填充,使用粘贴的时候是重该区域取出数据,然后显示的对应窗口上。 将指定内容赋值到剪贴板上:a.        打开剪贴板:OpenClipboard,注意:一旦打开了剪贴版,其它运用程

Roger Ge 的专栏 2168

M2DGR数据集在一些SLAM框架上的配置与运行:ORB-SLAM系列、VINS-Mono、LOAM系列、FAST-LIO系列、hdl_graph_slam

为了说明以上这些SLAM框架的测试与数据集适配,以M2DGR数据集为例进行各自的配置与运行,方便我以后适配自己的数据集,运行的SLAM框架包括:ORB-SLAM2、ORB-SLAM3、VINS-Mono、A-LOAM、LeGO-LOAM、LIO-SAM、LVI-SAM、FAST-LIO2、FAST-LIVO、Faster-LIO、hdl_graph_slam。实验基于Ubuntu20.04,其中ORB、VINS-Mono、和LOAM系列的安装参考我以前的博客,有详细的安装方法,其他的框架在后面会简单介绍一下

zardforever123的博客 1万+

eVTOL热管理:从电动车到飞行器的技术跃迁与工程挑战

热管理系统是保障各类电动设备安全、高效运行的核心技术,其基本原理是通过冷却、加热和温度控制,确保电池、电机等关键部件在最佳工况下工作。在新能源汽车领域,热管理技术已相对成熟,但面对eVTOL(电动垂直起降飞行器)这一新兴领域,其设计逻辑需从二维地面转向三维空域,应对环境温度剧烈变化、重量约束极端严苛等全新挑战。eVTOL的热管理不仅是简单的技术移植,更涉及对电池瞬时高功率散热、乘员舱快速温控及多热源耦合等复杂工程问题的系统性解决,直接关系到飞行安全与商业航程。本文聚焦于**环境温度**和**有效载荷**等关

weixin_42521276的博客 612

孙鑫VC学习笔记:第十七讲 (一) 用剪贴板实现进程间的通信

孙鑫教学视频笔记(17)进程间通信---------------------------------------------------------------------------------进程间通信的四种方式剪贴板匿名管道命名管道邮槽 --------------------------------------------------------------

梦想---软件设计师 814

EtherCAT同步模式实战:如何用TwinCAT配置DC-Synchronous模式(附时序图详解)

本文详细解析了如何在TwinCAT环境中配置EtherCAT的DC-Synchronous同步模式,实现纳秒级同步精度。通过硬件准备、参数配置和高级调优步骤,帮助工程师解决工业自动化中的同步挑战,提升运动控制性能。

gold的博客 1571

孙鑫VC学习笔记:第十七讲 用匿名管道实现进程间的通信

  用匿名管道实现进程间的通信: 匿名管道只能在本地主机上,父子进程之间完成通信: 步骤:1.新建一个项目Parent 2.增加“匿名管道”子菜单以及“创建管道”、“读取数据”与“写入数据”三个菜单项。3.在CParentView 中添加两个成员句柄:HANDLE m_hWrite;HANDLE m_hRead;4.为“创建管道”菜单项实现创建管道的

遐迩思的专栏 3616

kemeas算法继续优化——elkan kmeas算法

题记:又是凌晨3点的夜 elkan kmeans算法 在我的上一篇博客《kmeans算法性能改进_kmeans++算法+kmeans++优化算法+距离计算优化》中,在一般kmeans算法的基础上,添加了对于初始条件和距离计算更上的一些优化技巧。这篇博客聊一聊elkan算法,其实也是对于kmeans运行速度的优化算法。主要作用与kmeans的距离计算过程。 原理 假如我们已经知道任意两个样本之间的距离,再假设我们已经知道了样本1与聚类中心1之间的距离,根据三角性两边之和大于第三边,c+d>a,所以如果

铁血军的小博客 7065

STM32寄存器级电机驱动:DRV8833 H桥与PWM调速原理

电机驱动是嵌入式控制系统的核心基础能力,其本质是微控制器通过数字信号精确控制功率器件的开关时序。理解H桥电路结构、反电动势防护机制及PWM调制原理,是实现可靠直流电机控制的前提。DRV8833作为典型双H桥驱动芯片,支持快衰减与慢衰减两种PWM调速模式,分别对应不同的电流泄放路径与动态响应特性。在STM32平台上,需结合时钟树配置、GPIO复用、定时器寄存器(PSC/ARR/CCR)精确计算,将抽象的转速需求转化为可执行的硬件操作。该技术广泛应用于智能小车、机器人关节、工业定位系统等实时运动控制场景,是掌握

weixin_42613017的博客 675

进程间通讯之 命名管道

命名管道其实用的还是API函数,我估计是底层应该是操作系统 分配了一块单独的内存空间,两个程序或是多个程序都可以对这块内存进行读写。 这些所谓的管道API函数,就是我们编程人员操作这些内存空间的方法。 ××××××××××××××××××××××××××××××××××××× 用到的API函数 管道服务器首次调用CreateNamedPipe()函数时,使用nMaxInst...

ajo3603的博客 142

python实现纵横向拉开档次法 (附完整源码)

python实现纵横向拉开档次法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 778

孙鑫VC学习笔记:第十七讲 用剪贴板实现进程间的通信

  孙鑫教学视频笔记(17)进程间通信---------------------------------------------------------------------------------进程间通信的四种方式剪贴板匿名管道命名管道邮槽 --------------------------------------------------------

遐迩思的专栏 2262

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c语言 邮槽通信,进程间通信的四种方式(孙鑫VC17集)

个人理解:(1)剪切板:是系统内部维护的一个内存区域(只适用本机中进程)。是系统提供的,所以所有的进程都可以访问(如记事本,WORD)等,复制是把数据放到剪切板中,粘贴则是从剪切板中取出数据。1.OpenClipboard()打开剪切板2.EmptyClipboard(),清空剪切板,并让发送数据端的对象能拥有剪切板的拥有权5.SetClipboardData(CF_TEXT,hand),在剪切板...

weixin_42526015的博客 337

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

孙鑫VC视频教程笔记之第十七课“进程间的通信

进程间通信的四种方式:Ø 剪贴板Ø 匿名管道Ø 命名管道Ø 邮槽 1.     剪贴板:剪贴板其实是系统管理的一个内存区域,当一个程序发生拷贝的时候,将是该内存区域得到填充,使用粘贴的时候是重该区域取出数据,然后显示的对应窗

616

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

进程间通信的四种方式(孙鑫VC17集)

进程间通信的四种方式(孙鑫VC17集) (2011-01-17 15:32:45) 转载▼ 标签: 杂谈   个人理解: (1)剪切板:是系统内部维护的一个内存区域(只适用本机中进程)。是系统提供的,所以所有的进程都可以访问(如记事本,WORD)等,复制是把数据放到剪切板中,粘贴则是从剪切板中取出数据。   1.OpenCl

autumn20080101的专栏 446

孙鑫vc++ 17 进程间通信(2) 匿名管道

一、基础知识 1.匿名管道 匿名管道是一个未命名的、单向管道,通常用来在一个父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信。 二、从代码进行分析 1.父进程 //管道的创建 void CParentView::OnPipeCreate() { // TODO: Add your command handler code here

2611
上一篇: 孙鑫VC学习笔记:第十七讲 (二) 用匿名管道实现进程间的通信
下一篇: 孙鑫VC学习笔记:第十七讲 (四) 用邮槽实现进程间的通信
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值