Windows进程间通信--命名管道

1、相关概述

命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制。命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信。

命名管道利用了微软网络提供者(MSNP)重定向器,因此无需涉及底层的通信协议等细节。命名管道是围绕windows文件系统设计的一种机制,采用“命名管道文件系统”(Named Pipe File System,NPFS)接口。因此,客户端和服务端均可以使用标准的WIN32文件系统API函数(如ReadFile和WriteFile)来进行数据的收发。

 命名管道的命名规范遵循“通用命名规范(UNC)” :

  \\server\pipe[\path]\name

  •   其中\\server 指定一个服务器的名字,如果是本机则用\\.表示,\\192.168.1.100表示网络上的服务器。
  •   \pipe 是一个不可变化的“硬编码”字串(不区分大小写),用于指出该文件从属于NPFS
  •   [\path]\name 则唯一标识一个命名管道的名称。

2、相关函数

2.1 服务端函数

2.1.1     CreateNamedPipe 创建命名管道


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/*************************************************************************

 Purpose :  创建命名管道,如果存在指定名字的管道,则创建该管道的一个实例

 Input   :  lpName              --  管道名称

            dwOpenMode          --  打开模式

            dwPipeMode          --  消息模式

            nMaxInstances       --  最大实例数(1-255)

            nOutBufferSize      --  输出缓冲区长度,0表示用默认设置

            nInBufferSize       --  输入缓冲区长度,0表示用默认设置

            nDefaultTimeOut     --  管道的默认超时时间(毫秒),0表示默认超时时间50毫秒

            lpSecurityAttributes--  安全描述符,如无特殊需求默认为0即可

 Return  :  成功 -- 返回管道句柄 失败 -- 返回INVALID_HANDLE_VALUE 通过GetLastError()获取错误代码

 Remark  : 

 *************************************************************************/

HANDLE WINAPI CreateNamedPipe(

  _In_      LPCTSTR lpName,

  _In_      DWORD dwOpenMode,

  _In_      DWORD dwPipeMode,

  _In_      DWORD nMaxInstances,

  _In_      DWORD nOutBufferSize,

  _In_      DWORD nInBufferSize,

  _In_      DWORD nDefaultTimeOut,

  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

dwOpenMode 为下列常数组合

常数之一:

  • PIPE_ACCESS_DUPLEX 管道是双向的
  • PIPE_ACCESS_INBOUND 数据从客户端流到服务器端
  • PIPE_ACCESS_OUTBOUND 数据从服务器端流到客户端

常数之二:

  • FILE_FLAG_WRITE_THROUGH 在网络中建立的字节型管道内,强迫数据在每次读写操作的时候通过网络传输。否则传输会缓存导致延迟
  • FILE_FLAG_OVERLAPPED 允许(但不要求)用这个管道进行异步(重叠式)操作

dwPipeMode 为下列常数组合

常数之一:

  • PIPE_TYPE_BYTE             数据作为一个连续的字节数据流写入管道
  • PIPE_TYPE_MESSAGE      数据用数据块(名为“消息”或“报文”)的形式写入管道

常数之二:

  • PIPE_READMODE_BYTE 数据以单独字节的形式从管道中读出
  • PIPE_READMODE_MESSAGE 数据以名为“消息”的数据块形式从管道中读出(要求指定PIPE_TYPE_MESSAGE)

常数之三:

  • PIPE_WAIT 同步操作在等待的时候挂起线程
  • PIPE_NOWAIT 操作立即返回。这样可为异步传输提供一种落后的实现方法,已由Win32的重叠式传输机制取代了(不推荐!)

2.1.2     ConnectNamedPipe 等待客户连接


1

2

3

4

5

6

7

8

9

10

11

/*************************************************************************

 Purpose :  等待客户连接管道

 Input   :  hNamedPipe              --  创建管道的句柄,由CreateNamedPipe成功返回

            lpOverlapped            --  打开模式

 Return  :  TRUE -- 成功 FALSE -- 失败,通过GetLastError()获取错误码

 Remark  : 

 *************************************************************************/

 BOOL WINAPI ConnectNamedPipe(

  _In_         HANDLE hNamedPipe,

  _Inout_opt_  LPOVERLAPPED lpOverlapped

);

lpOverlapped 如设为NULL,表示将线程挂起,直到一个客户同管道连接为止。否则就立即返回;此时,如管道尚未连接,客户同管道连接时就会触发lpOverlapped结构中的事件对象。随后,可用一个等待函数来监视连接。

2.2 客户端函数

2.2.1     CreateFile 连接到一个命名管道

2.2.2     WaitNamedPipe 等待管道实例是否可用


1

2

3

4

5

6

7

8

9

10

11

/*************************************************************************

 Purpose :  等待管道实例是否可用

 Input   :  lpNamedPipeName         --  管道名称

            nTimeOut                --  等待时间

 Return  :  TRUE -- 成功 FALSE -- 失败,通过GetLastError()获取错误码

 Remark  : 

 *************************************************************************/

BOOL WINAPI WaitNamedPipe(

  _In_  LPCTSTR lpNamedPipeName,

  _In_  DWORD nTimeOut

);

2.3 管道收发数据函数

2.3.1     ReadFile 从管道读出数据

2.3.2     WriteFile 写数据到管道

来自为知笔记(Wiz)

时间: 2024-12-12 20:28:32

Windows进程间通信--命名管道的相关文章

Windows进程间通信—命名管道

命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节.我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信.与Socket网络通信相比,命名管道不再需要编写身份验证的代码.将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据.命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求.而客户机只能同一个现成的命名管道服务器建立连接.命名管道服务器只能在WindowsNT或Window

windows namedPipe 命名管道clent and server

1.client: 1 #include "iostream" 2 #include "windows.h" 3 4 using namespace std; 5 void main(int argc,char* argv[]) 6 { 7 LPCTSTR Message="the pipe's message from a client to server."; 8 if(argc==2) 9 Message=argv[1]; 10 DWORD

进程间通信---命名管道

1.命名管道(Named Pipes) 是一种简单的进程间通信(IPC)机制.命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信. 命名管道利用了微软网络提供者(MSNP)重定向器,因此无需涉及底层的通信协议等细节.命名管道是围绕windows文件系统设计的一种机制,采用“命名管道文件系统”(Named Pipe File System,NPFS)接口.因此,客户端和服务端均可以使用标准的WIN32文件系统API函数(如ReadFil

进程间通信——命名管道

概念 管道一个不足之处是没有名字,因此只能用于具有亲缘关系的进程间通信,命名管道(named pipe或FIFO)解决了这一问题. FIFO提供一个路径名与之关联,以FIFO文件的形式存储于文件系统中.文件系统中路径名是全局的,各进程都可以访问,因此可以用文件系统中的路径名来标识一个IPC通道. 对文件系统来说,匿名管道(管道)是不可见的,它的作用仅限于在父进程和子进程两个进程间进行通信.而命名管道是一个可见的文件,因此,他可以用于任意两个进程间进行通信,不管这两个进程是不是父子进程,也不管这两

Linux进程间通信-命名管道

前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流的空间,只能用于父子关系的进程之间.因为父子进程的输入和输出文件描述符是一致的.命名管道是一种实际存在的FIFO文件,称作“管道文件”,用于不同进程之间,命名管道进程间打开同一个FIFO文件,进行数据传递.我们可以像普通文件一样操作FIFO文件.不同进程,引用同一个FIFO文件,进行数据传递. 2.

Linux - 进程间通信 - 命名管道

1.命名管道的特点: (1)是管道,可用于非血缘关系的进程间的通信 (2)使用命名管道时,梁金成需要用路径表示通道. (3)命名管道以FIFO的文件形式存储于文件系统中.(FIFO:总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出.) (4)命名管道是一个设备文件.(因此进程与创建FIFO的进程没有血缘关系,也可以通过访问路径进行通信.) 2.命名管道的创建:(创建命名管道的系统函数有两个:mknod和mkfifo) 头文件:(两个函数均在该头文件中) #include<sys/

Linux内核源代码情景分析-进程间通信-命名管道

建立命名管道,mknod mypipe p.命名管道存在硬盘上,而管道不是. 通过open打开这个命名管道,在内核中通过sys_open()实现,filename是"***/mypipe ". 相关部分,请参考Linux内核源代码情景分析-文件的打开. sys_open进入filp_open,然后在open_namei中调用一个函数path_walk(),根据文件的路径名在文件系统中找到代表这个文件的inode.在将磁盘上的inode读入内存时,要根据文件的类型(FIFO文件的S_IF

C#命名管道通信

原文:C#命名管道通信 C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI.发消息等.但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用.RMI又用的太多了,准备用管道通信来做消息通信. 管道通信以前在大学学过,包括匿名管道和命名管道.匿名管道只能用在父子进程之间:命名管道可以用在两个进程甚至跨服务器通信.这里给出命名管道的示例. 服务器端代码 private static void WaitData() { using (NamedPipe

c# c++通信--命名管道通信

进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c++:LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe"); c#:new NamedPipeClientStream("localhost", "mynamedpipe", PipeDirect